Commit 6f926b5b authored by Trond Myklebust's avatar Trond Myklebust

[NFS]: Check that the server returns a valid regular file to our OPEN request

 Since it appears that some servers don't...
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 02a913a7
...@@ -957,10 +957,12 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry ...@@ -957,10 +957,12 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
res = NULL; res = NULL;
goto out; goto out;
/* This turned out not to be a regular file */ /* This turned out not to be a regular file */
case -EISDIR:
case -ENOTDIR:
goto no_open;
case -ELOOP: case -ELOOP:
if (!(nd->intent.open.flags & O_NOFOLLOW)) if (!(nd->intent.open.flags & O_NOFOLLOW))
goto no_open; goto no_open;
/* case -EISDIR: */
/* case -EINVAL: */ /* case -EINVAL: */
default: default:
goto out; goto out;
......
...@@ -419,6 +419,22 @@ static int _nfs4_proc_open(struct inode *dir, struct nfs4_state_owner *sp, stru ...@@ -419,6 +419,22 @@ static int _nfs4_proc_open(struct inode *dir, struct nfs4_state_owner *sp, stru
o_arg->clientid = sp->so_client->cl_clientid; o_arg->clientid = sp->so_client->cl_clientid;
status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR); status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR);
if (status == 0) {
/* OPEN on anything except a regular file is disallowed in NFSv4 */
switch (o_res->f_attr->mode & S_IFMT) {
case S_IFREG:
break;
case S_IFLNK:
status = -ELOOP;
break;
case S_IFDIR:
status = -EISDIR;
break;
default:
status = -ENOTDIR;
}
}
nfs_increment_open_seqid(status, o_arg->seqid); nfs_increment_open_seqid(status, o_arg->seqid);
if (status != 0) if (status != 0)
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment