nfsd: fix courtesy client with deny mode handling in nfs4_upgrade_open
authorJeff Layton <jlayton@kernel.org>
Fri, 3 Feb 2023 18:18:34 +0000 (13:18 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:33:24 +0000 (09:33 +0100)
[ Upstream commit dcd779dc46540e174a6ac8d52fbed23593407317 ]

The nested if statements here make no sense, as you can never reach
"else" branch in the nested statement. Fix the error handling for
when there is a courtesy client that holds a conflicting deny mode.

Fixes: 3d6942715180 ("NFSD: add support for share reservation conflict to courteous server")
Reported-by: 張智諺 <cc85nod@gmail.com>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Dai Ngo <dai.ngo@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfsd/nfs4state.c

index 7c1b124..a768b87 100644 (file)
@@ -5258,16 +5258,17 @@ nfs4_upgrade_open(struct svc_rqst *rqstp, struct nfs4_file *fp,
        /* test and set deny mode */
        spin_lock(&fp->fi_lock);
        status = nfs4_file_check_deny(fp, open->op_share_deny);
-       if (status == nfs_ok) {
-               if (status != nfserr_share_denied) {
-                       set_deny(open->op_share_deny, stp);
-                       fp->fi_share_deny |=
-                               (open->op_share_deny & NFS4_SHARE_DENY_BOTH);
-               } else {
-                       if (nfs4_resolve_deny_conflicts_locked(fp, false,
-                                       stp, open->op_share_deny, false))
-                               status = nfserr_jukebox;
-               }
+       switch (status) {
+       case nfs_ok:
+               set_deny(open->op_share_deny, stp);
+               fp->fi_share_deny |=
+                       (open->op_share_deny & NFS4_SHARE_DENY_BOTH);
+               break;
+       case nfserr_share_denied:
+               if (nfs4_resolve_deny_conflicts_locked(fp, false,
+                               stp, open->op_share_deny, false))
+                       status = nfserr_jukebox;
+               break;
        }
        spin_unlock(&fp->fi_lock);