Message ID | 1359350559-25671-6-git-send-email-anand.jain@oracle.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
On Mon, Jan 28, 2013 at 08:42:06PM -0800, Wang Shilong wrote: > > + 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; > [...] > > again??? > > + rbn = rb_next(rbn); > > + } Then it looks like a for (...) { } pattern with 'continue' instead of 'goto'. david -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 <anand.jain@oracle.com> > --- > 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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
here the code is correct, this base does not have [PATCH] Btrfs-progs: filter the deleted subvolumes when listing snapshots which introduced -ENOENT as a return for the resolve_root. however since we should have that. I have integrated, and made corresponding changes in the btrfs_get_subvol. Kindly find V4. Thanks, Anand On 01/29/2013 02:04 AM, David Sterba wrote: > On Mon, Jan 28, 2013 at 08:42:06PM -0800, Wang Shilong wrote: >>> + 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; >> > [...] >> >> again??? >>> + rbn = rb_next(rbn); >>> + } > > Then it looks like a for (...) { } pattern with 'continue' instead of > 'goto'. > > david -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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); + 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, 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);
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> --- btrfs-list.c | 38 ++++++++++++++++++++++++++++++++++++++ btrfs-list.h | 1 + 2 files changed, 39 insertions(+)