Btrfs: move d_instantiate outside the transaction during mksubvol
authorChris Mason <chris.mason@fusionio.com>
Wed, 6 Feb 2013 17:06:02 +0000 (12:06 -0500)
committerChris Mason <chris.mason@fusionio.com>
Wed, 6 Feb 2013 17:11:10 +0000 (12:11 -0500)
Dave Sterba triggered a lockdep complaint about lock ordering
between the sb_internal lock and the cleaner semaphore.

btrfs_lookup_dentry() checks for orphans if we're looking up
the inode for a subvolume, and subvolume creation is triggering
the lookup with a transaction running.

This commit moves the d_instantiate after the transaction closes.

Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/ioctl.c

index afbf3ac2079d32df58a2b0912f5f03267bae77bf..a31cd931d36efa5bf6be0325d2a64ed39a84684d 100644 (file)
@@ -515,7 +515,6 @@ static noinline int create_subvol(struct btrfs_root *root,
 
        BUG_ON(ret);
 
-       d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry));
 fail:
        if (async_transid) {
                *async_transid = trans->transid;
@@ -525,6 +524,10 @@ fail:
        }
        if (err && !ret)
                ret = err;
+
+       if (!ret)
+               d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry));
+
        return ret;
 }