]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: hold space_info->lock when clearing periodic reclaim ready
authorSun YangKai <sunk67188@gmail.com>
Mon, 9 Feb 2026 12:53:39 +0000 (20:53 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 3 Mar 2026 14:54:00 +0000 (15:54 +0100)
btrfs_set_periodic_reclaim_ready() requires space_info->lock to be held,
as enforced by lockdep_assert_held(). However, btrfs_reclaim_sweep() was
calling it after do_reclaim_sweep() returns, at which point
space_info->lock is no longer held.

Fix this by explicitly acquiring space_info->lock before clearing the
periodic reclaim ready flag in btrfs_reclaim_sweep().

Reported-by: Chris Mason <clm@meta.com>
Link: https://lore.kernel.org/linux-btrfs/20260208182556.891815-1-clm@meta.com/
Fixes: 19eff93dc738 ("btrfs: fix periodic reclaim condition")
Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Sun YangKai <sunk67188@gmail.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/space-info.c

index bb5aac7ee9d25c36b9e5fc295d8774991c625426..36bfd2385b2add2c8f6a90ecb835f8c946737903 100644 (file)
@@ -2194,8 +2194,11 @@ void btrfs_reclaim_sweep(const struct btrfs_fs_info *fs_info)
                if (!btrfs_should_periodic_reclaim(space_info))
                        continue;
                for (raid = 0; raid < BTRFS_NR_RAID_TYPES; raid++) {
-                       if (do_reclaim_sweep(space_info, raid))
+                       if (do_reclaim_sweep(space_info, raid)) {
+                               spin_lock(&space_info->lock);
                                btrfs_set_periodic_reclaim_ready(space_info, false);
+                               spin_unlock(&space_info->lock);
+                       }
                }
        }
 }