diff options
Diffstat (limited to 'fs/nfs/dir.c')
| -rw-r--r-- | fs/nfs/dir.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 28a238dab23a..74f92b717f78 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -1884,7 +1884,7 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask) | |||
| 1884 | return status; | 1884 | return status; |
| 1885 | nfs_access_add_cache(inode, &cache); | 1885 | nfs_access_add_cache(inode, &cache); |
| 1886 | out: | 1886 | out: |
| 1887 | if ((cache.mask & mask) == mask) | 1887 | if ((mask & ~cache.mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0) |
| 1888 | return 0; | 1888 | return 0; |
| 1889 | return -EACCES; | 1889 | return -EACCES; |
| 1890 | } | 1890 | } |
| @@ -1907,17 +1907,17 @@ int nfs_may_open(struct inode *inode, struct rpc_cred *cred, int openflags) | |||
| 1907 | return nfs_do_access(inode, cred, nfs_open_permission_mask(openflags)); | 1907 | return nfs_do_access(inode, cred, nfs_open_permission_mask(openflags)); |
| 1908 | } | 1908 | } |
| 1909 | 1909 | ||
| 1910 | int nfs_permission(struct inode *inode, int mask, struct nameidata *nd) | 1910 | int nfs_permission(struct inode *inode, int mask) |
| 1911 | { | 1911 | { |
| 1912 | struct rpc_cred *cred; | 1912 | struct rpc_cred *cred; |
| 1913 | int res = 0; | 1913 | int res = 0; |
| 1914 | 1914 | ||
| 1915 | nfs_inc_stats(inode, NFSIOS_VFSACCESS); | 1915 | nfs_inc_stats(inode, NFSIOS_VFSACCESS); |
| 1916 | 1916 | ||
| 1917 | if (mask == 0) | 1917 | if ((mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0) |
| 1918 | goto out; | 1918 | goto out; |
| 1919 | /* Is this sys_access() ? */ | 1919 | /* Is this sys_access() ? */ |
| 1920 | if (nd != NULL && (nd->flags & LOOKUP_ACCESS)) | 1920 | if (mask & MAY_ACCESS) |
| 1921 | goto force_lookup; | 1921 | goto force_lookup; |
| 1922 | 1922 | ||
| 1923 | switch (inode->i_mode & S_IFMT) { | 1923 | switch (inode->i_mode & S_IFMT) { |
| @@ -1926,8 +1926,7 @@ int nfs_permission(struct inode *inode, int mask, struct nameidata *nd) | |||
| 1926 | case S_IFREG: | 1926 | case S_IFREG: |
| 1927 | /* NFSv4 has atomic_open... */ | 1927 | /* NFSv4 has atomic_open... */ |
| 1928 | if (nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN) | 1928 | if (nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN) |
| 1929 | && nd != NULL | 1929 | && (mask & MAY_OPEN)) |
| 1930 | && (nd->flags & LOOKUP_OPEN)) | ||
| 1931 | goto out; | 1930 | goto out; |
| 1932 | break; | 1931 | break; |
| 1933 | case S_IFDIR: | 1932 | case S_IFDIR: |
