diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 17:20:18 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-10-18 17:20:18 -0400 |
commit | 6f926b5ba75c568296ec227e7d782db4ddbdca5c (patch) | |
tree | 6c9aad3139ae4e54210ab5ff37446c357c54b521 /fs/nfs | |
parent | 02a913a73b52071e93f4b76db3e86138d19efffd (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')
-rw-r--r-- | fs/nfs/dir.c | 4 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 16 |
2 files changed, 19 insertions, 1 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index a6e251f21fd8..ac331d2d4c4a 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -957,10 +957,12 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry | |||
957 | res = NULL; | 957 | res = NULL; |
958 | goto out; | 958 | goto out; |
959 | /* This turned out not to be a regular file */ | 959 | /* This turned out not to be a regular file */ |
960 | case -EISDIR: | ||
961 | case -ENOTDIR: | ||
962 | goto no_open; | ||
960 | case -ELOOP: | 963 | case -ELOOP: |
961 | if (!(nd->intent.open.flags & O_NOFOLLOW)) | 964 | if (!(nd->intent.open.flags & O_NOFOLLOW)) |
962 | goto no_open; | 965 | goto no_open; |
963 | /* case -EISDIR: */ | ||
964 | /* case -EINVAL: */ | 966 | /* case -EINVAL: */ |
965 | default: | 967 | default: |
966 | goto out; | 968 | goto out; |
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; |