diff mbox series

btrfs: fix end of tree detection when searching for data extent ref

Message ID d025098ef2c013545df5f37ef85128805a104571.1715699835.git.fdmanana@suse.com (mailing list archive)
State New
Headers show
Series btrfs: fix end of tree detection when searching for data extent ref | expand

Commit Message

Filipe Manana May 14, 2024, 3:26 p.m. UTC
From: Filipe Manana <fdmanana@suse.com>

At lookup_extent_data_ref() we are incorrectly checking if we are at the
last slot of the last leaf in the extent tree. We are returning -ENOENT
if btrfs_next_leaf() returns a value greater than 1, but btrfs_next_leaf()
never returns anything greater than 1:

1) It returns < 0 on error;

2) 0 if there is a next leaf (or a new item was added to the end of the
   current leaf after releasing the path);

3) 1 if there are no more leaves (and no new items were added to the last
   leaf after releasing the path).

So fix this by checking if the return value is greater than zero instead
of being greater than one.

Fixes: 1618aa3c2e01 ("btrfs: simplify return variables in lookup_extent_data_ref()")
Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/btrfs/extent-tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

David Sterba May 14, 2024, 4:22 p.m. UTC | #1
On Tue, May 14, 2024 at 04:26:52PM +0100, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
> 
> At lookup_extent_data_ref() we are incorrectly checking if we are at the
> last slot of the last leaf in the extent tree. We are returning -ENOENT
> if btrfs_next_leaf() returns a value greater than 1, but btrfs_next_leaf()
> never returns anything greater than 1:
> 
> 1) It returns < 0 on error;
> 
> 2) 0 if there is a next leaf (or a new item was added to the end of the
>    current leaf after releasing the path);
> 
> 3) 1 if there are no more leaves (and no new items were added to the last
>    leaf after releasing the path).
> 
> So fix this by checking if the return value is greater than zero instead
> of being greater than one.
> 
> Fixes: 1618aa3c2e01 ("btrfs: simplify return variables in lookup_extent_data_ref()")
> Signed-off-by: Filipe Manana <fdmanana@suse.com>

Reviewed-by: David Sterba <dsterba@suse.com>
Qu Wenruo May 14, 2024, 10:20 p.m. UTC | #2
在 2024/5/15 00:56, fdmanana@kernel.org 写道:
> From: Filipe Manana <fdmanana@suse.com>
>
> At lookup_extent_data_ref() we are incorrectly checking if we are at the
> last slot of the last leaf in the extent tree. We are returning -ENOENT
> if btrfs_next_leaf() returns a value greater than 1, but btrfs_next_leaf()
> never returns anything greater than 1:
>
> 1) It returns < 0 on error;
>
> 2) 0 if there is a next leaf (or a new item was added to the end of the
>     current leaf after releasing the path);
>
> 3) 1 if there are no more leaves (and no new items were added to the last
>     leaf after releasing the path).
>
> So fix this by checking if the return value is greater than zero instead
> of being greater than one.
>
> Fixes: 1618aa3c2e01 ("btrfs: simplify return variables in lookup_extent_data_ref()")
> Signed-off-by: Filipe Manana <fdmanana@suse.com>

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

Thanks,
Qu
> ---
>   fs/btrfs/extent-tree.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 47d48233b592..3774c191e36d 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -477,7 +477,7 @@ static noinline int lookup_extent_data_ref(struct btrfs_trans_handle *trans,
>   		if (path->slots[0] >= nritems) {
>   			ret = btrfs_next_leaf(root, path);
>   			if (ret) {
> -				if (ret > 1)
> +				if (ret > 0)
>   					return -ENOENT;
>   				return ret;
>   			}
diff mbox series

Patch

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 47d48233b592..3774c191e36d 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -477,7 +477,7 @@  static noinline int lookup_extent_data_ref(struct btrfs_trans_handle *trans,
 		if (path->slots[0] >= nritems) {
 			ret = btrfs_next_leaf(root, path);
 			if (ret) {
-				if (ret > 1)
+				if (ret > 0)
 					return -ENOENT;
 				return ret;
 			}