mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02: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:
parent
c00b472a13
commit
4f8ef58c10
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user