|
|
@@ -290,6 +290,7 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat
|
|
|
struct nfs_client *clp;
|
|
|
const struct sockaddr *sap = data->addr;
|
|
|
struct nfs_net *nn = net_generic(data->net, nfs_net_id);
|
|
|
+ int error;
|
|
|
|
|
|
again:
|
|
|
list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) {
|
|
|
@@ -302,8 +303,10 @@ again:
|
|
|
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);
|
|
|
+ error = nfs_wait_client_init_complete(clp);
|
|
|
nfs_put_client(clp);
|
|
|
+ if (error < 0)
|
|
|
+ return ERR_PTR(error);
|
|
|
spin_lock(&nn->nfs_client_lock);
|
|
|
goto again;
|
|
|
}
|
|
|
@@ -413,6 +416,8 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
|
|
|
clp = nfs_match_client(cl_init);
|
|
|
if (clp) {
|
|
|
spin_unlock(&nn->nfs_client_lock);
|
|
|
+ if (IS_ERR(clp))
|
|
|
+ return clp;
|
|
|
if (new)
|
|
|
new->rpc_ops->free_client(new);
|
|
|
return nfs_found_client(cl_init, clp);
|