Patch "btrfs: fix space cache inconsistency after error loading it from disk" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    btrfs: fix space cache inconsistency after error loading it from disk

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     btrfs-fix-space-cache-inconsistency-after-error-load.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b5223cbd275b426a8caf60c6216c3e137eaf99e1
Author: Filipe Manana <fdmanana@xxxxxxxx>
Date:   Thu May 4 12:04:18 2023 +0100

    btrfs: fix space cache inconsistency after error loading it from disk
    
    [ Upstream commit 0004ff15ea26015a0a3a6182dca3b9d1df32e2b7 ]
    
    When loading a free space cache from disk, at __load_free_space_cache(),
    if we fail to insert a bitmap entry, we still increment the number of
    total bitmaps in the btrfs_free_space_ctl structure, which is incorrect
    since we failed to add the bitmap entry. On error we then empty the
    cache by calling __btrfs_remove_free_space_cache(), which will result
    in getting the total bitmaps counter set to 1.
    
    A failure to load a free space cache is not critical, so if a failure
    happens we just rebuild the cache by scanning the extent tree, which
    happens at block-group.c:caching_thread(). Yet the failure will result
    in having the total bitmaps of the btrfs_free_space_ctl always bigger
    by 1 then the number of bitmap entries we have. So fix this by having
    the total bitmaps counter be incremented only if we successfully added
    the bitmap entry.
    
    Fixes: a67509c30079 ("Btrfs: add a io_ctl struct and helpers for dealing with the space cache")
    Reviewed-by: Anand Jain <anand.jain@xxxxxxxxxx>
    CC: stable@xxxxxxxxxxxxxxx # 4.4+
    Signed-off-by: Filipe Manana <fdmanana@xxxxxxxx>
    Reviewed-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index d2d32fed8f2e9..0cb93f73acb2d 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -784,15 +784,16 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode,
 			}
 			spin_lock(&ctl->tree_lock);
 			ret = link_free_space(ctl, e);
-			ctl->total_bitmaps++;
-			ctl->op->recalc_thresholds(ctl);
-			spin_unlock(&ctl->tree_lock);
 			if (ret) {
+				spin_unlock(&ctl->tree_lock);
 				btrfs_err(fs_info,
 					"Duplicate entries in free space cache, dumping");
 				kmem_cache_free(btrfs_free_space_cachep, e);
 				goto free_cache;
 			}
+			ctl->total_bitmaps++;
+			ctl->op->recalc_thresholds(ctl);
+			spin_unlock(&ctl->tree_lock);
 			list_add_tail(&e->list, &bitmaps);
 		}
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux