diff mbox series

btrfs: dont loop for nowait writes when checking for cross references

Message ID 82b293d9026f9ff3670a4c0ea4df9bf4afa8f4d2.1731685895.git.fdmanana@suse.com (mailing list archive)
State New
Headers show
Series btrfs: dont loop for nowait writes when checking for cross references | expand

Commit Message

Filipe Manana Nov. 15, 2024, 3:52 p.m. UTC
From: Filipe Manana <fdmanana@suse.com>

When checking for delayed refs when verifying if there are cross
references for a data extent, we stop if the path has nowait set and we
can't try lock the delayed ref head's mutex, returning -EAGAIN with the
goal of making a write fallback to a blocking context. However we ignore
the -EAGAIN at btrfs_cross_ref_exist() when check_delayed_ref() returns
it, and keep looping instead of immediately returning the -EGAIN to the
caller.

Fix this by not looping if we get -EAGAIN and we have a nowait path.

Fixes: 26ce91144631 ("btrfs: make can_nocow_extent nowait compatible")
Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/btrfs/extent-tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Josef Bacik Nov. 15, 2024, 4:10 p.m. UTC | #1
On Fri, Nov 15, 2024 at 03:52:38PM +0000, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
> 
> When checking for delayed refs when verifying if there are cross
> references for a data extent, we stop if the path has nowait set and we
> can't try lock the delayed ref head's mutex, returning -EAGAIN with the
> goal of making a write fallback to a blocking context. However we ignore
> the -EAGAIN at btrfs_cross_ref_exist() when check_delayed_ref() returns
> it, and keep looping instead of immediately returning the -EGAIN to the
> caller.
> 
> Fix this by not looping if we get -EAGAIN and we have a nowait path.
> 
> Fixes: 26ce91144631 ("btrfs: make can_nocow_extent nowait compatible")
> Signed-off-by: Filipe Manana <fdmanana@suse.com>

Reviewed-by: Josef Bacik <josef@toxicpanda.com>

Thanks,

Josef
diff mbox series

Patch

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 412e318e4a22..bd09dd3ad1a0 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2422,7 +2422,7 @@  int btrfs_cross_ref_exist(struct btrfs_root *root, u64 objectid, u64 offset,
 			goto out;
 
 		ret = check_delayed_ref(root, path, objectid, offset, bytenr);
-	} while (ret == -EAGAIN);
+	} while (ret == -EAGAIN && !path->nowait);
 
 out:
 	btrfs_release_path(path);