Commit f3fc8f06 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Trond Myklebust
Browse files

NFS: pass struct nfs_client_initdata to nfs4_set_client



Passed the partially filled out structure to nfs4_set_client instead of
11 arguments that then get stashed into the structure.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 7db6e666
Loading
Loading
Loading
Loading
+68 −83
Original line number Diff line number Diff line
@@ -895,55 +895,40 @@ nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr,
 * Set up an NFS4 client
 */
static int nfs4_set_client(struct nfs_server *server,
		const char *hostname,
		const struct sockaddr_storage *addr,
		const size_t addrlen,
		const char *ip_addr,
		int proto, const struct rpc_timeout *timeparms,
		u32 minorversion, unsigned int nconnect,
		unsigned int max_connect,
		struct net *net,
		struct xprtsec_parms *xprtsec)
		struct nfs_client_initdata *cl_init)
{
	struct nfs_client_initdata cl_init = {
		.hostname = hostname,
		.addr = addr,
		.addrlen = addrlen,
		.ip_addr = ip_addr,
		.nfs_mod = &nfs_v4,
		.proto = proto,
		.minorversion = minorversion,
		.net = net,
		.timeparms = timeparms,
		.cred = server->cred,
		.xprtsec = *xprtsec,
	};
	struct nfs_client *clp;

	if (minorversion == 0)
		__set_bit(NFS_CS_REUSEPORT, &cl_init.init_flags);
	else
		cl_init.max_connect = max_connect;
	switch (proto) {
	cl_init->nfs_mod = &nfs_v4;
	cl_init->cred = server->cred;

	if (cl_init->minorversion == 0) {
		__set_bit(NFS_CS_REUSEPORT, &cl_init->init_flags);
		cl_init->max_connect = 0;
	}

	switch (cl_init->proto) {
	case XPRT_TRANSPORT_RDMA:
	case XPRT_TRANSPORT_TCP:
	case XPRT_TRANSPORT_TCP_TLS:
		cl_init.nconnect = nconnect;
		break;
	default:
		cl_init->nconnect = 0;
	}

	if (server->flags & NFS_MOUNT_NORESVPORT)
		__set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags);
		__set_bit(NFS_CS_NORESVPORT, &cl_init->init_flags);
	if (server->options & NFS_OPTION_MIGRATION)
		__set_bit(NFS_CS_MIGRATION, &cl_init.init_flags);
		__set_bit(NFS_CS_MIGRATION, &cl_init->init_flags);
	if (test_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status))
		__set_bit(NFS_CS_TSM_POSSIBLE, &cl_init.init_flags);
	server->port = rpc_get_port((struct sockaddr *)addr);
		__set_bit(NFS_CS_TSM_POSSIBLE, &cl_init->init_flags);
	server->port = rpc_get_port((struct sockaddr *)cl_init->addr);

	if (server->flags & NFS_MOUNT_NETUNREACH_FATAL)
		__set_bit(NFS_CS_NETUNREACH_FATAL, &cl_init.init_flags);
		__set_bit(NFS_CS_NETUNREACH_FATAL, &cl_init->init_flags);

	/* Allocate or find a client reference we can use */
	clp = nfs_get_client(&cl_init);
	clp = nfs_get_client(cl_init);
	if (IS_ERR(clp))
		return PTR_ERR(clp);

