mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 03:11:11 -04:00
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: 1e33e1414b ("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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user