diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index da4ad006739d..ca30e3670b42 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6473,7 +6473,8 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, goto out_unlock_inode; } else { btrfs_update_inode(trans, root, inode); - d_instantiate_new(dentry, inode); + unlock_new_inode(inode); + d_instantiate(dentry, inode); } out_unlock: @@ -6548,7 +6549,8 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, goto out_unlock_inode; BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; - d_instantiate_new(dentry, inode); + unlock_new_inode(inode); + d_instantiate(dentry, inode); out_unlock: btrfs_end_transaction(trans, root); @@ -6691,7 +6693,12 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) if (err) goto out_fail_inode; - d_instantiate_new(dentry, inode); + d_instantiate(dentry, inode); + /* + * mkdir is special. We're unlocking after we call d_instantiate + * to avoid a race with nfsd calling d_instantiate. + */ + unlock_new_inode(inode); drop_on_err = 0; out_fail: @@ -9850,7 +9857,8 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, goto out_unlock_inode; } - d_instantiate_new(dentry, inode); + unlock_new_inode(inode); + d_instantiate(dentry, inode); out_unlock: btrfs_end_transaction(trans, root); |