NFSv4: Fix atomic open for execute...

Currently we do not check for the FMODE_EXEC flag as we should. For that
particular case, we need to perform an ACCESS call to the server in order
to check that the file is executable.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Trond Myklebust 2007-07-03 13:04:56 -04:00
parent 9f958ab885
commit 1b45c46cf7
1 changed files with 14 additions and 1 deletions

View File

@ -769,6 +769,8 @@ static int _nfs4_do_access(struct inode *inode, struct rpc_cred *cred, int openf
mask |= MAY_READ; mask |= MAY_READ;
if (openflags & FMODE_WRITE) if (openflags & FMODE_WRITE)
mask |= MAY_WRITE; mask |= MAY_WRITE;
if (openflags & FMODE_EXEC)
mask |= MAY_EXEC;
status = nfs_access_get_cached(inode, cred, &cache); status = nfs_access_get_cached(inode, cred, &cache);
if (status == 0) if (status == 0)
goto out; goto out;
@ -1269,7 +1271,16 @@ out:
static int nfs4_intent_set_file(struct nameidata *nd, struct path *path, struct nfs4_state *state) static int nfs4_intent_set_file(struct nameidata *nd, struct path *path, struct nfs4_state *state)
{ {
struct file *filp; struct file *filp;
int ret;
/* If the open_intent is for execute, we have an extra check to make */
if (nd->intent.open.flags & FMODE_EXEC) {
ret = _nfs4_do_access(state->inode,
state->owner->so_cred,
nd->intent.open.flags);
if (ret < 0)
goto out_close;
}
filp = lookup_instantiate_filp(nd, path->dentry, NULL); filp = lookup_instantiate_filp(nd, path->dentry, NULL);
if (!IS_ERR(filp)) { if (!IS_ERR(filp)) {
struct nfs_open_context *ctx; struct nfs_open_context *ctx;
@ -1277,8 +1288,10 @@ static int nfs4_intent_set_file(struct nameidata *nd, struct path *path, struct
ctx->state = state; ctx->state = state;
return 0; return 0;
} }
ret = PTR_ERR(filp);
out_close:
nfs4_close_state(path, state, nd->intent.open.flags); nfs4_close_state(path, state, nd->intent.open.flags);
return PTR_ERR(filp); return ret;
} }
struct dentry * struct dentry *