From: Zhihao Cheng <chengzhih...@huawei.com>

[ Upstream commit 3cc64e7ebfb0d7faaba2438334c43466955a96e8 ]

Return value in __load_free_space_cache is not properly set after
(unlikely) memory allocation failures and 0 is returned instead.
This is not a problem for the caller load_free_space_cache because only
value 1 is considered as 'cache loaded' but for clarity it's better
to set the errors accordingly.

Fixes: a67509c30079 ("Btrfs: add a io_ctl struct and helpers for dealing with 
the space cache")
Reported-by: Hulk Robot <hul...@huawei.com>
Signed-off-by: Zhihao Cheng <chengzhih...@huawei.com>
Reviewed-by: David Sterba <dste...@suse.com>
Signed-off-by: David Sterba <dste...@suse.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 fs/btrfs/free-space-cache.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index 8e93bd391b352..f74cb39a64e5e 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -753,8 +753,10 @@ static int __load_free_space_cache(struct btrfs_root 
*root, struct inode *inode,
        while (num_entries) {
                e = kmem_cache_zalloc(btrfs_free_space_cachep,
                                      GFP_NOFS);
-               if (!e)
+               if (!e) {
+                       ret = -ENOMEM;
                        goto free_cache;
+               }
 
                ret = io_ctl_read_entry(&io_ctl, e, &type);
                if (ret) {
@@ -763,6 +765,7 @@ static int __load_free_space_cache(struct btrfs_root *root, 
struct inode *inode,
                }
 
                if (!e->bytes) {
+                       ret = -1;
                        kmem_cache_free(btrfs_free_space_cachep, e);
                        goto free_cache;
                }
@@ -782,6 +785,7 @@ static int __load_free_space_cache(struct btrfs_root *root, 
struct inode *inode,
                        num_bitmaps--;
                        e->bitmap = kzalloc(PAGE_SIZE, GFP_NOFS);
                        if (!e->bitmap) {
+                               ret = -ENOMEM;
                                kmem_cache_free(
                                        btrfs_free_space_cachep, e);
                                goto free_cache;
-- 
2.27.0



Reply via email to