Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 827fa4c7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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
parents 5d219c6b 08c422c2
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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;
+5 −4
Original line number Original line Diff line number Diff line
@@ -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) {