Searched hist:c156618e15101a9cc8c815108fec0300a0ec6637 (Results 1 – 2 of 2) sorted by relevance
/linux/fs/nfs/ |
H A D | nfs4client.c | diff c156618e15101a9cc8c815108fec0300a0ec6637 Tue Dec 05 19:55:44 CET 2017 Scott Mayhew <smayhew@redhat.com> nfs: fix a deadlock in nfs client initialization
The following deadlock can occur between a process waiting for a client to initialize in while walking the client list during nfsv4 server trunking detection and another process waiting for the nfs_clid_init_mutex so it can initialize that client:
Process 1 Process 2 --------- --------- spin_lock(&nn->nfs_client_lock); list_add_tail(&CLIENTA->cl_share_link, &nn->nfs_client_list); spin_unlock(&nn->nfs_client_lock); spin_lock(&nn->nfs_client_lock); list_add_tail(&CLIENTB->cl_share_link, &nn->nfs_client_list); spin_unlock(&nn->nfs_client_lock); mutex_lock(&nfs_clid_init_mutex); nfs41_walk_client_list(clp, result, cred); nfs_wait_client_init_complete(CLIENTA); (waiting for nfs_clid_init_mutex)
Make sure nfs_match_client() only evaluates clients that have completed initialization in order to prevent that deadlock.
This patch also fixes v4.0 trunking behavior by not marking the client NFS_CS_READY until the clientid has been confirmed.
Signed-off-by: Scott Mayhew <smayhew@redhat.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
|
H A D | client.c | diff c156618e15101a9cc8c815108fec0300a0ec6637 Tue Dec 05 19:55:44 CET 2017 Scott Mayhew <smayhew@redhat.com> nfs: fix a deadlock in nfs client initialization
The following deadlock can occur between a process waiting for a client to initialize in while walking the client list during nfsv4 server trunking detection and another process waiting for the nfs_clid_init_mutex so it can initialize that client:
Process 1 Process 2 --------- --------- spin_lock(&nn->nfs_client_lock); list_add_tail(&CLIENTA->cl_share_link, &nn->nfs_client_list); spin_unlock(&nn->nfs_client_lock); spin_lock(&nn->nfs_client_lock); list_add_tail(&CLIENTB->cl_share_link, &nn->nfs_client_list); spin_unlock(&nn->nfs_client_lock); mutex_lock(&nfs_clid_init_mutex); nfs41_walk_client_list(clp, result, cred); nfs_wait_client_init_complete(CLIENTA); (waiting for nfs_clid_init_mutex)
Make sure nfs_match_client() only evaluates clients that have completed initialization in order to prevent that deadlock.
This patch also fixes v4.0 trunking behavior by not marking the client NFS_CS_READY until the clientid has been confirmed.
Signed-off-by: Scott Mayhew <smayhew@redhat.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
|