|
|
@@ -2236,7 +2236,7 @@ static int nfs4_opendata_access(struct rpc_cred *cred,
|
|
|
int openflags)
|
|
|
{
|
|
|
struct nfs_access_entry cache;
|
|
|
- u32 mask;
|
|
|
+ u32 mask, flags;
|
|
|
|
|
|
/* access call failed or for some reason the server doesn't
|
|
|
* support any access modes -- defer access call until later */
|
|
|
@@ -2250,16 +2250,20 @@ static int nfs4_opendata_access(struct rpc_cred *cred,
|
|
|
*/
|
|
|
if (openflags & __FMODE_EXEC) {
|
|
|
/* ONLY check for exec rights */
|
|
|
- mask = MAY_EXEC;
|
|
|
+ if (S_ISDIR(state->inode->i_mode))
|
|
|
+ mask = NFS4_ACCESS_LOOKUP;
|
|
|
+ else
|
|
|
+ mask = NFS4_ACCESS_EXECUTE;
|
|
|
} else if ((fmode & FMODE_READ) && !opendata->file_created)
|
|
|
- mask = MAY_READ;
|
|
|
+ mask = NFS4_ACCESS_READ;
|
|
|
|
|
|
cache.cred = cred;
|
|
|
cache.jiffies = jiffies;
|
|
|
nfs_access_set_mask(&cache, opendata->o_res.access_result);
|
|
|
nfs_access_add_cache(state->inode, &cache);
|
|
|
|
|
|
- if ((mask & ~cache.mask & (MAY_READ | MAY_EXEC)) == 0)
|
|
|
+ flags = NFS4_ACCESS_READ | NFS4_ACCESS_EXECUTE | NFS4_ACCESS_LOOKUP;
|
|
|
+ if ((mask & ~cache.mask & flags) == 0)
|
|
|
return 0;
|
|
|
|
|
|
return -EACCES;
|