diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 23:20:18 +0200 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 23:20:18 +0200 |
commit | 6f926b5ba75c568296ec227e7d782db4ddbdca5c (patch) | |
tree | 6c9aad3139ae4e54210ab5ff37446c357c54b521 /fs/nfs/nfs4proc.c | |
parent | NFSv4: Eliminate nfsv4 open race... (diff) | |
download | linux-6f926b5ba75c568296ec227e7d782db4ddbdca5c.tar.xz linux-6f926b5ba75c568296ec227e7d782db4ddbdca5c.zip |
[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.c | 16 |
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 o_arg->clientid = sp->so_client->cl_clientid; 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); if (status != 0) goto out; |