aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/dir.c4
-rw-r--r--fs/nfs/nfs4proc.c16
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;