Commit 4f8ef58c authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Fix infinite loop in layout state revocation



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: 1e33e141 ("nfsd: allow layout state to be admin-revoked.")
Reported-by: default avatarDai Ngo <dai.ngo@oracle.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Tested-by: default avatarDai Ngo <dai.ngo@oracle.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent c00b472a
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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;
				}