Message ID | f4cf625aa2a0e52f722c7e1e92dc04906e1049dc.1604014245.git.dxu@dxuuu.xyz (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] btrfs-progs: restore: Have -l display subvolume name | expand |
On Thu, Oct 29, 2020, at 4:33 PM, Daniel Xu wrote: > This commit has `btrfs restore -l ...` display subvolume names if > applicable. Before, it only listed subvolume IDs which are not very > helpful for the user. A subvolume name is much more descriptive. > > Before: > $ btrfs restore ~/scratch/btrfs/fs -l > tree key (EXTENT_TREE ROOT_ITEM 0) 30425088 level 0 > tree key (DEV_TREE ROOT_ITEM 0) 30441472 level 0 > tree key (FS_TREE ROOT_ITEM 0) 30736384 level 0 > tree key (CSUM_TREE ROOT_ITEM 0) 30474240 level 0 > tree key (UUID_TREE ROOT_ITEM 0) 30785536 level 0 > tree key (256 ROOT_ITEM 0) 30818304 level 0 > tree key (257 ROOT_ITEM 0) 30883840 level 0 > tree key (DATA_RELOC_TREE ROOT_ITEM 0) 30490624 level 0 > > After: > $ ./btrfs restore ~/scratch/btrfs/fs -l > tree key (EXTENT_TREE ROOT_ITEM 0) 30425088 level 0 > tree key (DEV_TREE ROOT_ITEM 0) 30441472 level 0 > tree key (FS_TREE ROOT_ITEM 0) 30736384 level 0 > tree key (CSUM_TREE ROOT_ITEM 0) 30474240 level 0 > tree key (UUID_TREE ROOT_ITEM 0) 30785536 level 0 > tree key (256 ROOT_ITEM 0) 30818304 level 0 subvol1 > tree key (257 ROOT_ITEM 0) 30883840 level 0 subvol2 > tree key (DATA_RELOC_TREE ROOT_ITEM 0) 30490624 level 0 > > Link: https://github.com/kdave/btrfs-progs/issues/289 > Signed-off-by: Daniel Xu <dxu@dxuuu.xyz> > --- > v1 -> v2: > * moved get_subvol_name() to common/utils.c > * check return from get_subvol_name() for errors > > cmds/restore.c | 14 +++++++++++++- > common/utils.c | 35 +++++++++++++++++++++++++++++++++++ > common/utils.h | 1 + > 3 files changed, 49 insertions(+), 1 deletion(-) > [...] Ping
On 10/29/20 7:33 PM, Daniel Xu wrote: > This commit has `btrfs restore -l ...` display subvolume names if > applicable. Before, it only listed subvolume IDs which are not very > helpful for the user. A subvolume name is much more descriptive. > > Before: > $ btrfs restore ~/scratch/btrfs/fs -l > tree key (EXTENT_TREE ROOT_ITEM 0) 30425088 level 0 > tree key (DEV_TREE ROOT_ITEM 0) 30441472 level 0 > tree key (FS_TREE ROOT_ITEM 0) 30736384 level 0 > tree key (CSUM_TREE ROOT_ITEM 0) 30474240 level 0 > tree key (UUID_TREE ROOT_ITEM 0) 30785536 level 0 > tree key (256 ROOT_ITEM 0) 30818304 level 0 > tree key (257 ROOT_ITEM 0) 30883840 level 0 > tree key (DATA_RELOC_TREE ROOT_ITEM 0) 30490624 level 0 > > After: > $ ./btrfs restore ~/scratch/btrfs/fs -l > tree key (EXTENT_TREE ROOT_ITEM 0) 30425088 level 0 > tree key (DEV_TREE ROOT_ITEM 0) 30441472 level 0 > tree key (FS_TREE ROOT_ITEM 0) 30736384 level 0 > tree key (CSUM_TREE ROOT_ITEM 0) 30474240 level 0 > tree key (UUID_TREE ROOT_ITEM 0) 30785536 level 0 > tree key (256 ROOT_ITEM 0) 30818304 level 0 subvol1 > tree key (257 ROOT_ITEM 0) 30883840 level 0 subvol2 > tree key (DATA_RELOC_TREE ROOT_ITEM 0) 30490624 level 0 > > Link: https://github.com/kdave/btrfs-progs/issues/289 > Signed-off-by: Daniel Xu <dxu@dxuuu.xyz> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Thanks, Josef
diff --git a/cmds/restore.c b/cmds/restore.c index 025e99e9..d3a25952 100644 --- a/cmds/restore.c +++ b/cmds/restore.c @@ -1206,6 +1206,7 @@ static int do_list_roots(struct btrfs_root *root) struct extent_buffer *leaf; struct btrfs_root_item ri; unsigned long offset; + char *name; int slot; int ret; @@ -1244,8 +1245,19 @@ static int do_list_roots(struct btrfs_root *root) read_extent_buffer(leaf, &ri, offset, sizeof(ri)); printf(" tree "); btrfs_print_key(&disk_key); - printf(" %Lu level %d\n", btrfs_root_bytenr(&ri), + printf(" %Lu level %d", btrfs_root_bytenr(&ri), btrfs_root_level(&ri)); + + name = get_subvol_name(root, found_key.objectid); + if (IS_ERR(name)) { + fprintf(stderr, "Failed to get subvol name: %s", + strerror(-PTR_ERR(name))); + } else if (name) { + printf(" %s", name); + free(name); + } + + printf("\n"); path.slots[0]++; } btrfs_release_path(&path); diff --git a/common/utils.c b/common/utils.c index c47ce29b..b6cb578d 100644 --- a/common/utils.c +++ b/common/utils.c @@ -1590,6 +1590,41 @@ const char *subvol_strip_mountpoint(const char *mnt, const char *full_path) return full_path + len; } +char *get_subvol_name(struct btrfs_root *tree_root, u64 subvol_id) +{ + struct btrfs_root_ref *ref; + struct btrfs_path path; + struct btrfs_key key; + int namelen; + int ret; + char *name = NULL; + + key.objectid = BTRFS_FS_TREE_OBJECTID; + key.type = BTRFS_ROOT_REF_KEY; + key.offset = subvol_id; + + btrfs_init_path(&path); + ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0); + if (ret != 0) + goto out; + + ref = btrfs_item_ptr(path.nodes[0], path.slots[0], struct btrfs_root_ref); + + namelen = btrfs_root_ref_name_len(path.nodes[0], ref); + name = malloc(sizeof(char) * namelen + 1); + if (!name) { + name = ERR_PTR(-ENOMEM); + goto out; + } + + read_extent_buffer(path.nodes[0], name, (unsigned long)(ref + 1), namelen); + name[namelen] = 0; + +out: + btrfs_release_path(&path); + return name; +} + /* Set the seed manually */ void init_rand_seed(u64 seed) { diff --git a/common/utils.h b/common/utils.h index 0413489d..6ca75fbf 100644 --- a/common/utils.h +++ b/common/utils.h @@ -99,6 +99,7 @@ int get_df(int fd, struct btrfs_ioctl_space_args **sargs_ret); int test_uuid_unique(char *fs_uuid); const char *subvol_strip_mountpoint(const char *mnt, const char *full_path); +char *get_subvol_name(struct btrfs_root *tree_root, u64 subvol_id); int find_next_key(struct btrfs_path *path, struct btrfs_key *key); const char* btrfs_group_type_str(u64 flag); const char* btrfs_group_profile_str(u64 flag);
This commit has `btrfs restore -l ...` display subvolume names if applicable. Before, it only listed subvolume IDs which are not very helpful for the user. A subvolume name is much more descriptive. Before: $ btrfs restore ~/scratch/btrfs/fs -l tree key (EXTENT_TREE ROOT_ITEM 0) 30425088 level 0 tree key (DEV_TREE ROOT_ITEM 0) 30441472 level 0 tree key (FS_TREE ROOT_ITEM 0) 30736384 level 0 tree key (CSUM_TREE ROOT_ITEM 0) 30474240 level 0 tree key (UUID_TREE ROOT_ITEM 0) 30785536 level 0 tree key (256 ROOT_ITEM 0) 30818304 level 0 tree key (257 ROOT_ITEM 0) 30883840 level 0 tree key (DATA_RELOC_TREE ROOT_ITEM 0) 30490624 level 0 After: $ ./btrfs restore ~/scratch/btrfs/fs -l tree key (EXTENT_TREE ROOT_ITEM 0) 30425088 level 0 tree key (DEV_TREE ROOT_ITEM 0) 30441472 level 0 tree key (FS_TREE ROOT_ITEM 0) 30736384 level 0 tree key (CSUM_TREE ROOT_ITEM 0) 30474240 level 0 tree key (UUID_TREE ROOT_ITEM 0) 30785536 level 0 tree key (256 ROOT_ITEM 0) 30818304 level 0 subvol1 tree key (257 ROOT_ITEM 0) 30883840 level 0 subvol2 tree key (DATA_RELOC_TREE ROOT_ITEM 0) 30490624 level 0 Link: https://github.com/kdave/btrfs-progs/issues/289 Signed-off-by: Daniel Xu <dxu@dxuuu.xyz> --- v1 -> v2: * moved get_subvol_name() to common/utils.c * check return from get_subvol_name() for errors cmds/restore.c | 14 +++++++++++++- common/utils.c | 35 +++++++++++++++++++++++++++++++++++ common/utils.h | 1 + 3 files changed, 49 insertions(+), 1 deletion(-) -- 2.26.2