forked from Minki/linux
Btrfs: call d_instantiate after all ops are setup
This closes races where btrfs is calling d_instantiate too soon during inode creation. All of the callers of btrfs_add_nondir are updated to instantiate after the inode is fully setup in memory. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
8d532b2afb
commit
08c422c27f
@ -4590,10 +4590,6 @@ static int btrfs_add_nondir(struct btrfs_trans_handle *trans,
|
||||
int err = btrfs_add_link(trans, dir, inode,
|
||||
dentry->d_name.name, dentry->d_name.len,
|
||||
backref, index);
|
||||
if (!err) {
|
||||
d_instantiate(dentry, inode);
|
||||
return 0;
|
||||
}
|
||||
if (err > 0)
|
||||
err = -EEXIST;
|
||||
return err;
|
||||
@ -4655,6 +4651,7 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
|
||||
else {
|
||||
init_special_inode(inode, inode->i_mode, rdev);
|
||||
btrfs_update_inode(trans, root, inode);
|
||||
d_instantiate(dentry, inode);
|
||||
}
|
||||
out_unlock:
|
||||
nr = trans->blocks_used;
|
||||
@ -4722,6 +4719,7 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
|
||||
inode->i_mapping->a_ops = &btrfs_aops;
|
||||
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
|
||||
BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
|
||||
d_instantiate(dentry, inode);
|
||||
}
|
||||
out_unlock:
|
||||
nr = trans->blocks_used;
|
||||
@ -4779,6 +4777,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
|
||||
struct dentry *parent = dentry->d_parent;
|
||||
err = btrfs_update_inode(trans, root, inode);
|
||||
BUG_ON(err);
|
||||
d_instantiate(dentry, inode);
|
||||
btrfs_log_new_name(trans, inode, NULL, parent);
|
||||
}
|
||||
|
||||
@ -7245,6 +7244,8 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
|
||||
drop_inode = 1;
|
||||
|
||||
out_unlock:
|
||||
if (!err)
|
||||
d_instantiate(dentry, inode);
|
||||
nr = trans->blocks_used;
|
||||
btrfs_end_transaction_throttle(trans, root);
|
||||
if (drop_inode) {
|
||||
|
Loading…
Reference in New Issue
Block a user