diff options
| author | Chris Mason <chris.mason@fusionio.com> | 2013-02-06 12:06:02 -0500 |
|---|---|---|
| committer | Chris Mason <chris.mason@fusionio.com> | 2013-02-06 12:11:10 -0500 |
| commit | 1a65e24b0bb7dde48cac4a2bf74d5558f9e32ba7 (patch) | |
| tree | bda896534a46bf159e725379236509e2def0e52a /fs/btrfs | |
| parent | eb6b88d92c6df083dd09a8c471011e3788dfd7c6 (diff) | |
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: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/ioctl.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index afbf3ac2079d..a31cd931d36e 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -515,7 +515,6 @@ static noinline int create_subvol(struct btrfs_root *root, | |||
| 515 | 515 | ||
| 516 | BUG_ON(ret); | 516 | BUG_ON(ret); |
| 517 | 517 | ||
| 518 | d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry)); | ||
| 519 | fail: | 518 | fail: |
| 520 | if (async_transid) { | 519 | if (async_transid) { |
| 521 | *async_transid = trans->transid; | 520 | *async_transid = trans->transid; |
| @@ -525,6 +524,10 @@ fail: | |||
| 525 | } | 524 | } |
| 526 | if (err && !ret) | 525 | if (err && !ret) |
| 527 | ret = err; | 526 | ret = err; |
| 527 | |||
| 528 | if (!ret) | ||
| 529 | d_instantiate(dentry, btrfs_lookup_dentry(dir, dentry)); | ||
| 530 | |||
| 528 | return ret; | 531 | return ret; |
| 529 | } | 532 | } |
| 530 | 533 | ||
