diff mbox series

[2/7] btrfs: backref: Use btrfs_find_item in btrfs_find_one_extref

Message ID 20210804184854.10696-3-mpdesouza@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: Use btrfs_find_item whenever possible | expand

Commit Message

Marcos Paulo de Souza Aug. 4, 2021, 6:48 p.m. UTC
btrfs_find_one_extref is using btrfs_search_slot and iterating over the
slots, but in reality it only desires to find an extref, since there is
a break without any condition at the end of the while clause.

The function can be dramatically simplified by using btrfs_find_item, which
calls the btrfs_search_slot, compares if the objectid and type found
are the same of those passed as search key, and calls
btrfs_item_key_to_cpu if no error was found.

No functional changes.

Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>
---
 fs/btrfs/backref.c | 64 ++++++++--------------------------------------
 1 file changed, 11 insertions(+), 53 deletions(-)

Comments

Qu Wenruo Aug. 5, 2021, 6:33 a.m. UTC | #1
On 2021/8/5 上午2:48, Marcos Paulo de Souza wrote:
> btrfs_find_one_extref is using btrfs_search_slot and iterating over the
> slots, but in reality it only desires to find an extref, since there is
> a break without any condition at the end of the while clause.
>
> The function can be dramatically simplified by using btrfs_find_item, which
> calls the btrfs_search_slot, compares if the objectid and type found
> are the same of those passed as search key, and calls
> btrfs_item_key_to_cpu if no error was found.
>
> No functional changes.
>
> Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>

Reviewed-by: Qu Wenruo <wqu@suse.com>

But a small nitpick inlined below.

> ---
>   fs/btrfs/backref.c | 64 ++++++++--------------------------------------
>   1 file changed, 11 insertions(+), 53 deletions(-)
>
> diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
> index 9e92faaafa02..57b955c8a875 100644
> --- a/fs/btrfs/backref.c
> +++ b/fs/btrfs/backref.c
> @@ -1588,67 +1588,25 @@ int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
>   			  struct btrfs_inode_extref **ret_extref,
>   			  u64 *found_off)
>   {
> -	int ret, slot;
> +	int ret;
>   	struct btrfs_key key;
> -	struct btrfs_key found_key;
>   	struct btrfs_inode_extref *extref;
> -	const struct extent_buffer *leaf;
>   	unsigned long ptr;
>
> -	key.objectid = inode_objectid;
> -	key.type = BTRFS_INODE_EXTREF_KEY;
> -	key.offset = start_off;
> -
> -	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
> +	ret = btrfs_find_item(root, path, inode_objectid, BTRFS_INODE_EXTREF_KEY,
> +			      start_off, &key);
>   	if (ret < 0)
>   		return ret;
> +	else if (ret > 0)
> +		return -ENOENT;
>
> -	while (1) {
> -		leaf = path->nodes[0];
> -		slot = path->slots[0];
> -		if (slot >= btrfs_header_nritems(leaf)) {
> -			/*
> -			 * If the item at offset is not found,
> -			 * btrfs_search_slot will point us to the slot
> -			 * where it should be inserted. In our case
> -			 * that will be the slot directly before the
> -			 * next INODE_REF_KEY_V2 item. In the case
> -			 * that we're pointing to the last slot in a
> -			 * leaf, we must move one leaf over.
> -			 */
> -			ret = btrfs_next_leaf(root, path);
> -			if (ret) {
> -				if (ret >= 1)
> -					ret = -ENOENT;
> -				break;
> -			}
> -			continue;
> -		}
> -
> -		btrfs_item_key_to_cpu(leaf, &found_key, slot);
> -
> -		/*
> -		 * Check that we're still looking at an extended ref key for
> -		 * this particular objectid. If we have different
> -		 * objectid or type then there are no more to be found
> -		 * in the tree and we can exit.
> -		 */
> -		ret = -ENOENT;
> -		if (found_key.objectid != inode_objectid)
> -			break;
> -		if (found_key.type != BTRFS_INODE_EXTREF_KEY)
> -			break;
> -
> -		ret = 0;
> -		ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
> -		extref = (struct btrfs_inode_extref *)ptr;
> -		*ret_extref = extref;
> -		if (found_off)
> -			*found_off = found_key.offset;
> -		break;
> -	}
> +	ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);

@ptr is only a temporary variable.

We can replace it with:

extref = btrfs_item_ptr(path->nodes[0], path->slots[0], struct
btrfs_inode_extref);

Thanks,
Qu
> +	extref = (struct btrfs_inode_extref *)ptr;
> +	*ret_extref = extref;
> +	if (found_off)
> +		*found_off = key.offset;
>
> -	return ret;
> +	return 0;
>   }
>
>   /*
>
diff mbox series

Patch

diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index 9e92faaafa02..57b955c8a875 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -1588,67 +1588,25 @@  int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
 			  struct btrfs_inode_extref **ret_extref,
 			  u64 *found_off)
 {
-	int ret, slot;
+	int ret;
 	struct btrfs_key key;
-	struct btrfs_key found_key;
 	struct btrfs_inode_extref *extref;
-	const struct extent_buffer *leaf;
 	unsigned long ptr;
 
-	key.objectid = inode_objectid;
-	key.type = BTRFS_INODE_EXTREF_KEY;
-	key.offset = start_off;
-
-	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
+	ret = btrfs_find_item(root, path, inode_objectid, BTRFS_INODE_EXTREF_KEY,
+			      start_off, &key);
 	if (ret < 0)
 		return ret;
+	else if (ret > 0)
+		return -ENOENT;
 
-	while (1) {
-		leaf = path->nodes[0];
-		slot = path->slots[0];
-		if (slot >= btrfs_header_nritems(leaf)) {
-			/*
-			 * If the item at offset is not found,
-			 * btrfs_search_slot will point us to the slot
-			 * where it should be inserted. In our case
-			 * that will be the slot directly before the
-			 * next INODE_REF_KEY_V2 item. In the case
-			 * that we're pointing to the last slot in a
-			 * leaf, we must move one leaf over.
-			 */
-			ret = btrfs_next_leaf(root, path);
-			if (ret) {
-				if (ret >= 1)
-					ret = -ENOENT;
-				break;
-			}
-			continue;
-		}
-
-		btrfs_item_key_to_cpu(leaf, &found_key, slot);
-
-		/*
-		 * Check that we're still looking at an extended ref key for
-		 * this particular objectid. If we have different
-		 * objectid or type then there are no more to be found
-		 * in the tree and we can exit.
-		 */
-		ret = -ENOENT;
-		if (found_key.objectid != inode_objectid)
-			break;
-		if (found_key.type != BTRFS_INODE_EXTREF_KEY)
-			break;
-
-		ret = 0;
-		ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
-		extref = (struct btrfs_inode_extref *)ptr;
-		*ret_extref = extref;
-		if (found_off)
-			*found_off = found_key.offset;
-		break;
-	}
+	ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
+	extref = (struct btrfs_inode_extref *)ptr;
+	*ret_extref = extref;
+	if (found_off)
+		*found_off = key.offset;
 
-	return ret;
+	return 0;
 }
 
 /*