|
@@ -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;
|
|
@@ -6492,7 +6496,7 @@ nfs4_retry_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
|
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
|
spin_unlock_irqrestore(&q->lock, flags);
|
|
|
|
|
|
- freezable_schedule_timeout_interruptible(NFS4_LOCK_MAXTIMEOUT);
|
|
|
+ freezable_schedule_timeout(NFS4_LOCK_MAXTIMEOUT);
|
|
|
}
|
|
|
|
|
|
finish_wait(q, &wait);
|