mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
NFSv4: Avoid unnecessary scans of filesystems for returning delegations
The amount of looping through the list of delegations is occasionally
leading to soft lockups. If the state manager was asked to return
delegations asynchronously, it should only scan those filesystems that
hold delegations that need to be returned.
Fixes: af3b61bf61 ("NFSv4: Clean up nfs_client_return_marked_delegations()")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
47acca884f
commit
35a566a24e
|
|
@ -79,6 +79,7 @@ static void nfs_mark_return_delegation(struct nfs_server *server,
|
|||
struct nfs_delegation *delegation)
|
||||
{
|
||||
set_bit(NFS_DELEGATION_RETURN, &delegation->flags);
|
||||
set_bit(NFS4SERV_DELEGRETURN, &server->delegation_flags);
|
||||
set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
|
||||
}
|
||||
|
||||
|
|
@ -608,6 +609,9 @@ static int nfs_server_return_marked_delegations(struct nfs_server *server,
|
|||
struct nfs_delegation *place_holder_deleg = NULL;
|
||||
int err = 0;
|
||||
|
||||
if (!test_and_clear_bit(NFS4SERV_DELEGRETURN,
|
||||
&server->delegation_flags))
|
||||
return 0;
|
||||
restart:
|
||||
/*
|
||||
* To avoid quadratic looping we hold a reference
|
||||
|
|
@ -659,6 +663,7 @@ static int nfs_server_return_marked_delegations(struct nfs_server *server,
|
|||
cond_resched();
|
||||
if (!err)
|
||||
goto restart;
|
||||
set_bit(NFS4SERV_DELEGRETURN, &server->delegation_flags);
|
||||
set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -250,6 +250,8 @@ struct nfs_server {
|
|||
struct list_head ss_copies;
|
||||
struct list_head ss_src_copies;
|
||||
|
||||
unsigned long delegation_flags;
|
||||
#define NFS4SERV_DELEGRETURN (1)
|
||||
unsigned long delegation_gen;
|
||||
unsigned long mig_gen;
|
||||
unsigned long mig_status;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user