提交 1e6f2095 编写于 作者: A Anna Schumaker

NFS: Use raw NFS access mask in nfs4_opendata_access()

Commit bd8b2441 ("NFS: Store the raw NFS access mask in the inode's
access cache") changed how the access results are stored after an
access() call.  An NFS v4 OPEN might have access bits returned with the
opendata, so we should use the NFS4_ACCESS values when determining the
return value in nfs4_opendata_access().

Fixes: bd8b2441 ("NFS: Store the raw NFS access mask in the inode's
access cache")
Reported-by: NEryu Guan <eguan@redhat.com>
Signed-off-by: NAnna Schumaker <Anna.Schumaker@Netapp.com>
Tested-by: NTakashi Iwai <tiwai@suse.de>
上级 1ebf9801
...@@ -2236,7 +2236,7 @@ static int nfs4_opendata_access(struct rpc_cred *cred, ...@@ -2236,7 +2236,7 @@ static int nfs4_opendata_access(struct rpc_cred *cred,
int openflags) int openflags)
{ {
struct nfs_access_entry cache; struct nfs_access_entry cache;
u32 mask; u32 mask, flags;
/* access call failed or for some reason the server doesn't /* access call failed or for some reason the server doesn't
* support any access modes -- defer access call until later */ * support any access modes -- defer access call until later */
...@@ -2250,16 +2250,20 @@ static int nfs4_opendata_access(struct rpc_cred *cred, ...@@ -2250,16 +2250,20 @@ static int nfs4_opendata_access(struct rpc_cred *cred,
*/ */
if (openflags & __FMODE_EXEC) { if (openflags & __FMODE_EXEC) {
/* ONLY check for exec rights */ /* 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) } else if ((fmode & FMODE_READ) && !opendata->file_created)
mask = MAY_READ; mask = NFS4_ACCESS_READ;
cache.cred = cred; cache.cred = cred;
cache.jiffies = jiffies; cache.jiffies = jiffies;
nfs_access_set_mask(&cache, opendata->o_res.access_result); nfs_access_set_mask(&cache, opendata->o_res.access_result);
nfs_access_add_cache(state->inode, &cache); 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 0;
return -EACCES; return -EACCES;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册