]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: assert correct lock is held at btrfs_select_ref_head()
authorFilipe Manana <fdmanana@suse.com>
Mon, 29 May 2023 15:17:03 +0000 (16:17 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:31 +0000 (13:59 +0200)
The function btrfs_select_ref_head() iterates over the red black tree of
delayed reference heads, which is protected by the spinlock in the delayed
refs root. The function doesn't take the lock, it's taken by its single
caller, btrfs_obtain_ref_head(), because it needs to call that function
and btrfs_delayed_ref_lock() in the same critical section (delimited by
that spinlock). So assert at btrfs_select_ref_head() that we are holding
the expected lock.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-ref.c

index e4579e66a57adb2ea1b00906c1ba2893c7e71c9c..c61af9012a82bd46868165b4c675c5b6ed34c4e6 100644 (file)
@@ -506,6 +506,7 @@ struct btrfs_delayed_ref_head *btrfs_select_ref_head(
 {
        struct btrfs_delayed_ref_head *head;
 
+       lockdep_assert_held(&delayed_refs->lock);
 again:
        head = find_ref_head(delayed_refs, delayed_refs->run_delayed_start,
                             true);