]> git.hungrycats.org Git - linux/commitdiff
btrfs: set the correct lockdep class for new nodes
authorJosef Bacik <josef@toxicpanda.com>
Mon, 10 Aug 2020 15:42:30 +0000 (11:42 -0400)
committerZygo Blaxell <ce3g8jdj@umail.furryterror.org>
Sat, 12 Sep 2020 23:57:10 +0000 (19:57 -0400)
commit ad24466588ab7d7c879053c5afd919b0c555fec0 upstream.

When flipping over to the rw_semaphore I noticed I'd get a lockdep splat
in replace_path(), which is weird because we're swapping the reloc root
with the actual target root.  Turns out this is because we're using the
root->root_key.objectid as the root id for the newly allocated tree
block when setting the lockdep class, however we need to be using the
actual owner of this new block, which is saved in owner.

The affected path is through btrfs_copy_root as all other callers of
btrfs_alloc_tree_block (which calls init_new_buffer) have root_objectid
== root->root_key.objectid .

CC: stable@vger.kernel.org # 5.4+
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 7e0ffb0d9d9f8dd7e6fbf52780695094c566b545)

fs/btrfs/extent-tree.c

index 277d9c48d76c79960ec1e27598015aa7aa0e7202..da6c219cc5db7aaae80d1e000a148b88b85ede18 100644 (file)
@@ -4550,7 +4550,7 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
                return ERR_PTR(-EUCLEAN);
        }
 
-       btrfs_set_buffer_lockdep_class(root->root_key.objectid, buf, level);
+       btrfs_set_buffer_lockdep_class(owner, buf, level);
        btrfs_tree_lock(buf);
        btrfs_clean_tree_block(buf);
        clear_bit(EXTENT_BUFFER_STALE, &buf->bflags);