btrfs: use BTRFS_NESTED_NEW_ROOT for double splits
authorJosef Bacik <josef@toxicpanda.com>
Thu, 20 Aug 2020 15:46:08 +0000 (11:46 -0400)
committerDavid Sterba <dsterba@suse.com>
Wed, 7 Oct 2020 10:12:17 +0000 (12:12 +0200)
I've made this change separate since it requires both of the newly added
NESTED flags and I didn't want to slip it into one of those changes.

If we do a double split of a node we can end up doing a
BTRFS_NESTED_SPLIT on level 0, which throws lockdep off because it
appears as a double lock.  Since we're maxed out on subclasses, use
BTRFS_NESTED_NEW_ROOT if we had to do a double split.  This is OK
because we won't have to do a double split if we had to insert a new
root, and the new root would be at a higher level anyway.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.c

index d61ea238ad8a17ea51e2960f46b0560e7d164c22..7dbfa365eb18b1f7a4bc0c007394f82cdcb92a4e 100644 (file)
@@ -4324,8 +4324,18 @@ again:
        else
                btrfs_item_key(l, &disk_key, mid);
 
+       /*
+        * We have to about BTRFS_NESTING_NEW_ROOT here if we've done a double
+        * split, because we're only allowed to have MAX_LOCKDEP_SUBCLASSES
+        * subclasses, which is 8 at the time of this patch, and we've maxed it
+        * out.  In the future we could add a
+        * BTRFS_NESTING_SPLIT_THE_SPLITTENING if we need to, but for now just
+        * use BTRFS_NESTING_NEW_ROOT.
+        */
        right = alloc_tree_block_no_bg_flush(trans, root, 0, &disk_key, 0,
-                                            l->start, 0, BTRFS_NESTING_SPLIT);
+                                            l->start, 0, num_doubles ?
+                                            BTRFS_NESTING_NEW_ROOT :
+                                            BTRFS_NESTING_SPLIT);
        if (IS_ERR(right))
                return PTR_ERR(right);