btrfs: don't loop for nowait writes when checking for cross references
[ Upstream commited67f2a913] 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 -EAGAIN to the caller. Fix this by not looping if we get -EAGAIN and we have a nowait path. Fixes:26ce911446("btrfs: make can_nocow_extent nowait compatible") CC: stable@vger.kernel.org # 6.1+ Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3e6ff207cd
commit
dcbcd9c88e
@@ -2372,7 +2372,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);
|
||||
|
||||
Reference in New Issue
Block a user