Hi,
> 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 <[email protected]>
> ---
> btrfs-list.c | 38 ++++++++++++++++++++++++++++++++++++++
> btrfs-list.h | 1 +
> 2 files changed, 39 insertions(+)
>
> diff --git a/btrfs-list.c b/btrfs-list.c
> index 909d814..0ee13b6 100644
> --- a/btrfs-list.c
> +++ b/btrfs-list.c
> @@ -1453,6 +1453,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);
Here subvolume/snapshot deletion may happen,add a check here...
if resolve_root return -ENOENT..it means deletion happens...
ret = reslove_root(&rl, ri, root_id);
if (ret)
goto again;
> + 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;
> + }
again:
> + 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,
> diff --git a/btrfs-list.h b/btrfs-list.h
> index 3b7b680..580d4d1 100644
> --- a/btrfs-list.h
> +++ b/btrfs-list.h
> @@ -151,3 +151,4 @@ int btrfs_list_find_updated_files(int fd, u64 root_id,
> u64 oldest_gen);
> int btrfs_list_get_default_subvolume(int fd, u64 *default_id);
> char *btrfs_list_path_for_root(int fd, u64 root);
> u64 btrfs_list_get_path_rootid(int fd);
> +int btrfs_get_subvol(int fd, struct root_info *the_ri);
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html