Commit 1a65e24b authored by Chris Mason's avatar Chris Mason

Btrfs: move d_instantiate outside the transaction during mksubvol

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: default avatarChris Mason <chris.mason@fusionio.com>
parent eb6b88d9
...@@ -515,7 +515,6 @@ static noinline int create_subvol(struct btrfs_root *root, ...@@ -515,7 +515,6 @@ static noinline int create_subvol(struct btrfs_root *root,
BUG_ON(ret); BUG_ON(ret);
d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry));
fail: fail:
if (async_transid) { if (async_transid) {
*async_transid = trans->transid; *async_transid = trans->transid;
...@@ -525,6 +524,10 @@ static noinline int create_subvol(struct btrfs_root *root, ...@@ -525,6 +524,10 @@ static noinline int create_subvol(struct btrfs_root *root,
} }
if (err && !ret) if (err && !ret)
ret = err; ret = err;
if (!ret)
d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry));
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment