NFSv4: Fix a nfs4_state_manager() race
[ Upstream commited1cc05aa1
] If the NFS4CLNT_RUN_MANAGER flag got set just before we cleared NFS4CLNT_MANAGER_RUNNING, then we might have won the race against nfs4_schedule_state_manager(), and are responsible for handling the recovery situation. Fixes:aeabb3c961
("NFSv4: Fix a NFSv4 state manager deadlock") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
fcdd79fda3
Коммит
9fb4dfb8e2
|
@ -2699,6 +2699,13 @@ static void nfs4_state_manager(struct nfs_client *clp)
|
||||||
nfs4_end_drain_session(clp);
|
nfs4_end_drain_session(clp);
|
||||||
nfs4_clear_state_manager_bit(clp);
|
nfs4_clear_state_manager_bit(clp);
|
||||||
|
|
||||||
|
if (test_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state) &&
|
||||||
|
!test_and_set_bit(NFS4CLNT_MANAGER_RUNNING,
|
||||||
|
&clp->cl_state)) {
|
||||||
|
memflags = memalloc_nofs_save();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!test_and_set_bit(NFS4CLNT_RECALL_RUNNING, &clp->cl_state)) {
|
if (!test_and_set_bit(NFS4CLNT_RECALL_RUNNING, &clp->cl_state)) {
|
||||||
if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) {
|
if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) {
|
||||||
nfs_client_return_marked_delegations(clp);
|
nfs_client_return_marked_delegations(clp);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче