diff options
author | Dan Carpenter | 2019-12-03 05:24:58 -0600 |
---|---|---|
committer | Greg Kroah-Hartman | 2019-12-31 05:37:55 -0600 |
commit | f8f86208bfbe7b556d108e3dae05e315cfcc34f4 (patch) | |
tree | bff2669097f939ce1a3479ecb08c2ff55b35014c | |
parent | 51ff11e50d8b2bbde8b790b4e7cdd5688d5aef94 (diff) | |
download | kernel-f8f86208bfbe7b556d108e3dae05e315cfcc34f4.tar.gz kernel-f8f86208bfbe7b556d108e3dae05e315cfcc34f4.tar.xz kernel-f8f86208bfbe7b556d108e3dae05e315cfcc34f4.zip |
btrfs: return error pointer from alloc_test_extent_buffer
[ Upstream commit b6293c821ea8fa2a631a2112cd86cd435effeb8b ]
Callers of alloc_test_extent_buffer have not correctly interpreted the
return value as error pointer, as alloc_test_extent_buffer should behave
as alloc_extent_buffer. The self-tests were unaffected but
btrfs_find_create_tree_block could call both functions and that would
cause problems up in the call chain.
Fixes: faa2dbf004e8 ("Btrfs: add sanity tests for new qgroup accounting code")
CC: stable@vger.kernel.org # 4.4+
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r-- | fs/btrfs/extent_io.c | 6 | ||||
-rw-r--r-- | fs/btrfs/tests/free-space-tree-tests.c | 6 | ||||
-rw-r--r-- | fs/btrfs/tests/qgroup-tests.c | 4 |
3 files changed, 9 insertions, 7 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 4cc534584665..fced434bbddc 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -4949,12 +4949,14 @@ struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4949 | return eb; | 4949 | return eb; |
4950 | eb = alloc_dummy_extent_buffer(fs_info, start); | 4950 | eb = alloc_dummy_extent_buffer(fs_info, start); |
4951 | if (!eb) | 4951 | if (!eb) |
4952 | return NULL; | 4952 | return ERR_PTR(-ENOMEM); |
4953 | eb->fs_info = fs_info; | 4953 | eb->fs_info = fs_info; |
4954 | again: | 4954 | again: |
4955 | ret = radix_tree_preload(GFP_NOFS); | 4955 | ret = radix_tree_preload(GFP_NOFS); |
4956 | if (ret) | 4956 | if (ret) { |
4957 | exists = ERR_PTR(ret); | ||
4957 | goto free_eb; | 4958 | goto free_eb; |
4959 | } | ||
4958 | spin_lock(&fs_info->buffer_lock); | 4960 | spin_lock(&fs_info->buffer_lock); |
4959 | ret = radix_tree_insert(&fs_info->buffer_radix, | 4961 | ret = radix_tree_insert(&fs_info->buffer_radix, |
4960 | start >> PAGE_SHIFT, eb); | 4962 | start >> PAGE_SHIFT, eb); |
diff --git a/fs/btrfs/tests/free-space-tree-tests.c b/fs/btrfs/tests/free-space-tree-tests.c index 8444a018cca2..f6c783e959b7 100644 --- a/fs/btrfs/tests/free-space-tree-tests.c +++ b/fs/btrfs/tests/free-space-tree-tests.c | |||
@@ -475,9 +475,9 @@ static int run_test(test_func_t test_func, int bitmaps, u32 sectorsize, | |||
475 | root->fs_info->tree_root = root; | 475 | root->fs_info->tree_root = root; |
476 | 476 | ||
477 | root->node = alloc_test_extent_buffer(root->fs_info, nodesize); | 477 | root->node = alloc_test_extent_buffer(root->fs_info, nodesize); |
478 | if (!root->node) { | 478 | if (IS_ERR(root->node)) { |
479 | test_msg("Couldn't allocate dummy buffer\n"); | 479 | test_msg("couldn't allocate dummy buffer\n"); |
480 | ret = -ENOMEM; | 480 | ret = PTR_ERR(root->node); |
481 | goto out; | 481 | goto out; |
482 | } | 482 | } |
483 | btrfs_set_header_level(root->node, 0); | 483 | btrfs_set_header_level(root->node, 0); |
diff --git a/fs/btrfs/tests/qgroup-tests.c b/fs/btrfs/tests/qgroup-tests.c index 578fd045e859..eb72cf280546 100644 --- a/fs/btrfs/tests/qgroup-tests.c +++ b/fs/btrfs/tests/qgroup-tests.c | |||
@@ -487,9 +487,9 @@ int btrfs_test_qgroups(u32 sectorsize, u32 nodesize) | |||
487 | * *cough*backref walking code*cough* | 487 | * *cough*backref walking code*cough* |
488 | */ | 488 | */ |
489 | root->node = alloc_test_extent_buffer(root->fs_info, nodesize); | 489 | root->node = alloc_test_extent_buffer(root->fs_info, nodesize); |
490 | if (!root->node) { | 490 | if (IS_ERR(root->node)) { |
491 | test_msg("Couldn't allocate dummy buffer\n"); | 491 | test_msg("Couldn't allocate dummy buffer\n"); |
492 | ret = -ENOMEM; | 492 | ret = PTR_ERR(root->node); |
493 | goto out; | 493 | goto out; |
494 | } | 494 | } |
495 | btrfs_set_header_level(root->node, 0); | 495 | btrfs_set_header_level(root->node, 0); |