Skip to content

Commit 92fb94b

Browse files
josefbacikkdave
authored andcommitted
btrfs: set cache_block_group_error if we find an error
We set cache_block_group_error if btrfs_cache_block_group() returns an error, this is because we could end up not finding space to allocate and mistakenly return -ENOSPC, and which could then abort the transaction with the incorrect errno, and in the case of ENOSPC result in a WARN_ON() that will trip up tests like generic/475. However there's the case where multiple threads can be racing, one thread gets the proper error, and the other thread doesn't actually call btrfs_cache_block_group(), it instead sees ->cached == BTRFS_CACHE_ERROR. Again the result is the same, we fail to allocate our space and return -ENOSPC. Instead we need to set cache_block_group_error to -EIO in this case to make sure that if we do not make our allocation we get the appropriate error returned back to the caller. CC: stable@vger.kernel.org # 4.14+ Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 6ebcd02 commit 92fb94b

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

fs/btrfs/extent-tree.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4310,8 +4310,11 @@ static noinline int find_free_extent(struct btrfs_root *root,
43104310
ret = 0;
43114311
}
43124312

4313-
if (unlikely(block_group->cached == BTRFS_CACHE_ERROR))
4313+
if (unlikely(block_group->cached == BTRFS_CACHE_ERROR)) {
4314+
if (!cache_block_group_error)
4315+
cache_block_group_error = -EIO;
43144316
goto loop;
4317+
}
43154318

43164319
if (!find_free_extent_check_size_class(ffe_ctl, block_group))
43174320
goto loop;

0 commit comments

Comments
 (0)