]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
NFS: pass struct nfs_client_initdata to nfs4_set_client
authorChristoph Hellwig <hch@lst.de>
Mon, 14 Jul 2025 06:30:45 +0000 (08:30 +0200)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 22 Jul 2025 12:10:17 +0000 (08:10 -0400)
Passed the partially filled out structure to nfs4_set_client instead of
11 arguments that then get stashed into the structure.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4client.c

index 162c85a83a14aecf101625432cc3b94cd4c6fa42..2e623da1a78794cc07f2885c5d2441b9e80fc083 100644 (file)
@@ -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 @@ error:
 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);