mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 14:44:10 +08:00
NFS: Use raw NFS access mask in nfs4_opendata_access()
Commitbd8b244174
("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:bd8b244174
("NFS: Store the raw NFS access mask in the inode's access cache") Reported-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> Tested-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
1ebf980127
commit
1e6f209515
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user