]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSD: Fix infinite loop in layout state revocation
authorChuck Lever <chuck.lever@oracle.com>
Sun, 19 Apr 2026 18:52:59 +0000 (14:52 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Sun, 10 May 2026 16:41:08 +0000 (12:41 -0400)
find_one_sb_stid() skips stids whose sc_status is non-zero, but the
SC_TYPE_LAYOUT case in nfsd4_revoke_states() never sets sc_status
before calling nfsd4_close_layout(). The retry loop therefore finds
the same layout stid on every iteration, hanging the revoker
indefinitely.

Fixes: 1e33e1414bec ("nfsd: allow layout state to be admin-revoked.")
Reported-by: Dai Ngo <dai.ngo@oracle.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Tested-by: Dai Ngo <dai.ngo@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4state.c

index 3cd8b3b59de4655c66f2a10827458ea12e5a62fe..c92bc0c110650e8bab66e52d7ccda1b963afa754 100644 (file)
@@ -1851,6 +1851,13 @@ void nfsd4_revoke_states(struct nfsd_net *nn, struct super_block *sb)
                                        break;
                                case SC_TYPE_LAYOUT:
                                        ls = layoutstateid(stid);
+                                       spin_lock(&clp->cl_lock);
+                                       if (stid->sc_status == 0) {
+                                               stid->sc_status |=
+                                                       SC_STATUS_ADMIN_REVOKED;
+                                               atomic_inc(&clp->cl_admin_revoked);
+                                       }
+                                       spin_unlock(&clp->cl_lock);
                                        nfsd4_close_layout(ls);
                                        break;
                                }