aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4proc.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2005-10-18 17:20:18 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2005-10-18 17:20:18 -0400
commit6f926b5ba75c568296ec227e7d782db4ddbdca5c (patch)
tree6c9aad3139ae4e54210ab5ff37446c357c54b521 /fs/nfs/nfs4proc.c
parent02a913a73b52071e93f4b76db3e86138d19efffd (diff)
[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>
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r--fs/nfs/nfs4proc.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index c9ecb8119632..3db1c9f0b09c 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -419,6 +419,22 @@ static int _nfs4_proc_open(struct inode *dir, struct nfs4_state_owner *sp, stru
419 o_arg->clientid = sp->so_client->cl_clientid; 419 o_arg->clientid = sp->so_client->cl_clientid;
420 420
421 status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR); 421 status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR);
422 if (status == 0) {
423 /* OPEN on anything except a regular file is disallowed in NFSv4 */
424 switch (o_res->f_attr->mode & S_IFMT) {
425 case S_IFREG:
426 break;
427 case S_IFLNK:
428 status = -ELOOP;
429 break;
430 case S_IFDIR:
431 status = -EISDIR;
432 break;
433 default:
434 status = -ENOTDIR;
435 }
436 }
437
422 nfs_increment_open_seqid(status, o_arg->seqid); 438 nfs_increment_open_seqid(status, o_arg->seqid);
423 if (status != 0) 439 if (status != 0)
424 goto out; 440 goto out;