btrfs-progs: dump-tree: rename to option to --hide-names
Previously, no filenames/xattrs would be printed with --nofilename, but to keep the format of dump, print a placeholder instead of all names. This is: * directory entries (files, directories, subvolumes) * default subvolume * extended attributes (name, value) * hardlink names if stored inside another item Note that lengths are not hidden because they can be calculated from the item size anyway. Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
4d4e7d7c9f
commit
d028b3998e
|
@ -100,9 +100,20 @@ intermixed in the output
|
||||||
+
|
+
|
||||||
use breadth-first search to print trees, the nodes are printed before all
|
use breadth-first search to print trees, the nodes are printed before all
|
||||||
leaves
|
leaves
|
||||||
--nofilename::::
|
+
|
||||||
do not print any filename of the filesystem. Useful for developer to inspect
|
--hide-names::::
|
||||||
the filesystem while keep confidential info hiden.
|
print a placeholder 'HIDDEN' instead of various names, useful for developers to
|
||||||
|
inspect the dump while keeping potentially sensitive information hidden
|
||||||
|
+
|
||||||
|
This is:
|
||||||
|
[options="compact"]
|
||||||
|
* directory entries (files, directories, subvolumes)
|
||||||
|
* default subvolume
|
||||||
|
* extended attributes (name, value)
|
||||||
|
* hardlink names (if stored inside another item or as extended references in standalone items)
|
||||||
|
+
|
||||||
|
NOTE: lengths are not hidden because they can be calculated from the item size anyway.
|
||||||
|
+
|
||||||
--noscan::::
|
--noscan::::
|
||||||
do not automatically scan the system for other devices from the same
|
do not automatically scan the system for other devices from the same
|
||||||
filesystem, only use the devices provided as the arguments
|
filesystem, only use the devices provided as the arguments
|
||||||
|
|
|
@ -206,6 +206,7 @@ static const char * const cmd_inspect_dump_tree_usage[] = {
|
||||||
"--noscan do not scan the devices from the filesystem, use only the listed ones",
|
"--noscan do not scan the devices from the filesystem, use only the listed ones",
|
||||||
"--bfs breadth-first traversal of the trees, print nodes, then leaves (default)",
|
"--bfs breadth-first traversal of the trees, print nodes, then leaves (default)",
|
||||||
"--dfs depth-first traversal of the trees",
|
"--dfs depth-first traversal of the trees",
|
||||||
|
"--hide-names hide filenames/subvolume/xattrs and other name references",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -330,7 +331,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
|
||||||
while (1) {
|
while (1) {
|
||||||
int c;
|
int c;
|
||||||
enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, GETOPT_VAL_BFS,
|
enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, GETOPT_VAL_BFS,
|
||||||
GETOPT_VAL_NOSCAN, GETOPT_VAL_NOFILENAME };
|
GETOPT_VAL_NOSCAN, GETOPT_VAL_HIDE_NAMES };
|
||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
{ "extents", no_argument, NULL, 'e'},
|
{ "extents", no_argument, NULL, 'e'},
|
||||||
{ "device", no_argument, NULL, 'd'},
|
{ "device", no_argument, NULL, 'd'},
|
||||||
|
@ -343,8 +344,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
|
||||||
{ "bfs", no_argument, NULL, GETOPT_VAL_BFS },
|
{ "bfs", no_argument, NULL, GETOPT_VAL_BFS },
|
||||||
{ "dfs", no_argument, NULL, GETOPT_VAL_DFS },
|
{ "dfs", no_argument, NULL, GETOPT_VAL_DFS },
|
||||||
{ "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN },
|
{ "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN },
|
||||||
{ "nofilename", no_argument, NULL,
|
{ "hide-names", no_argument, NULL, GETOPT_VAL_HIDE_NAMES },
|
||||||
GETOPT_VAL_NOFILENAME },
|
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -412,8 +412,8 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
|
||||||
case GETOPT_VAL_NOSCAN:
|
case GETOPT_VAL_NOSCAN:
|
||||||
open_ctree_flags |= OPEN_CTREE_NO_DEVICES;
|
open_ctree_flags |= OPEN_CTREE_NO_DEVICES;
|
||||||
break;
|
break;
|
||||||
case GETOPT_VAL_NOFILENAME:
|
case GETOPT_VAL_HIDE_NAMES:
|
||||||
open_ctree_flags |= OPEN_CTREE_DONT_PRINT_FILENAME;
|
open_ctree_flags |= OPEN_CTREE_HIDE_NAMES;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage_unknown_option(cmd, argv);
|
usage_unknown_option(cmd, argv);
|
||||||
|
|
2
ctree.h
2
ctree.h
|
@ -1193,7 +1193,7 @@ struct btrfs_fs_info {
|
||||||
unsigned int avoid_meta_chunk_alloc:1;
|
unsigned int avoid_meta_chunk_alloc:1;
|
||||||
unsigned int avoid_sys_chunk_alloc:1;
|
unsigned int avoid_sys_chunk_alloc:1;
|
||||||
unsigned int finalize_on_close:1;
|
unsigned int finalize_on_close:1;
|
||||||
unsigned int dont_print_filename:1;
|
unsigned int hide_names:1;
|
||||||
|
|
||||||
int transaction_aborted;
|
int transaction_aborted;
|
||||||
|
|
||||||
|
|
|
@ -1218,8 +1218,8 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
|
||||||
fs_info->ignore_fsid_mismatch = 1;
|
fs_info->ignore_fsid_mismatch = 1;
|
||||||
if (flags & OPEN_CTREE_IGNORE_CHUNK_TREE_ERROR)
|
if (flags & OPEN_CTREE_IGNORE_CHUNK_TREE_ERROR)
|
||||||
fs_info->ignore_chunk_tree_error = 1;
|
fs_info->ignore_chunk_tree_error = 1;
|
||||||
if (flags & OPEN_CTREE_DONT_PRINT_FILENAME)
|
if (flags & OPEN_CTREE_HIDE_NAMES)
|
||||||
fs_info->dont_print_filename = 1;
|
fs_info->hide_names = 1;
|
||||||
|
|
||||||
if ((flags & OPEN_CTREE_RECOVER_SUPER)
|
if ((flags & OPEN_CTREE_RECOVER_SUPER)
|
||||||
&& (flags & OPEN_CTREE_TEMPORARY_SUPER)) {
|
&& (flags & OPEN_CTREE_TEMPORARY_SUPER)) {
|
||||||
|
|
|
@ -86,8 +86,8 @@ enum btrfs_open_ctree_flags {
|
||||||
*/
|
*/
|
||||||
OPEN_CTREE_INVALIDATE_FST = (1U << 13),
|
OPEN_CTREE_INVALIDATE_FST = (1U << 13),
|
||||||
|
|
||||||
/* For print-tree only, skip filename output */
|
/* For print-tree, print HIDDEN instead of filenames/xattrs/refs */
|
||||||
OPEN_CTREE_DONT_PRINT_FILENAME = (1U << 14),
|
OPEN_CTREE_HIDE_NAMES = (1U << 14),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
31
print-tree.c
31
print-tree.c
|
@ -70,13 +70,20 @@ static void print_dir_item(struct extent_buffer *eb, u32 size,
|
||||||
printf("\t\ttransid %llu data_len %u name_len %u\n",
|
printf("\t\ttransid %llu data_len %u name_len %u\n",
|
||||||
btrfs_dir_transid(eb, di),
|
btrfs_dir_transid(eb, di),
|
||||||
data_len, name_len);
|
data_len, name_len);
|
||||||
if (!(eb->fs_info && eb->fs_info->dont_print_filename)) {
|
if (eb->fs_info && eb->fs_info->hide_names) {
|
||||||
|
printf("\t\tname: HIDDEN\n");
|
||||||
|
} else {
|
||||||
read_extent_buffer(eb, namebuf,
|
read_extent_buffer(eb, namebuf,
|
||||||
(unsigned long)(di + 1), len);
|
(unsigned long)(di + 1), len);
|
||||||
printf("\t\tname: %.*s\n", len, namebuf);
|
printf("\t\tname: %.*s\n", len, namebuf);
|
||||||
|
}
|
||||||
|
|
||||||
if (data_len) {
|
if (data_len) {
|
||||||
len = (data_len <= sizeof(namebuf)) ? data_len :
|
len = (data_len <= sizeof(namebuf)) ? data_len :
|
||||||
sizeof(namebuf);
|
sizeof(namebuf);
|
||||||
|
if (eb->fs_info && eb->fs_info->hide_names) {
|
||||||
|
printf("\t\tdata HIDDEN\n");
|
||||||
|
} else {
|
||||||
read_extent_buffer(eb, namebuf,
|
read_extent_buffer(eb, namebuf,
|
||||||
(unsigned long)(di + 1) + name_len, len);
|
(unsigned long)(di + 1) + name_len, len);
|
||||||
printf("\t\tdata %.*s\n", len, namebuf);
|
printf("\t\tdata %.*s\n", len, namebuf);
|
||||||
|
@ -105,15 +112,14 @@ static void print_inode_extref_item(struct extent_buffer *eb, u32 size,
|
||||||
|
|
||||||
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
|
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
|
||||||
|
|
||||||
if (eb->fs_info && eb->fs_info->dont_print_filename) {
|
printf("\t\tindex %llu parent %llu namelen %u ",
|
||||||
printf("\t\tindex %llu [arent %llu namelen %u\n",
|
|
||||||
index, parent_objid, name_len);
|
index, parent_objid, name_len);
|
||||||
|
if (eb->fs_info && eb->fs_info->hide_names) {
|
||||||
|
printf("name: HIDDEN\n");
|
||||||
} else {
|
} else {
|
||||||
read_extent_buffer(eb, namebuf,
|
read_extent_buffer(eb, namebuf,
|
||||||
(unsigned long)extref->name, len);
|
(unsigned long)extref->name, len);
|
||||||
printf(
|
printf("name: %.*s\n", len, namebuf);
|
||||||
"\t\tindex %llu parent %llu namelen %u name: %.*s\n",
|
|
||||||
index, parent_objid, name_len, len, namebuf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
len = sizeof(*extref) + name_len;
|
len = sizeof(*extref) + name_len;
|
||||||
|
@ -135,12 +141,15 @@ static void print_inode_ref_item(struct extent_buffer *eb, u32 size,
|
||||||
name_len = btrfs_inode_ref_name_len(eb, ref);
|
name_len = btrfs_inode_ref_name_len(eb, ref);
|
||||||
index = btrfs_inode_ref_index(eb, ref);
|
index = btrfs_inode_ref_index(eb, ref);
|
||||||
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
|
len = (name_len <= sizeof(namebuf))? name_len: sizeof(namebuf);
|
||||||
if (eb->fs_info && eb->fs_info->dont_print_filename) {
|
|
||||||
printf("\t\tindex %llu namelen %u\n", index, name_len);
|
printf("\t\tindex %llu namelen %u ",
|
||||||
|
(unsigned long long)index, name_len);
|
||||||
|
if (eb->fs_info && eb->fs_info->hide_names) {
|
||||||
|
printf("name: HIDDEN\n");
|
||||||
} else {
|
} else {
|
||||||
read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
|
read_extent_buffer(eb, namebuf,
|
||||||
printf("\t\tindex %llu namelen %u name: %.*s\n",
|
(unsigned long)(ref + 1), len);
|
||||||
(unsigned long long)index, name_len, len, namebuf);
|
printf("name: %.*s\n", len, namebuf);
|
||||||
}
|
}
|
||||||
len = sizeof(*ref) + name_len;
|
len = sizeof(*ref) + name_len;
|
||||||
ref = (struct btrfs_inode_ref *)((char *)ref + len);
|
ref = (struct btrfs_inode_ref *)((char *)ref + len);
|
||||||
|
|
Loading…
Reference in New Issue