* [PATCH] btrfs-progs: dump-tree: Introduce --nofilename option
@ 2019-11-11 7:24 Qu Wenruo
2019-11-15 15:52 ` David Sterba
0 siblings, 1 reply; 3+ messages in thread
From: Qu Wenruo @ 2019-11-11 7:24 UTC (permalink / raw)
To: linux-btrfs
In the mail list, it's pretty common that a developer is asking dump tree
output from the reporter, it's better to protect those kind reporters by
hiding the filename if the reporter wants.
This option will skip @name/@data output for the following items:
- DIR_INDEX
- DIR_ITEM
- INODE_REF
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
Documentation/btrfs-inspect-internal.asciidoc | 3 ++
cmds/inspect-dump-tree.c | 7 +++-
ctree.h | 1 +
disk-io.c | 2 +
disk-io.h | 3 ++
print-tree.c | 40 ++++++++++++-------
6 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/Documentation/btrfs-inspect-internal.asciidoc b/Documentation/btrfs-inspect-internal.asciidoc
index 2abf044a3e99..878ab0a31887 100644
--- a/Documentation/btrfs-inspect-internal.asciidoc
+++ b/Documentation/btrfs-inspect-internal.asciidoc
@@ -99,6 +99,9 @@ intermixed in the output
+
use breadth-first search to print trees, the nodes are printed before all
leaves
+--nofilename::::
+do not print any filename of the filesystem. Useful for developer to inspect
+the filesystem while keep confidential info hiden.
--noscan::::
do not automatically scan the system for other devices from the same
filesystem, only use the devices provided as the arguments
diff --git a/cmds/inspect-dump-tree.c b/cmds/inspect-dump-tree.c
index e5efe2470111..2a7f94f4f09b 100644
--- a/cmds/inspect-dump-tree.c
+++ b/cmds/inspect-dump-tree.c
@@ -330,7 +330,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
while (1) {
int c;
enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, GETOPT_VAL_BFS,
- GETOPT_VAL_NOSCAN};
+ GETOPT_VAL_NOSCAN, GETOPT_VAL_NOFILENAME };
static const struct option long_options[] = {
{ "extents", no_argument, NULL, 'e'},
{ "device", no_argument, NULL, 'd'},
@@ -343,6 +343,8 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
{ "bfs", no_argument, NULL, GETOPT_VAL_BFS },
{ "dfs", no_argument, NULL, GETOPT_VAL_DFS },
{ "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN },
+ { "nofilename", no_argument, NULL,
+ GETOPT_VAL_NOFILENAME },
{ NULL, 0, NULL, 0 }
};
@@ -410,6 +412,9 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
case GETOPT_VAL_NOSCAN:
open_ctree_flags |= OPEN_CTREE_NO_DEVICES;
break;
+ case GETOPT_VAL_NOFILENAME:
+ open_ctree_flags |= OPEN_CTREE_DONT_PRINT_FILENAME;
+ break;
default:
usage_unknown_option(cmd, argv);
}
diff --git a/ctree.h b/ctree.h
index b2745e1e8f13..00e7747d1266 100644
--- a/ctree.h
+++ b/ctree.h
@@ -1173,6 +1173,7 @@ struct btrfs_fs_info {
unsigned int avoid_meta_chunk_alloc:1;
unsigned int avoid_sys_chunk_alloc:1;
unsigned int finalize_on_close:1;
+ unsigned int dont_print_filename:1;
int transaction_aborted;
diff --git a/disk-io.c b/disk-io.c
index c3e85c0ee06e..42f0026a6d2f 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -1190,6 +1190,8 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
fs_info->ignore_fsid_mismatch = 1;
if (flags & OPEN_CTREE_IGNORE_CHUNK_TREE_ERROR)
fs_info->ignore_chunk_tree_error = 1;
+ if (flags & OPEN_CTREE_DONT_PRINT_FILENAME)
+ fs_info->dont_print_filename = 1;
if ((flags & OPEN_CTREE_RECOVER_SUPER)
&& (flags & OPEN_CTREE_TEMPORARY_SUPER)) {
diff --git a/disk-io.h b/disk-io.h
index 545cacda9a79..fc25627c6b80 100644
--- a/disk-io.h
+++ b/disk-io.h
@@ -85,6 +85,9 @@ enum btrfs_open_ctree_flags {
* compat_ro bit).
*/
OPEN_CTREE_INVALIDATE_FST = (1U << 13),
+
+ /* For print-tree only, skip filename output */
+ OPEN_CTREE_DONT_PRINT_FILENAME = (1U << 14),
};
/*
diff --git a/print-tree.c b/print-tree.c
index f70ce6844a7e..e035cec9e110 100644
--- a/print-tree.c
+++ b/print-tree.c
@@ -67,16 +67,20 @@ static void print_dir_item(struct extent_buffer *eb, u32 size,
name_len = btrfs_dir_name_len(eb, di);
data_len = btrfs_dir_data_len(eb, di);
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
- read_extent_buffer(eb, namebuf, (unsigned long)(di + 1), len);
printf("\t\ttransid %llu data_len %u name_len %u\n",
btrfs_dir_transid(eb, di),
data_len, name_len);
- printf("\t\tname: %.*s\n", len, namebuf);
- if (data_len) {
- len = (data_len <= sizeof(namebuf))? data_len: sizeof(namebuf);
+ if (!(eb->fs_info && eb->fs_info->dont_print_filename)) {
read_extent_buffer(eb, namebuf,
- (unsigned long)(di + 1) + name_len, len);
- printf("\t\tdata %.*s\n", len, namebuf);
+ (unsigned long)(di + 1), len);
+ printf("\t\tname: %.*s\n", len, namebuf);
+ if (data_len) {
+ len = (data_len <= sizeof(namebuf))? data_len:
+ sizeof(namebuf);
+ read_extent_buffer(eb, namebuf,
+ (unsigned long)(di + 1) + name_len, len);
+ printf("\t\tdata %.*s\n", len, namebuf);
+ }
}
len = sizeof(*di) + name_len + data_len;
di = (struct btrfs_dir_item *)((char *)di + len);
@@ -101,12 +105,16 @@ static void print_inode_extref_item(struct extent_buffer *eb, u32 size,
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
- read_extent_buffer(eb, namebuf, (unsigned long)(extref->name), len);
-
- printf("\t\tindex %llu parent %llu namelen %u name: %.*s\n",
- (unsigned long long)index,
- (unsigned long long)parent_objid,
- name_len, len, namebuf);
+ if (eb->fs_info && eb->fs_info->dont_print_filename) {
+ printf("\t\tindex %llu [arent %llu namelen %u\n",
+ index, parent_objid, name_len);
+ } else {
+ read_extent_buffer(eb, namebuf,
+ (unsigned long)extref->name, len);
+ printf(
+ "\t\tindex %llu parent %llu namelen %u name: %.*s\n",
+ index, parent_objid, name_len, len, namebuf);
+ }
len = sizeof(*extref) + name_len;
extref = (struct btrfs_inode_extref *)((char *)extref + len);
@@ -127,9 +135,13 @@ static void print_inode_ref_item(struct extent_buffer *eb, u32 size,
name_len = btrfs_inode_ref_name_len(eb, ref);
index = btrfs_inode_ref_index(eb, ref);
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
- read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
- printf("\t\tindex %llu namelen %u name: %.*s\n",
+ if (eb->fs_info && eb->fs_info->dont_print_filename) {
+ printf("\t\tindex %llu namelen %u\n", index, name_len);
+ } else {
+ read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
+ printf("\t\tindex %llu namelen %u name: %.*s\n",
(unsigned long long)index, name_len, len, namebuf);
+ }
len = sizeof(*ref) + name_len;
ref = (struct btrfs_inode_ref *)((char *)ref + len);
cur += len;
--
2.24.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] btrfs-progs: dump-tree: Introduce --nofilename option
2019-11-11 7:24 [PATCH] btrfs-progs: dump-tree: Introduce --nofilename option Qu Wenruo
@ 2019-11-15 15:52 ` David Sterba
2020-03-04 15:35 ` David Sterba
0 siblings, 1 reply; 3+ messages in thread
From: David Sterba @ 2019-11-15 15:52 UTC (permalink / raw)
To: Qu Wenruo; +Cc: linux-btrfs
On Mon, Nov 11, 2019 at 03:24:35PM +0800, Qu Wenruo wrote:
> In the mail list, it's pretty common that a developer is asking dump tree
> output from the reporter, it's better to protect those kind reporters by
> hiding the filename if the reporter wants.
That's useful. Can we name it '--hide-filenames' ? You describe it in
the text and I think this expresses what it does and hopefully will be
clear to random users what the options does.
> This option will skip @name/@data output for the following items:
> - DIR_INDEX
> - DIR_ITEM
> - INODE_REF
>
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
> Documentation/btrfs-inspect-internal.asciidoc | 3 ++
> cmds/inspect-dump-tree.c | 7 +++-
> ctree.h | 1 +
> disk-io.c | 2 +
> disk-io.h | 3 ++
> print-tree.c | 40 ++++++++++++-------
> 6 files changed, 41 insertions(+), 15 deletions(-)
>
> diff --git a/Documentation/btrfs-inspect-internal.asciidoc b/Documentation/btrfs-inspect-internal.asciidoc
> index 2abf044a3e99..878ab0a31887 100644
> --- a/Documentation/btrfs-inspect-internal.asciidoc
> +++ b/Documentation/btrfs-inspect-internal.asciidoc
> @@ -99,6 +99,9 @@ intermixed in the output
> +
> use breadth-first search to print trees, the nodes are printed before all
> leaves
> +--nofilename::::
> +do not print any filename of the filesystem. Useful for developer to inspect
> +the filesystem while keep confidential info hiden.
> --noscan::::
> do not automatically scan the system for other devices from the same
> filesystem, only use the devices provided as the arguments
> diff --git a/cmds/inspect-dump-tree.c b/cmds/inspect-dump-tree.c
> index e5efe2470111..2a7f94f4f09b 100644
> --- a/cmds/inspect-dump-tree.c
> +++ b/cmds/inspect-dump-tree.c
> @@ -330,7 +330,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
> while (1) {
> int c;
> enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, GETOPT_VAL_BFS,
> - GETOPT_VAL_NOSCAN};
> + GETOPT_VAL_NOSCAN, GETOPT_VAL_NOFILENAME };
> static const struct option long_options[] = {
> { "extents", no_argument, NULL, 'e'},
> { "device", no_argument, NULL, 'd'},
> @@ -343,6 +343,8 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
> { "bfs", no_argument, NULL, GETOPT_VAL_BFS },
> { "dfs", no_argument, NULL, GETOPT_VAL_DFS },
> { "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN },
> + { "nofilename", no_argument, NULL,
> + GETOPT_VAL_NOFILENAME },
> { NULL, 0, NULL, 0 }
> };
>
> @@ -410,6 +412,9 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
> case GETOPT_VAL_NOSCAN:
> open_ctree_flags |= OPEN_CTREE_NO_DEVICES;
> break;
> + case GETOPT_VAL_NOFILENAME:
> + open_ctree_flags |= OPEN_CTREE_DONT_PRINT_FILENAME;
> + break;
> default:
> usage_unknown_option(cmd, argv);
> }
> diff --git a/ctree.h b/ctree.h
> index b2745e1e8f13..00e7747d1266 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -1173,6 +1173,7 @@ struct btrfs_fs_info {
> unsigned int avoid_meta_chunk_alloc:1;
> unsigned int avoid_sys_chunk_alloc:1;
> unsigned int finalize_on_close:1;
> + unsigned int dont_print_filename:1;
>
> int transaction_aborted;
>
> diff --git a/disk-io.c b/disk-io.c
> index c3e85c0ee06e..42f0026a6d2f 100644
> --- a/disk-io.c
> +++ b/disk-io.c
> @@ -1190,6 +1190,8 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
> fs_info->ignore_fsid_mismatch = 1;
> if (flags & OPEN_CTREE_IGNORE_CHUNK_TREE_ERROR)
> fs_info->ignore_chunk_tree_error = 1;
> + if (flags & OPEN_CTREE_DONT_PRINT_FILENAME)
> + fs_info->dont_print_filename = 1;
>
> if ((flags & OPEN_CTREE_RECOVER_SUPER)
> && (flags & OPEN_CTREE_TEMPORARY_SUPER)) {
> diff --git a/disk-io.h b/disk-io.h
> index 545cacda9a79..fc25627c6b80 100644
> --- a/disk-io.h
> +++ b/disk-io.h
> @@ -85,6 +85,9 @@ enum btrfs_open_ctree_flags {
> * compat_ro bit).
> */
> OPEN_CTREE_INVALIDATE_FST = (1U << 13),
> +
> + /* For print-tree only, skip filename output */
> + OPEN_CTREE_DONT_PRINT_FILENAME = (1U << 14),
I don't think you need to make it a global open_ctree flag, just set
fs_info->dont_print_filenames in cmds/inspect-dump-tree.c, that's the
only place where we care about it.
> };
>
> /*
> diff --git a/print-tree.c b/print-tree.c
> index f70ce6844a7e..e035cec9e110 100644
> --- a/print-tree.c
> +++ b/print-tree.c
> @@ -67,16 +67,20 @@ static void print_dir_item(struct extent_buffer *eb, u32 size,
> name_len = btrfs_dir_name_len(eb, di);
> data_len = btrfs_dir_data_len(eb, di);
> len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
> - read_extent_buffer(eb, namebuf, (unsigned long)(di + 1), len);
> printf("\t\ttransid %llu data_len %u name_len %u\n",
> btrfs_dir_transid(eb, di),
> data_len, name_len);
> - printf("\t\tname: %.*s\n", len, namebuf);
> - if (data_len) {
> - len = (data_len <= sizeof(namebuf))? data_len: sizeof(namebuf);
> + if (!(eb->fs_info && eb->fs_info->dont_print_filename)) {
> read_extent_buffer(eb, namebuf,
> - (unsigned long)(di + 1) + name_len, len);
> - printf("\t\tdata %.*s\n", len, namebuf);
> + (unsigned long)(di + 1), len);
> + printf("\t\tname: %.*s\n", len, namebuf);
> + if (data_len) {
> + len = (data_len <= sizeof(namebuf))? data_len:
> + sizeof(namebuf);
> + read_extent_buffer(eb, namebuf,
> + (unsigned long)(di + 1) + name_len, len);
> + printf("\t\tdata %.*s\n", len, namebuf);
> + }
Idea to consider: print a placeholder, like "name: HIDDEN", to keep the
format of dump the same. It can also simplify the code.
> }
> len = sizeof(*di) + name_len + data_len;
> di = (struct btrfs_dir_item *)((char *)di + len);
> @@ -101,12 +105,16 @@ static void print_inode_extref_item(struct extent_buffer *eb, u32 size,
>
> len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
>
> - read_extent_buffer(eb, namebuf, (unsigned long)(extref->name), len);
> -
> - printf("\t\tindex %llu parent %llu namelen %u name: %.*s\n",
> - (unsigned long long)index,
> - (unsigned long long)parent_objid,
> - name_len, len, namebuf);
> + if (eb->fs_info && eb->fs_info->dont_print_filename) {
> + printf("\t\tindex %llu [arent %llu namelen %u\n",
> + index, parent_objid, name_len);
> + } else {
> + read_extent_buffer(eb, namebuf,
> + (unsigned long)extref->name, len);
> + printf(
> + "\t\tindex %llu parent %llu namelen %u name: %.*s\n",
> + index, parent_objid, name_len, len, namebuf);
> + }
>
> len = sizeof(*extref) + name_len;
> extref = (struct btrfs_inode_extref *)((char *)extref + len);
> @@ -127,9 +135,13 @@ static void print_inode_ref_item(struct extent_buffer *eb, u32 size,
> name_len = btrfs_inode_ref_name_len(eb, ref);
> index = btrfs_inode_ref_index(eb, ref);
> len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
> - read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
> - printf("\t\tindex %llu namelen %u name: %.*s\n",
> + if (eb->fs_info && eb->fs_info->dont_print_filename) {
> + printf("\t\tindex %llu namelen %u\n", index, name_len);
> + } else {
> + read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
> + printf("\t\tindex %llu namelen %u name: %.*s\n",
> (unsigned long long)index, name_len, len, namebuf);
> + }
> len = sizeof(*ref) + name_len;
> ref = (struct btrfs_inode_ref *)((char *)ref + len);
> cur += len;
> --
> 2.24.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] btrfs-progs: dump-tree: Introduce --nofilename option
2019-11-15 15:52 ` David Sterba
@ 2020-03-04 15:35 ` David Sterba
0 siblings, 0 replies; 3+ messages in thread
From: David Sterba @ 2020-03-04 15:35 UTC (permalink / raw)
To: dsterba, Qu Wenruo, linux-btrfs
On Fri, Nov 15, 2019 at 04:52:07PM +0100, David Sterba wrote:
> On Mon, Nov 11, 2019 at 03:24:35PM +0800, Qu Wenruo wrote:
> > In the mail list, it's pretty common that a developer is asking dump tree
> > output from the reporter, it's better to protect those kind reporters by
> > hiding the filename if the reporter wants.
>
> That's useful. Can we name it '--hide-filenames' ? You describe it in
> the text and I think this expresses what it does and hopefully will be
> clear to random users what the options does.
> Idea to consider: print a placeholder, like "name: HIDDEN", to keep the
> format of dump the same. It can also simplify the code.
So with the above implemented, the option is now --hide-names and prints
HIDDEN instead of various names.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-03-04 15:36 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-11 7:24 [PATCH] btrfs-progs: dump-tree: Introduce --nofilename option Qu Wenruo
2019-11-15 15:52 ` David Sterba
2020-03-04 15:35 ` David Sterba
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).