diff options
author | Anand Jain <anand.jain@oracle.com> | 2013-02-01 15:56:23 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2013-02-01 16:55:05 +0100 |
commit | 2d2c9cef4b9f405535e072e82f54bbbcec76cc68 (patch) | |
tree | 59674b530405df27d65d6ae28b4dde2869737ab4 /btrfs-list.c | |
parent | 1999aae995dd9a5c17fa40316d618585b8b7674f (diff) |
Btrfs-progs: add function btrfs_get_subvol to get root_info of a subvol
We need a function which can get the root_info of a given
subvol. This is in preparation to add support for the show
sub-cli.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Diffstat (limited to 'btrfs-list.c')
-rw-r--r-- | btrfs-list.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/btrfs-list.c b/btrfs-list.c index 3bd305b3..247711d5 100644 --- a/btrfs-list.c +++ b/btrfs-list.c @@ -1468,6 +1468,44 @@ int btrfs_list_subvols_print(int fd, struct btrfs_list_filter_set *filter_set, return 0; } +int btrfs_get_subvol(int fd, struct root_info *the_ri) +{ + int ret = -1; + struct root_lookup rl; + struct rb_node *rbn; + struct root_info *ri; + u64 root_id = btrfs_list_get_path_rootid(fd); + + if (btrfs_list_subvols(fd, &rl)) + return 1; + + rbn = rb_first(&rl.root); + while(rbn) { + ri = rb_entry(rbn, struct root_info, rb_node); + resolve_root(&rl, ri, root_id); + if (!comp_entry_with_rootid(the_ri, ri, 0)) { + memcpy(the_ri, ri, offsetof(struct root_info, path)); + if (ri->path) + the_ri->path = strdup(ri->path); + else + the_ri->path = NULL; + if (ri->name) + the_ri->name = strdup(ri->name); + else + the_ri->name = NULL; + if (ri->full_path) + the_ri->full_path = strdup(ri->full_path); + else + the_ri->name = NULL; + ret = 0; + break; + } + rbn = rb_next(rbn); + } + __free_all_subvolumn(&rl); + return ret; +} + static int print_one_extent(int fd, struct btrfs_ioctl_search_header *sh, struct btrfs_file_extent_item *item, u64 found_gen, u64 *cache_dirid, |