nfsd: nfs4_file_get_access: need to be more careful with O_RDWR
authorHarshula Jayasuriya <harshula@redhat.com>
Tue, 23 Jul 2013 04:05:14 +0000 (14:05 +1000)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 23 Jul 2013 16:26:51 +0000 (12:26 -0400)
If fi_fds = {non-NULL, NULL, non-NULL} and oflag = O_WRONLY
the WARN_ON_ONCE(!(fp->fi_fds[oflag] || fp->fi_fds[O_RDWR]))
doesn't trigger when it should.

Signed-off-by: Harshula Jayasuriya <harshula@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index 280acef..1cb6211 100644 (file)
@@ -282,19 +282,14 @@ static unsigned int file_hashval(struct inode *ino)
 
 static struct hlist_head file_hashtbl[FILE_HASH_SIZE];
 
-static void __nfs4_file_get_access(struct nfs4_file *fp, int oflag)
-{
-       WARN_ON_ONCE(!(fp->fi_fds[oflag] || fp->fi_fds[O_RDWR]));
-       atomic_inc(&fp->fi_access[oflag]);
-}
-
 static void nfs4_file_get_access(struct nfs4_file *fp, int oflag)
 {
+       WARN_ON_ONCE(!fp->fi_fds[oflag]);
        if (oflag == O_RDWR) {
-               __nfs4_file_get_access(fp, O_RDONLY);
-               __nfs4_file_get_access(fp, O_WRONLY);
+               atomic_inc(&fp->fi_access[O_RDONLY]);
+               atomic_inc(&fp->fi_access[O_WRONLY]);
        } else
-               __nfs4_file_get_access(fp, oflag);
+               atomic_inc(&fp->fi_access[oflag]);
 }
 
 static void nfs4_file_put_fd(struct nfs4_file *fp, int oflag)