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

Reply via email to