@@ -2399,14 +2399,15 @@ nfs_access_calc_mask(u32 access_result)
2399
2399
2400
2400
void nfs_access_set_mask (struct nfs_access_entry * entry , u32 access_result )
2401
2401
{
2402
- entry -> mask = nfs_access_calc_mask ( access_result ) ;
2402
+ entry -> mask = access_result ;
2403
2403
}
2404
2404
EXPORT_SYMBOL_GPL (nfs_access_set_mask );
2405
2405
2406
2406
static int nfs_do_access (struct inode * inode , struct rpc_cred * cred , int mask )
2407
2407
{
2408
2408
struct nfs_access_entry cache ;
2409
2409
bool may_block = (mask & MAY_NOT_BLOCK ) == 0 ;
2410
+ int cache_mask ;
2410
2411
int status ;
2411
2412
2412
2413
trace_nfs_access_enter (inode );
@@ -2422,7 +2423,8 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
2422
2423
goto out ;
2423
2424
2424
2425
/* Be clever: ask server to check for all possible rights */
2425
- cache .mask = MAY_EXEC | MAY_WRITE | MAY_READ ;
2426
+ cache .mask = NFS_MAY_LOOKUP | NFS_MAY_EXECUTE
2427
+ | NFS_MAY_WRITE | NFS_MAY_READ ;
2426
2428
cache .cred = cred ;
2427
2429
cache .jiffies = jiffies ;
2428
2430
status = NFS_PROTO (inode )-> access (inode , & cache );
@@ -2436,7 +2438,8 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
2436
2438
}
2437
2439
nfs_access_add_cache (inode , & cache );
2438
2440
out_cached :
2439
- if ((mask & ~cache .mask & (MAY_READ | MAY_WRITE | MAY_EXEC )) != 0 )
2441
+ cache_mask = nfs_access_calc_mask (cache .mask );
2442
+ if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC )) != 0 )
2440
2443
status = - EACCES ;
2441
2444
out :
2442
2445
trace_nfs_access_exit (inode , status );
0 commit comments