path: root/send-utils.c
diff options
authorMiao Xie <>2012-09-18 14:51:49 +0800
committerroot <root@localhost.localdomain>2012-10-04 16:26:32 -0400
commit162df1e30c7c0492ae9fb551d74452e643f5fea2 (patch)
treee57d3bb0c42efd150124a37d8adbe7632f0c649b /send-utils.c
parent7cb1cf754229062ea412aa651a0f750ce42c113d (diff)
Btrfs-progs: restructure list_subvolumes
The current code of list_subvols() has very bad scalability, if we want to add new filter conditions or new sort methods, we have to modify lots of code. Beside that, the most code of list_snapshots() is similar to list_subvols(), So I restructure list_subvols(), and split the subvolume filter function, the subvolume sort function and the output function from list_subvols(). In order to implement it, we defined some importtant structures: struct btrfs_list_filter { btrfs_list_filter_func filter_func; void *data; }; struct btrfs_list_comparer { btrfs_list_comp_func comp_func; int is_descending; }; struct { char *name; char *column_name; int need_print; } btrfs_list_columns[]; If we want to add a new filter condition, we can choose a suitable filter function, or implement a new filter function[1], and add it into a set of the filters, and then pass the filter set into list_subvols(). We also can mix several filters (just add those filters into the set, and pass the set into list_subvols()) if the users specify two or more filter conditions. The subvolume sort function is similar to the subvolume filter function. The differentiation is the order of comparers in the array which is passed into list_subvols() show us the priority of the sort methods. The output function is different with the above two functions, we define a array to manage all the columns that can be outputed, and use a member variant (->need_print) to control the output of the relative column. Some columns are outputed by default. But we can change it according to the requirement of the users. After appling this patch, we needn't implement a independent list_snapshots() function, just pass a filter function which is used to identify the snapshot into list_subvols(). [1]: If we implement new filter functions or compare functions, we must add them into the array all_filter_funcs or the array all_comp_funcs, and modify the relative enum variants(btrfs_list_filter_enum, btrfs_list_comp_enum). Signed-off-by: Miao Xie <>
Diffstat (limited to 'send-utils.c')
1 files changed, 2 insertions, 1 deletions
diff --git a/send-utils.c b/send-utils.c
index 096fa02e..fcde5c28 100644
--- a/send-utils.c
+++ b/send-utils.c
@@ -244,7 +244,8 @@ int subvol_uuid_search_init(int mnt_fd, struct subvol_uuid_search *s)
if (!root_item_valid)
goto skip;
- path = path_for_root(mnt_fd, sh->objectid);
+ path = btrfs_list_path_for_root(mnt_fd,
+ sh->objectid);
if (!path)
path = strdup("");
if (IS_ERR(path)) {