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;
|
struct list_head *fallback;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
again:
|
|
||||||
spin_lock_irqsave(&workers->lock, flags);
|
spin_lock_irqsave(&workers->lock, flags);
|
||||||
|
again:
|
||||||
worker = next_worker(workers);
|
worker = next_worker(workers);
|
||||||
|
|
||||||
if (!worker) {
|
if (!worker) {
|
||||||
|
@ -579,6 +579,7 @@ again:
|
||||||
spin_unlock_irqrestore(&workers->lock, flags);
|
spin_unlock_irqrestore(&workers->lock, flags);
|
||||||
/* we're below the limit, start another worker */
|
/* we're below the limit, start another worker */
|
||||||
ret = __btrfs_start_workers(workers);
|
ret = __btrfs_start_workers(workers);
|
||||||
|
spin_lock_irqsave(&workers->lock, flags);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fallback;
|
goto fallback;
|
||||||
goto again;
|
goto again;
|
||||||
|
|
|
@ -4590,10 +4590,6 @@ static int btrfs_add_nondir(struct btrfs_trans_handle *trans,
|
||||||
int err = btrfs_add_link(trans, dir, inode,
|
int err = btrfs_add_link(trans, dir, inode,
|
||||||
dentry->d_name.name, dentry->d_name.len,
|
dentry->d_name.name, dentry->d_name.len,
|
||||||
backref, index);
|
backref, index);
|
||||||
if (!err) {
|
|
||||||
d_instantiate(dentry, inode);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
err = -EEXIST;
|
err = -EEXIST;
|
||||||
return err;
|
return err;
|
||||||
|
@ -4655,6 +4651,7 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
|
||||||
else {
|
else {
|
||||||
init_special_inode(inode, inode->i_mode, rdev);
|
init_special_inode(inode, inode->i_mode, rdev);
|
||||||
btrfs_update_inode(trans, root, inode);
|
btrfs_update_inode(trans, root, inode);
|
||||||
|
d_instantiate(dentry, inode);
|
||||||
}
|
}
|
||||||
out_unlock:
|
out_unlock:
|
||||||
nr = trans->blocks_used;
|
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->a_ops = &btrfs_aops;
|
||||||
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
|
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
|
||||||
BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
|
BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
|
||||||
|
d_instantiate(dentry, inode);
|
||||||
}
|
}
|
||||||
out_unlock:
|
out_unlock:
|
||||||
nr = trans->blocks_used;
|
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;
|
struct dentry *parent = dentry->d_parent;
|
||||||
err = btrfs_update_inode(trans, root, inode);
|
err = btrfs_update_inode(trans, root, inode);
|
||||||
BUG_ON(err);
|
BUG_ON(err);
|
||||||
|
d_instantiate(dentry, inode);
|
||||||
btrfs_log_new_name(trans, inode, NULL, parent);
|
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;
|
drop_inode = 1;
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
|
if (!err)
|
||||||
|
d_instantiate(dentry, inode);
|
||||||
nr = trans->blocks_used;
|
nr = trans->blocks_used;
|
||||||
btrfs_end_transaction_throttle(trans, root);
|
btrfs_end_transaction_throttle(trans, root);
|
||||||
if (drop_inode) {
|
if (drop_inode) {
|
||||||
|
|
Loading…
Reference in New Issue