Message ID | 628cc8e20d7cf460ffdf50f3916860556d6ce3e1.1720732480.git.boris@bur.io (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs-progs: btrfstune --remove-simple-quota | expand |
在 2024/7/12 06:48, Boris Burkov 写道: > Used in clear_free_space_tree, this is a totally generic operation. > It will also be used for clearing the qgroup tree from btrfstune. > > Signed-off-by: Boris Burkov <boris@bur.io> > --- > kernel-shared/disk-io.c | 39 ++++++++++++++++++++++++++++++ > kernel-shared/disk-io.h | 2 ++ > kernel-shared/free-space-tree.c | 42 ++------------------------------- > 3 files changed, 43 insertions(+), 40 deletions(-) > > diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c > index 295bd50ad..1e4c46aa0 100644 > --- a/kernel-shared/disk-io.c > +++ b/kernel-shared/disk-io.c > @@ -2342,6 +2342,45 @@ static bool is_global_root(struct btrfs_root *root) > return true; > return false; > } > + > +int btrfs_clear_tree(struct btrfs_trans_handle *trans, > + struct btrfs_root *root) The original function name clear_free_space_tree() is also shared inside kernel. Maybe you can also do a cleanup for kernel? Otherwise looks good to me. Reviewed-by: Qu Wenruo <wqu@suse.com> Thanks, Qu > +{ > + struct btrfs_path *path; > + struct btrfs_key key; > + struct extent_buffer *leaf = NULL; > + int ret; > + int nr = 0; > + > + path = btrfs_alloc_path(); > + if (!path) > + return -ENOMEM; > + > + key.objectid = 0; > + key.offset = 0; > + key.type = 0; > + > + while (1) { > + ret = btrfs_search_slot(trans, root, &key, path, -1, 1); > + if (ret < 0) > + goto out; > + leaf = path->nodes[0]; > + nr = btrfs_header_nritems(leaf); > + if (!nr) > + break; > + path->slots[0] = 0; > + ret = btrfs_del_items(trans, root, path, 0, nr); > + if (ret) > + goto out; > + > + btrfs_release_path(path); > + } > + ret = 0; > +out: > + btrfs_free_path(path); > + return ret; > +} > + > int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, > struct btrfs_root *root) > { > diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h > index 9f848635f..702a5e274 100644 > --- a/kernel-shared/disk-io.h > +++ b/kernel-shared/disk-io.h > @@ -241,6 +241,8 @@ int btrfs_fs_roots_compare_roots(const struct rb_node *node1, const struct rb_no > struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, > struct btrfs_fs_info *fs_info, > struct btrfs_key *key); > +int btrfs_clear_tree(struct btrfs_trans_handle *trans, > + struct btrfs_root *root); > int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, > struct btrfs_root *root); > struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); > diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c > index 93806ca01..08b220740 100644 > --- a/kernel-shared/free-space-tree.c > +++ b/kernel-shared/free-space-tree.c > @@ -1228,44 +1228,6 @@ out: > btrfs_abort_transaction(trans, ret); > return ret; > } > -static int clear_free_space_tree(struct btrfs_trans_handle *trans, > - struct btrfs_root *root) > -{ > - struct btrfs_path *path; > - struct btrfs_key key; > - int nr; > - int ret; > - > - path = btrfs_alloc_path(); > - if (!path) > - return -ENOMEM; > - > - key.objectid = 0; > - key.type = 0; > - key.offset = 0; > - > - while (1) { > - ret = btrfs_search_slot(trans, root, &key, path, -1, 1); > - if (ret < 0) > - goto out; > - > - nr = btrfs_header_nritems(path->nodes[0]); > - if (!nr) > - break; > - > - path->slots[0] = 0; > - ret = btrfs_del_items(trans, root, path, 0, nr); > - if (ret) > - goto out; > - > - btrfs_release_path(path); > - } > - > - ret = 0; > -out: > - btrfs_free_path(path); > - return ret; > -} > > int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) > { > @@ -1288,7 +1250,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) > > while (key.offset < fs_info->nr_global_roots) { > free_space_root = btrfs_global_root(fs_info, &key); > - ret = clear_free_space_tree(trans, free_space_root); > + ret = btrfs_clear_tree(trans, free_space_root); > if (ret) > goto abort; > key.offset++; > @@ -1299,7 +1261,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) > BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); > btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); > > - ret = clear_free_space_tree(trans, free_space_root); > + ret = btrfs_clear_tree(trans, free_space_root); > if (ret) > goto abort; >
diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 295bd50ad..1e4c46aa0 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -2342,6 +2342,45 @@ static bool is_global_root(struct btrfs_root *root) return true; return false; } + +int btrfs_clear_tree(struct btrfs_trans_handle *trans, + struct btrfs_root *root) +{ + struct btrfs_path *path; + struct btrfs_key key; + struct extent_buffer *leaf = NULL; + int ret; + int nr = 0; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + + key.objectid = 0; + key.offset = 0; + key.type = 0; + + while (1) { + ret = btrfs_search_slot(trans, root, &key, path, -1, 1); + if (ret < 0) + goto out; + leaf = path->nodes[0]; + nr = btrfs_header_nritems(leaf); + if (!nr) + break; + path->slots[0] = 0; + ret = btrfs_del_items(trans, root, path, 0, nr); + if (ret) + goto out; + + btrfs_release_path(path); + } + ret = 0; +out: + btrfs_free_path(path); + return ret; +} + int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, struct btrfs_root *root) { diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index 9f848635f..702a5e274 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -241,6 +241,8 @@ int btrfs_fs_roots_compare_roots(const struct rb_node *node1, const struct rb_no struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, struct btrfs_key *key); +int btrfs_clear_tree(struct btrfs_trans_handle *trans, + struct btrfs_root *root); int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, struct btrfs_root *root); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 93806ca01..08b220740 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1228,44 +1228,6 @@ out: btrfs_abort_transaction(trans, ret); return ret; } -static int clear_free_space_tree(struct btrfs_trans_handle *trans, - struct btrfs_root *root) -{ - struct btrfs_path *path; - struct btrfs_key key; - int nr; - int ret; - - path = btrfs_alloc_path(); - if (!path) - return -ENOMEM; - - key.objectid = 0; - key.type = 0; - key.offset = 0; - - while (1) { - ret = btrfs_search_slot(trans, root, &key, path, -1, 1); - if (ret < 0) - goto out; - - nr = btrfs_header_nritems(path->nodes[0]); - if (!nr) - break; - - path->slots[0] = 0; - ret = btrfs_del_items(trans, root, path, 0, nr); - if (ret) - goto out; - - btrfs_release_path(path); - } - - ret = 0; -out: - btrfs_free_path(path); - return ret; -} int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) { @@ -1288,7 +1250,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) while (key.offset < fs_info->nr_global_roots) { free_space_root = btrfs_global_root(fs_info, &key); - ret = clear_free_space_tree(trans, free_space_root); + ret = btrfs_clear_tree(trans, free_space_root); if (ret) goto abort; key.offset++; @@ -1299,7 +1261,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); - ret = clear_free_space_tree(trans, free_space_root); + ret = btrfs_clear_tree(trans, free_space_root); if (ret) goto abort;
Used in clear_free_space_tree, this is a totally generic operation. It will also be used for clearing the qgroup tree from btrfstune. Signed-off-by: Boris Burkov <boris@bur.io> --- kernel-shared/disk-io.c | 39 ++++++++++++++++++++++++++++++ kernel-shared/disk-io.h | 2 ++ kernel-shared/free-space-tree.c | 42 ++------------------------------- 3 files changed, 43 insertions(+), 40 deletions(-)