mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	NFS: make NFS client allocated per network namespace context
This patch adds new net variable to nfs_client structure. This variable is set on NFS client creation and cheched during matching NFS client search. Initially current->nsproxy->net_ns is used as network namespace owner for new NFS client to create. This network namespace pointer is set during mount options parsing and thus can be passed from user-spave utils in future if will be necessary. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
		
							parent
							
								
									ad6b134008
								
							
						
					
					
						commit
						e50a7a1a42
					
				
					 4 changed files with 18 additions and 3 deletions
				
			
		|  | @ -135,6 +135,7 @@ struct nfs_client_initdata { | |||
| 	const struct nfs_rpc_ops *rpc_ops; | ||||
| 	int proto; | ||||
| 	u32 minorversion; | ||||
| 	struct net *net; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -189,6 +190,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ | |||
| 	if (!IS_ERR(cred)) | ||||
| 		clp->cl_machine_cred = cred; | ||||
| 	nfs_fscache_get_client_cookie(clp); | ||||
| 	clp->net = cl_init->net; | ||||
| 
 | ||||
| 	return clp; | ||||
| 
 | ||||
|  | @ -481,6 +483,9 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat | |||
| 		/* Match the full socket address */ | ||||
| 		if (!nfs_sockaddr_cmp(sap, clap)) | ||||
| 			continue; | ||||
| 		/* Match network namespace */ | ||||
| 		if (clp->net != data->net) | ||||
| 			continue; | ||||
| 
 | ||||
| 		atomic_inc(&clp->cl_count); | ||||
| 		return clp; | ||||
|  | @ -831,6 +836,7 @@ static int nfs_init_server(struct nfs_server *server, | |||
| 		.addrlen = data->nfs_server.addrlen, | ||||
| 		.rpc_ops = &nfs_v2_clientops, | ||||
| 		.proto = data->nfs_server.protocol, | ||||
| 		.net = data->net, | ||||
| 	}; | ||||
| 	struct rpc_timeout timeparms; | ||||
| 	struct nfs_client *clp; | ||||
|  | @ -1393,7 +1399,7 @@ static int nfs4_set_client(struct nfs_server *server, | |||
| 		const char *ip_addr, | ||||
| 		rpc_authflavor_t authflavour, | ||||
| 		int proto, const struct rpc_timeout *timeparms, | ||||
| 		u32 minorversion) | ||||
| 		u32 minorversion, struct net *net) | ||||
| { | ||||
| 	struct nfs_client_initdata cl_init = { | ||||
| 		.hostname = hostname, | ||||
|  | @ -1402,6 +1408,7 @@ static int nfs4_set_client(struct nfs_server *server, | |||
| 		.rpc_ops = &nfs_v4_clientops, | ||||
| 		.proto = proto, | ||||
| 		.minorversion = minorversion, | ||||
| 		.net = net, | ||||
| 	}; | ||||
| 	struct nfs_client *clp; | ||||
| 	int error; | ||||
|  | @ -1453,6 +1460,7 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_client* mds_clp, | |||
| 		.rpc_ops = &nfs_v4_clientops, | ||||
| 		.proto = ds_proto, | ||||
| 		.minorversion = mds_clp->cl_minorversion, | ||||
| 		.net = mds_clp->net, | ||||
| 	}; | ||||
| 	struct rpc_timeout ds_timeout = { | ||||
| 		.to_initval = 15 * HZ, | ||||
|  | @ -1580,7 +1588,8 @@ static int nfs4_init_server(struct nfs_server *server, | |||
| 			data->auth_flavors[0], | ||||
| 			data->nfs_server.protocol, | ||||
| 			&timeparms, | ||||
| 			data->minorversion); | ||||
| 			data->minorversion, | ||||
| 			data->net); | ||||
| 	if (error < 0) | ||||
| 		goto error; | ||||
| 
 | ||||
|  | @ -1677,7 +1686,8 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, | |||
| 				data->authflavor, | ||||
| 				parent_server->client->cl_xprt->prot, | ||||
| 				parent_server->client->cl_timeout, | ||||
| 				parent_client->cl_mvops->minor_version); | ||||
| 				parent_client->cl_mvops->minor_version, | ||||
| 				parent_client->net); | ||||
| 	if (error < 0) | ||||
| 		goto error; | ||||
| 
 | ||||
|  |  | |||
|  | @ -123,6 +123,7 @@ struct nfs_parsed_mount_data { | |||
| 	} nfs_server; | ||||
| 
 | ||||
| 	struct security_mnt_opts lsm_opts; | ||||
| 	struct net		*net; | ||||
| }; | ||||
| 
 | ||||
| /* mount_clnt.c */ | ||||
|  |  | |||
|  | @ -52,6 +52,7 @@ | |||
| #include <linux/nfs_xdr.h> | ||||
| #include <linux/magic.h> | ||||
| #include <linux/parser.h> | ||||
| #include <linux/nsproxy.h> | ||||
| 
 | ||||
| #include <asm/system.h> | ||||
| #include <asm/uaccess.h> | ||||
|  | @ -1107,6 +1108,8 @@ static int nfs_parse_mount_options(char *raw, | |||
| 
 | ||||
| 	free_secdata(secdata); | ||||
| 
 | ||||
| 	mnt->net = current->nsproxy->net_ns; | ||||
| 
 | ||||
| 	while ((p = strsep(&raw, ",")) != NULL) { | ||||
| 		substring_t args[MAX_OPT_ARGS]; | ||||
| 		unsigned long option; | ||||
|  |  | |||
|  | @ -85,6 +85,7 @@ struct nfs_client { | |||
| #endif | ||||
| 
 | ||||
| 	struct server_scope	*server_scope;	/* from exchange_id */ | ||||
| 	struct net		*net; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Stanislav Kinsbursky
						Stanislav Kinsbursky