Use access mode instead of open flags to determine needed permissions
authorLinus Torvalds <>
Sat, 12 Jan 2008 22:06:34 +0000 (14:06 -0800)
committerLinus Torvalds <>
Sat, 12 Jan 2008 22:47:58 +0000 (14:47 -0800)
Way back when (in commit 834f2a4a1554dc5b2598038b3fe8703defcbe467, aka
"VFS: Allow the filesystem to return a full file pointer on open intent"
to be exact), Trond changed the open logic to keep track of the original
flags to a file open, in order to pass down the the intent of a dentry
lookup to the low-level filesystem.

However, when doing that reorganization, it changed the meaning of
namei_flags, and thus inadvertently changed the test of access mode for
directories (and RO filesystem) to use the wrong flag.  So fix those
test back to use access mode ("acc_mode") rather than the open flag

Issue noticed by Bill Roman at Datalight.

Reported-and-tested-by: Bill Roman <>
Acked-by: Trond Myklebust <>
Acked-by: Al Viro <>
Cc: Christoph Hellwig <>
Cc: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

index 3b993db26cee2c2df753f883239e6e917039bd38..73e2e665817a100c9f05c33a12756f639d9c5ae7 100644 (file)
@@ -1605,7 +1605,7 @@ int may_open(struct nameidata *nd, int acc_mode, int flag)
        if (S_ISLNK(inode->i_mode))
                return -ELOOP;
-       if (S_ISDIR(inode->i_mode) && (flag & FMODE_WRITE))
+       if (S_ISDIR(inode->i_mode) && (acc_mode & MAY_WRITE))
                return -EISDIR;
@@ -1620,7 +1620,7 @@ int may_open(struct nameidata *nd, int acc_mode, int flag)
                        return -EACCES;
                flag &= ~O_TRUNC;
-       } else if (IS_RDONLY(inode) && (flag & FMODE_WRITE))
+       } else if (IS_RDONLY(inode) && (acc_mode & MAY_WRITE))
                return -EROFS;
        error = vfs_permission(nd, acc_mode);