|
@@ -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;
|
|
|
}
|