diff options
Diffstat (limited to 'fs/nfs/client.c')
| -rw-r--r-- | fs/nfs/client.c | 11 | 
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 0ac2fb1c6b63..b9129e2befea 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -291,12 +291,23 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat  	const struct sockaddr *sap = data->addr;  	struct nfs_net *nn = net_generic(data->net, nfs_net_id); +again:  	list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) {  	        const struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;  		/* Don't match clients that failed to initialise properly */  		if (clp->cl_cons_state < 0)  			continue; +		/* If a client is still initializing then we need to wait */ +		if (clp->cl_cons_state > NFS_CS_READY) { +			refcount_inc(&clp->cl_count); +			spin_unlock(&nn->nfs_client_lock); +			nfs_wait_client_init_complete(clp); +			nfs_put_client(clp); +			spin_lock(&nn->nfs_client_lock); +			goto again; +		} +  		/* Different NFS versions cannot share the same nfs_client */  		if (clp->rpc_ops != data->nfs_mod->rpc_ops)  			continue;  | 
