diff options
Diffstat (limited to 'fs/xfs/xfs_ioctl.c')
| -rw-r--r-- | fs/xfs/xfs_ioctl.c | 14 | 
1 files changed, 5 insertions, 9 deletions
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index f588320dc4b..91f8ff547ab 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -209,6 +209,7 @@ xfs_open_by_handle(  	struct file		*filp;  	struct inode		*inode;  	struct dentry		*dentry; +	fmode_t			fmode;  	if (!capable(CAP_SYS_ADMIN))  		return -XFS_ERROR(EPERM); @@ -228,26 +229,21 @@ xfs_open_by_handle(  	hreq->oflags |= O_LARGEFILE;  #endif -	/* Put open permission in namei format. */  	permflag = hreq->oflags; -	if ((permflag+1) & O_ACCMODE) -		permflag++; -	if (permflag & O_TRUNC) -		permflag |= 2; - +	fmode = OPEN_FMODE(permflag);  	if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) && -	    (permflag & FMODE_WRITE) && IS_APPEND(inode)) { +	    (fmode & FMODE_WRITE) && IS_APPEND(inode)) {  		error = -XFS_ERROR(EPERM);  		goto out_dput;  	} -	if ((permflag & FMODE_WRITE) && IS_IMMUTABLE(inode)) { +	if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) {  		error = -XFS_ERROR(EACCES);  		goto out_dput;  	}  	/* Can't write directories. */ -	if (S_ISDIR(inode->i_mode) && (permflag & FMODE_WRITE)) { +	if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) {  		error = -XFS_ERROR(EISDIR);  		goto out_dput;  	}  |