diff options
Diffstat (limited to 'fs/nfs/nfs4client.c')
| -rw-r--r-- | fs/nfs/nfs4client.c | 43 | 
1 files changed, 25 insertions, 18 deletions
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index aa9ef4876046..ffdb28d86cf8 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -482,6 +482,16 @@ int nfs40_walk_client_list(struct nfs_client *new,  	spin_lock(&nn->nfs_client_lock);  	list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { + +		if (pos->rpc_ops != new->rpc_ops) +			continue; + +		if (pos->cl_proto != new->cl_proto) +			continue; + +		if (pos->cl_minorversion != new->cl_minorversion) +			continue; +  		/* If "pos" isn't marked ready, we can't trust the  		 * remaining fields in "pos" */  		if (pos->cl_cons_state > NFS_CS_READY) { @@ -501,15 +511,6 @@ int nfs40_walk_client_list(struct nfs_client *new,  		if (pos->cl_cons_state != NFS_CS_READY)  			continue; -		if (pos->rpc_ops != new->rpc_ops) -			continue; - -		if (pos->cl_proto != new->cl_proto) -			continue; - -		if (pos->cl_minorversion != new->cl_minorversion) -			continue; -  		if (pos->cl_clientid != new->cl_clientid)  			continue; @@ -622,6 +623,16 @@ int nfs41_walk_client_list(struct nfs_client *new,  	spin_lock(&nn->nfs_client_lock);  	list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { + +		if (pos->rpc_ops != new->rpc_ops) +			continue; + +		if (pos->cl_proto != new->cl_proto) +			continue; + +		if (pos->cl_minorversion != new->cl_minorversion) +			continue; +  		/* If "pos" isn't marked ready, we can't trust the  		 * remaining fields in "pos", especially the client  		 * ID and serverowner fields.  Wait for CREATE_SESSION @@ -647,15 +658,6 @@ int nfs41_walk_client_list(struct nfs_client *new,  		if (pos->cl_cons_state != NFS_CS_READY)  			continue; -		if (pos->rpc_ops != new->rpc_ops) -			continue; - -		if (pos->cl_proto != new->cl_proto) -			continue; - -		if (pos->cl_minorversion != new->cl_minorversion) -			continue; -  		if (!nfs4_match_clientids(pos, new))  			continue; @@ -855,6 +857,11 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_client* mds_clp,  	};  	struct rpc_timeout ds_timeout;  	struct nfs_client *clp; +	char buf[INET6_ADDRSTRLEN + 1]; + +	if (rpc_ntop(ds_addr, buf, sizeof(buf)) <= 0) +		return ERR_PTR(-EINVAL); +	cl_init.hostname = buf;  	/*  	 * Set an authflavor equual to the MDS value. Use the MDS nfs_client  |