summaryrefslogtreecommitdiff
path: root/btrfs-list.c
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2013-02-01 15:56:23 +0800
committerDavid Sterba <dsterba@suse.cz>2013-02-01 16:55:05 +0100
commit2d2c9cef4b9f405535e072e82f54bbbcec76cc68 (patch)
tree59674b530405df27d65d6ae28b4dde2869737ab4 /btrfs-list.c
parent1999aae995dd9a5c17fa40316d618585b8b7674f (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.c38
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,