From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pb0-f52.google.com ([209.85.160.52]:40819 "EHLO mail-pb0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751407Ab3A1MkK (ORCPT ); Mon, 28 Jan 2013 07:40:10 -0500 Received: by mail-pb0-f52.google.com with SMTP id uo5so1460725pbc.39 for ; Mon, 28 Jan 2013 04:40:10 -0800 (PST) Message-ID: <5107531E.8060708@gmail.com> Date: Mon, 28 Jan 2013 20:42:06 -0800 From: Wang Shilong MIME-Version: 1.0 To: Anand Jain CC: linux-btrfs@vger.kernel.org, dsterba@suse.cz, gene@czarc.net, miaox@cn.fujitsu.com Subject: Re: [PATCH 05/10] Btrfs-progs: add function btrfs_get_subvol to get root_info of a subvol References: <1358928771-31960-1-git-send-email-anand.jain@oracle.com> <1359350559-25671-1-git-send-email-anand.jain@oracle.com> <1359350559-25671-6-git-send-email-anand.jain@oracle.com> In-Reply-To: <1359350559-25671-6-git-send-email-anand.jain@oracle.com> Content-Type: text/plain; charset=UTF-8 Sender: linux-btrfs-owner@vger.kernel.org List-ID: 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 > --- > 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);