diff options
Diffstat (limited to 'fs/nfs/nfs4client.c')
| -rw-r--r-- | fs/nfs/nfs4client.c | 44 | 
1 files changed, 33 insertions, 11 deletions
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index d3051b051a56..d9114a754db7 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -18,6 +18,7 @@  #include "nfs4idmap.h"  #include "pnfs.h"  #include "netns.h" +#include "sysfs.h"  #define NFSDBG_FACILITY		NFSDBG_CLIENT @@ -896,7 +897,8 @@ static int nfs4_set_client(struct nfs_server *server,  		int proto, const struct rpc_timeout *timeparms,  		u32 minorversion, unsigned int nconnect,  		unsigned int max_connect, -		struct net *net) +		struct net *net, +		struct xprtsec_parms *xprtsec)  {  	struct nfs_client_initdata cl_init = {  		.hostname = hostname, @@ -909,6 +911,7 @@ static int nfs4_set_client(struct nfs_server *server,  		.net = net,  		.timeparms = timeparms,  		.cred = server->cred, +		.xprtsec = *xprtsec,  	};  	struct nfs_client *clp; @@ -916,8 +919,11 @@ static int nfs4_set_client(struct nfs_server *server,  		__set_bit(NFS_CS_REUSEPORT, &cl_init.init_flags);  	else  		cl_init.max_connect = max_connect; -	if (proto == XPRT_TRANSPORT_TCP) +	switch (proto) { +	case XPRT_TRANSPORT_TCP: +	case XPRT_TRANSPORT_TCP_TLS:  		cl_init.nconnect = nconnect; +	}  	if (server->flags & NFS_MOUNT_NORESVPORT)  		__set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); @@ -947,6 +953,9 @@ static int nfs4_set_client(struct nfs_server *server,  	set_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state);  	server->nfs_client = clp; +	nfs_sysfs_add_server(server); +	nfs_sysfs_link_rpc_client(server, clp->cl_rpcclient, "_state"); +  	return 0;  } @@ -978,6 +987,7 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,  		.net = mds_clp->cl_net,  		.timeparms = &ds_timeout,  		.cred = mds_srv->cred, +		.xprtsec = mds_srv->nfs_client->cl_xprtsec,  	};  	char buf[INET6_ADDRSTRLEN + 1]; @@ -985,9 +995,13 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,  		return ERR_PTR(-EINVAL);  	cl_init.hostname = buf; -	if (mds_clp->cl_nconnect > 1 && ds_proto == XPRT_TRANSPORT_TCP) { -		cl_init.nconnect = mds_clp->cl_nconnect; -		cl_init.max_connect = NFS_MAX_TRANSPORTS; +	switch (ds_proto) { +	case XPRT_TRANSPORT_TCP: +	case XPRT_TRANSPORT_TCP_TLS: +		if (mds_clp->cl_nconnect > 1) { +			cl_init.nconnect = mds_clp->cl_nconnect; +			cl_init.max_connect = NFS_MAX_TRANSPORTS; +		}  	}  	if (mds_srv->flags & NFS_MOUNT_NORESVPORT) @@ -1157,7 +1171,8 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc)  				ctx->minorversion,  				ctx->nfs_server.nconnect,  				ctx->nfs_server.max_connect, -				fc->net_ns); +				fc->net_ns, +				&ctx->xprtsec);  	if (error < 0)  		return error; @@ -1219,8 +1234,8 @@ struct nfs_server *nfs4_create_referral_server(struct fs_context *fc)  	struct nfs_fs_context *ctx = nfs_fc2context(fc);  	struct nfs_client *parent_client;  	struct nfs_server *server, *parent_server; +	int proto, error;  	bool auth_probe; -	int error;  	server = nfs_alloc_server();  	if (!server) @@ -1247,23 +1262,28 @@ struct nfs_server *nfs4_create_referral_server(struct fs_context *fc)  				parent_client->cl_mvops->minor_version,  				parent_client->cl_nconnect,  				parent_client->cl_max_connect, -				parent_client->cl_net); +				parent_client->cl_net, +				&parent_client->cl_xprtsec);  	if (!error)  		goto init_server;  #endif	/* IS_ENABLED(CONFIG_SUNRPC_XPRT_RDMA) */ +	proto = XPRT_TRANSPORT_TCP; +	if (parent_client->cl_xprtsec.policy != RPC_XPRTSEC_NONE) +		proto = XPRT_TRANSPORT_TCP_TLS;  	rpc_set_port(&ctx->nfs_server.address, NFS_PORT);  	error = nfs4_set_client(server,  				ctx->nfs_server.hostname,  				&ctx->nfs_server._address,  				ctx->nfs_server.addrlen,  				parent_client->cl_ipaddr, -				XPRT_TRANSPORT_TCP, +				proto,  				parent_server->client->cl_timeout,  				parent_client->cl_mvops->minor_version,  				parent_client->cl_nconnect,  				parent_client->cl_max_connect, -				parent_client->cl_net); +				parent_client->cl_net, +				&parent_client->cl_xprtsec);  	if (error < 0)  		goto error; @@ -1314,6 +1334,7 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname,  		.dstaddr	= (struct sockaddr *)sap,  		.addrlen	= salen,  		.servername	= hostname, +		/* cel: bleh. We might need to pass TLS parameters here */  	};  	char buf[INET6_ADDRSTRLEN + 1];  	struct sockaddr_storage address; @@ -1336,7 +1357,8 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname,  	error = nfs4_set_client(server, hostname, sap, salen, buf,  				clp->cl_proto, clnt->cl_timeout,  				clp->cl_minorversion, -				clp->cl_nconnect, clp->cl_max_connect, net); +				clp->cl_nconnect, clp->cl_max_connect, +				net, &clp->cl_xprtsec);  	clear_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status);  	if (error != 0) {  		nfs_server_insert_lists(server);  |