@@ -1156,6 +1141,19 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc)
{
	struct nfs_fs_context *ctx = nfs_fc2context(fc);
	struct rpc_timeout timeparms;
	struct nfs_client_initdata cl_init = {
		.hostname = ctx->nfs_server.hostname,
		.addr = &ctx->nfs_server._address,
		.addrlen = ctx->nfs_server.addrlen,
		.ip_addr = ctx->client_address,
		.proto = ctx->nfs_server.protocol,
		.minorversion = ctx->minorversion,
		.net = fc->net_ns,
		.timeparms = &timeparms,
		.xprtsec = ctx->xprtsec,
		.nconnect = ctx->nfs_server.nconnect,
		.max_connect = ctx->nfs_server.max_connect,
	};
	int error;

	nfs_init_timeout_values(&timeparms, ctx->nfs_server.protocol,
@@ -1175,18 +1173,7 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc)
		ctx->selected_flavor = RPC_AUTH_UNIX;

	/* Get a client record */
	error = nfs4_set_client(server,
				ctx->nfs_server.hostname,
				&ctx->nfs_server._address,
				ctx->nfs_server.addrlen,
				ctx->client_address,
				ctx->nfs_server.protocol,
				&timeparms,
				ctx->minorversion,
				ctx->nfs_server.nconnect,
				ctx->nfs_server.max_connect,
				fc->net_ns,
				&ctx->xprtsec);
	error = nfs4_set_client(server, &cl_init);
	if (error < 0)
		return error;

@@ -1246,18 +1233,28 @@ struct nfs_server *nfs4_create_server(struct fs_context *fc)
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;
	struct nfs_server *parent_server = NFS_SB(ctx->clone_data.sb);
	struct nfs_client *parent_client = parent_server->nfs_client;
	struct nfs_client_initdata cl_init = {
		.hostname = ctx->nfs_server.hostname,
		.addr = &ctx->nfs_server._address,
		.addrlen = ctx->nfs_server.addrlen,
		.ip_addr = parent_client->cl_ipaddr,
		.minorversion = parent_client->cl_mvops->minor_version,
		.net = parent_client->cl_net,
		.timeparms = parent_server->client->cl_timeout,
		.xprtsec = parent_client->cl_xprtsec,
		.nconnect = parent_client->cl_nconnect,
		.max_connect = parent_client->cl_max_connect,
	};
	struct nfs_server *server;
	bool auth_probe;
	int error;

	server = nfs_alloc_server();
	if (!server)
		return ERR_PTR(-ENOMEM);

	parent_server = NFS_SB(ctx->clone_data.sb);
	parent_client = parent_server->nfs_client;

	server->cred = get_cred(parent_server->cred);

	/* Initialise the client representation from the parent server */
@@ -1266,38 +1263,17 @@ struct nfs_server *nfs4_create_referral_server(struct fs_context *fc)
	/* Get a client representation */
#if IS_ENABLED(CONFIG_SUNRPC_XPRT_RDMA)
	rpc_set_port(&ctx->nfs_server.address, NFS_RDMA_PORT);
	error = nfs4_set_client(server,
				ctx->nfs_server.hostname,
				&ctx->nfs_server._address,
				ctx->nfs_server.addrlen,
				parent_client->cl_ipaddr,
				XPRT_TRANSPORT_RDMA,
				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_xprtsec);
	cl_init.proto = XPRT_TRANSPORT_RDMA;
	error = nfs4_set_client(server, &cl_init);
	if (!error)
		goto init_server;
#endif	/* IS_ENABLED(CONFIG_SUNRPC_XPRT_RDMA) */

	proto = XPRT_TRANSPORT_TCP;
	cl_init.proto = XPRT_TRANSPORT_TCP;
	if (parent_client->cl_xprtsec.policy != RPC_XPRTSEC_NONE)
		proto = XPRT_TRANSPORT_TCP_TLS;
		cl_init.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,
				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_xprtsec);
	error = nfs4_set_client(server, &cl_init);
	if (error < 0)
		goto error;

@@ -1353,6 +1329,19 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname,
	char buf[INET6_ADDRSTRLEN + 1];
	struct sockaddr_storage address;
	struct sockaddr *localaddr = (struct sockaddr *)&address;
	struct nfs_client_initdata cl_init = {
		.hostname = hostname,
		.addr = sap,
		.addrlen = salen,
		.ip_addr = buf,
		.proto = clp->cl_proto,
		.minorversion = clp->cl_minorversion,
		.net = net,
		.timeparms = clnt->cl_timeout,
		.xprtsec = clp->cl_xprtsec,
		.nconnect = clp->cl_nconnect,
		.max_connect = clp->cl_max_connect,
	};
	int error;

	error = rpc_switch_client_transport(clnt, &xargs, clnt->cl_timeout);
@@ -1368,11 +1357,7 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname,

	nfs_server_remove_lists(server);
	set_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status);
	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_xprtsec);
	error = nfs4_set_client(server, &cl_init);
	clear_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status);
	if (error != 0) {
		nfs_server_insert_lists(server);