diff options
Diffstat (limited to 'arch/powerpc/platforms/cell/spufs/inode.c')
| -rw-r--r-- | arch/powerpc/platforms/cell/spufs/inode.c | 48 | 
1 files changed, 18 insertions, 30 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c index 66519d263da..d544d7816df 100644 --- a/arch/powerpc/platforms/cell/spufs/inode.c +++ b/arch/powerpc/platforms/cell/spufs/inode.c @@ -317,28 +317,23 @@ out:  	return ret;  } -static int spufs_context_open(struct dentry *dentry, struct vfsmount *mnt) +static int spufs_context_open(struct path *path)  {  	int ret;  	struct file *filp;  	ret = get_unused_fd(); -	if (ret < 0) { -		dput(dentry); -		mntput(mnt); -		goto out; -	} +	if (ret < 0) +		return ret; -	filp = dentry_open(dentry, mnt, O_RDONLY, current_cred()); +	filp = dentry_open(path, O_RDONLY, current_cred());  	if (IS_ERR(filp)) {  		put_unused_fd(ret); -		ret = PTR_ERR(filp); -		goto out; +		return PTR_ERR(filp);  	}  	filp->f_op = &spufs_context_fops;  	fd_install(ret, filp); -out:  	return ret;  } @@ -453,6 +448,7 @@ spufs_create_context(struct inode *inode, struct dentry *dentry,  	int affinity;  	struct spu_gang *gang;  	struct spu_context *neighbor; +	struct path path = {.mnt = mnt, .dentry = dentry};  	ret = -EPERM;  	if ((flags & SPU_CREATE_NOSCHED) && @@ -495,11 +491,7 @@ spufs_create_context(struct inode *inode, struct dentry *dentry,  			put_spu_context(neighbor);  	} -	/* -	 * get references for dget and mntget, will be released -	 * in error path of *_open(). -	 */ -	ret = spufs_context_open(dget(dentry), mntget(mnt)); +	ret = spufs_context_open(&path);  	if (ret < 0) {  		WARN_ON(spufs_rmdir(inode, dentry));  		if (affinity) @@ -556,28 +548,27 @@ out:  	return ret;  } -static int spufs_gang_open(struct dentry *dentry, struct vfsmount *mnt) +static int spufs_gang_open(struct path *path)  {  	int ret;  	struct file *filp;  	ret = get_unused_fd(); -	if (ret < 0) { -		dput(dentry); -		mntput(mnt); -		goto out; -	} +	if (ret < 0) +		return ret; -	filp = dentry_open(dentry, mnt, O_RDONLY, current_cred()); +	/* +	 * get references for dget and mntget, will be released +	 * in error path of *_open(). +	 */ +	filp = dentry_open(path, O_RDONLY, current_cred());  	if (IS_ERR(filp)) {  		put_unused_fd(ret); -		ret = PTR_ERR(filp); -		goto out; +		return PTR_ERR(filp);  	}  	filp->f_op = &simple_dir_operations;  	fd_install(ret, filp); -out:  	return ret;  } @@ -585,17 +576,14 @@ static int spufs_create_gang(struct inode *inode,  			struct dentry *dentry,  			struct vfsmount *mnt, umode_t mode)  { +	struct path path = {.mnt = mnt, .dentry = dentry};  	int ret;  	ret = spufs_mkgang(inode, dentry, mode & S_IRWXUGO);  	if (ret)  		goto out; -	/* -	 * get references for dget and mntget, will be released -	 * in error path of *_open(). -	 */ -	ret = spufs_gang_open(dget(dentry), mntget(mnt)); +	ret = spufs_gang_open(&path);  	if (ret < 0) {  		int err = simple_rmdir(inode, dentry);  		WARN_ON(err);  |