diff mbox series

[1/3] btrfs-progs: add a helper for clearing all the items in a tree

Message ID 628cc8e20d7cf460ffdf50f3916860556d6ce3e1.1720732480.git.boris@bur.io (mailing list archive)
State New, archived
Headers show
Series btrfs-progs: btrfstune --remove-simple-quota | expand

Commit Message

Boris Burkov July 11, 2024, 9:18 p.m. UTC
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(-)

Comments

Qu Wenruo July 11, 2024, 10:32 p.m. UTC | #1
在 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 mbox series

Patch

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;