btrfs: clarify error returns values in __load_free_space_cache
authorZhihao Cheng <chengzhihao1@huawei.com>
Fri, 20 Nov 2020 01:08:04 +0000 (09:08 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Feb 2021 21:58:49 +0000 (22:58 +0100)
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 <hulkci@huawei.com>
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/free-space-cache.c

index 4d88978..71d0d14 100644 (file)
@@ -775,8 +775,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) {
@@ -785,6 +787,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;
                }
@@ -805,6 +808,7 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode,
                        e->bitmap = kmem_cache_zalloc(
                                        btrfs_free_space_bitmap_cachep, GFP_NOFS);
                        if (!e->bitmap) {
+                               ret = -ENOMEM;
                                kmem_cache_free(
                                        btrfs_free_space_cachep, e);
                                goto free_cache;