forked from Minki/linux
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs: Btrfs: call d_instantiate after all ops are setup Btrfs: fix worker lock misuse in find_worker
This commit is contained in:
commit
827fa4c762
@ -563,8 +563,8 @@ static struct btrfs_worker_thread *find_worker(struct btrfs_workers *workers)
|
||||
struct list_head *fallback;
|
||||
int ret;
|
||||
|
||||
again:
|
||||
spin_lock_irqsave(&workers->lock, flags);
|
||||
again:
|
||||
worker = next_worker(workers);
|
||||
|
||||
if (!worker) {
|
||||
@ -579,6 +579,7 @@ again:
|
||||
spin_unlock_irqrestore(&workers->lock, flags);
|
||||
/* we're below the limit, start another worker */
|
||||
ret = __btrfs_start_workers(workers);
|
||||
spin_lock_irqsave(&workers->lock, flags);
|
||||
if (ret)
|
||||
goto fallback;
|
||||
goto again;
|
||||
|
@ -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