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

Commit 25b2692a authored by Al Viro's avatar Al Viro
Browse files

pull unlock+dput() out into do_spu_create()



... and cleaning spufs_create() a bit, while we are at it

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1ba44cc9
Loading
Loading
Loading
Loading
+9 −16
Original line number Diff line number Diff line
@@ -582,39 +582,32 @@ static struct file_system_type spufs_type;
long spufs_create(struct path *path, struct dentry *dentry,
		unsigned int flags, umode_t mode, struct file *filp)
{
	struct inode *dir = path->dentry->d_inode;
	int ret;

	ret = -EINVAL;
	/* check if we are on spufs */
	if (path->dentry->d_sb->s_type != &spufs_type)
		goto out;
		return -EINVAL;

	/* don't accept undefined flags */
	if (flags & (~SPU_CREATE_FLAG_ALL))
		goto out;
		return -EINVAL;

	/* only threads can be underneath a gang */
	if (path->dentry != path->dentry->d_sb->s_root) {
		if ((flags & SPU_CREATE_GANG) ||
		    !SPUFS_I(path->dentry->d_inode)->i_gang)
			goto out;
	}
	if (path->dentry != path->dentry->d_sb->s_root)
		if ((flags & SPU_CREATE_GANG) || !SPUFS_I(dir)->i_gang)
			return -EINVAL;

	mode &= ~current_umask();

	if (flags & SPU_CREATE_GANG)
		ret = spufs_create_gang(path->dentry->d_inode,
					 dentry, path->mnt, mode);
		ret = spufs_create_gang(dir, dentry, path->mnt, mode);
	else
		ret = spufs_create_context(path->dentry->d_inode,
					    dentry, path->mnt, flags, mode,
		ret = spufs_create_context(dir, dentry, path->mnt, flags, mode,
					    filp);
	if (ret >= 0)
		fsnotify_mkdir(path->dentry->d_inode, dentry);
		fsnotify_mkdir(dir, dentry);

out:
	mutex_unlock(&path->dentry->d_inode->i_mutex);
	dput(dentry);
	return ret;
}

+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ static long do_spu_create(const char __user *pathname, unsigned int flags,
	ret = PTR_ERR(dentry);
	if (!IS_ERR(dentry)) {
		ret = spufs_create(&path, dentry, flags, mode, neighbor);
		mutex_unlock(&path.dentry->d_inode->i_mutex);
		dput(dentry);
		path_put(&path);
	}