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:
parent
9f958ab885
commit
1b45c46cf7
|
@ -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 *
|
||||||
|
|
Loading…
Reference in New Issue