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 |
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 --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);