mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	NFSv4.1 test and add 4.1 trunking transport
For each location returned in FS_LOCATION query, establish a transport to the server, send EXCHANGE_ID and test for trunking, if successful, add the transport to the exiting client. Signed-off-by: Olga Kornievskaia <kolga@netapp.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
		
							parent
							
								
									b8a09619a5
								
							
						
					
					
						commit
						4ca9f31a2b
					
				
					 1 changed files with 55 additions and 1 deletions
				
			
		| 
						 | 
					@ -3935,6 +3935,56 @@ int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void test_fs_location_for_trunking(struct nfs4_fs_location *location,
 | 
				
			||||||
 | 
										  struct nfs_client *clp,
 | 
				
			||||||
 | 
										  struct nfs_server *server)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < location->nservers; i++) {
 | 
				
			||||||
 | 
							struct nfs4_string *srv_loc = &location->servers[i];
 | 
				
			||||||
 | 
							struct sockaddr addr;
 | 
				
			||||||
 | 
							size_t addrlen;
 | 
				
			||||||
 | 
							struct xprt_create xprt_args = {
 | 
				
			||||||
 | 
								.ident = 0,
 | 
				
			||||||
 | 
								.net = clp->cl_net,
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							struct nfs4_add_xprt_data xprtdata = {
 | 
				
			||||||
 | 
								.clp = clp,
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							struct rpc_add_xprt_test rpcdata = {
 | 
				
			||||||
 | 
								.add_xprt_test = clp->cl_mvops->session_trunk,
 | 
				
			||||||
 | 
								.data = &xprtdata,
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							char *servername = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!srv_loc->len)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							addrlen = nfs_parse_server_name(srv_loc->data, srv_loc->len,
 | 
				
			||||||
 | 
											&addr, sizeof(addr),
 | 
				
			||||||
 | 
											clp->cl_net, server->port);
 | 
				
			||||||
 | 
							if (!addrlen)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							xprt_args.dstaddr = &addr;
 | 
				
			||||||
 | 
							xprt_args.addrlen = addrlen;
 | 
				
			||||||
 | 
							servername = kmalloc(srv_loc->len + 1, GFP_KERNEL);
 | 
				
			||||||
 | 
							if (!servername)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							memcpy(servername, srv_loc->data, srv_loc->len);
 | 
				
			||||||
 | 
							servername[srv_loc->len] = '\0';
 | 
				
			||||||
 | 
							xprt_args.servername = servername;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							xprtdata.cred = nfs4_get_clid_cred(clp);
 | 
				
			||||||
 | 
							rpc_clnt_add_xprt(clp->cl_rpcclient, &xprt_args,
 | 
				
			||||||
 | 
									  rpc_clnt_setup_test_and_add_xprt,
 | 
				
			||||||
 | 
									  &rpcdata);
 | 
				
			||||||
 | 
							if (xprtdata.cred)
 | 
				
			||||||
 | 
								put_cred(xprtdata.cred);
 | 
				
			||||||
 | 
							kfree(servername);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int _nfs4_discover_trunking(struct nfs_server *server,
 | 
					static int _nfs4_discover_trunking(struct nfs_server *server,
 | 
				
			||||||
				   struct nfs_fh *fhandle)
 | 
									   struct nfs_fh *fhandle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -3944,7 +3994,7 @@ static int _nfs4_discover_trunking(struct nfs_server *server,
 | 
				
			||||||
	struct nfs_client *clp = server->nfs_client;
 | 
						struct nfs_client *clp = server->nfs_client;
 | 
				
			||||||
	const struct nfs4_state_maintenance_ops *ops =
 | 
						const struct nfs4_state_maintenance_ops *ops =
 | 
				
			||||||
		clp->cl_mvops->state_renewal_ops;
 | 
							clp->cl_mvops->state_renewal_ops;
 | 
				
			||||||
	int status = -ENOMEM;
 | 
						int status = -ENOMEM, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cred = ops->get_state_renewal_cred(clp);
 | 
						cred = ops->get_state_renewal_cred(clp);
 | 
				
			||||||
	if (cred == NULL) {
 | 
						if (cred == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -3962,6 +4012,10 @@ static int _nfs4_discover_trunking(struct nfs_server *server,
 | 
				
			||||||
					 cred);
 | 
										 cred);
 | 
				
			||||||
	if (status)
 | 
						if (status)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < locations->nlocations; i++)
 | 
				
			||||||
 | 
							test_fs_location_for_trunking(&locations->locations[i], clp,
 | 
				
			||||||
 | 
										      server);
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	if (page)
 | 
						if (page)
 | 
				
			||||||
		__free_page(page);
 | 
							__free_page(page);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue