[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: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
02a913a73b
commit
6f926b5ba7
|
@ -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
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue