]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pnfs: Fix TLS logic in _nfs4_pnfs_v4_ds_connect()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 19 Oct 2025 00:10:34 +0000 (20:10 -0400)
committerAnna Schumaker <anna.schumaker@oracle.com>
Mon, 10 Nov 2025 15:32:28 +0000 (10:32 -0500)
Don't try to add an RDMA transport to a client that is already marked as
being a TCP/TLS transport.

Fixes: a35518cae4b3 ("NFSv4.1/pnfs: fix NFS with TLS in pnfs")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/nfs/pnfs_nfs.c

index ff48056bf750effdcdd8c1cc0d0e8dc08ea28182..9976cc16b6890bc82e7e2bb7e07d367eb67115a6 100644 (file)
@@ -884,7 +884,10 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
                                 u32 minor_version)
 {
        struct nfs_client *clp = ERR_PTR(-EIO);
+       struct nfs_client *mds_clp = mds_srv->nfs_client;
+       enum xprtsec_policies xprtsec_policy = mds_clp->cl_xprtsec.policy;
        struct nfs4_pnfs_ds_addr *da;
+       int ds_proto;
        int status = 0;
 
        dprintk("--> %s DS %s\n", __func__, ds->ds_remotestr);
@@ -912,12 +915,8 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
                                .data = &xprtdata,
                        };
 
-                       if (da->da_transport != clp->cl_proto &&
-                                       clp->cl_proto != XPRT_TRANSPORT_TCP_TLS)
-                               continue;
-                       if (da->da_transport == XPRT_TRANSPORT_TCP &&
-                               mds_srv->nfs_client->cl_proto ==
-                                       XPRT_TRANSPORT_TCP_TLS) {
+                       if (xprt_args.ident == XPRT_TRANSPORT_TCP &&
+                           clp->cl_proto == XPRT_TRANSPORT_TCP_TLS) {
                                struct sockaddr *addr =
                                        (struct sockaddr *)&da->da_addr;
                                struct sockaddr_in *sin =
@@ -948,7 +947,10 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
                                xprt_args.ident = XPRT_TRANSPORT_TCP_TLS;
                                xprt_args.servername = servername;
                        }
-                       if (da->da_addr.ss_family != clp->cl_addr.ss_family)
+                       if (xprt_args.ident != clp->cl_proto)
+                               continue;
+                       if (xprt_args.dstaddr->sa_family !=
+                           clp->cl_addr.ss_family)
                                continue;
 
                        /**
@@ -962,15 +964,14 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
                        if (xprtdata.cred)
                                put_cred(xprtdata.cred);
                } else {
-                       if (da->da_transport == XPRT_TRANSPORT_TCP &&
-                               mds_srv->nfs_client->cl_proto ==
-                                       XPRT_TRANSPORT_TCP_TLS)
-                               da->da_transport = XPRT_TRANSPORT_TCP_TLS;
-                       clp = nfs4_set_ds_client(mds_srv,
-                                               &da->da_addr,
-                                               da->da_addrlen,
-                                               da->da_transport, timeo,
-                                               retrans, minor_version);
+                       ds_proto = da->da_transport;
+                       if (ds_proto == XPRT_TRANSPORT_TCP &&
+                           xprtsec_policy != RPC_XPRTSEC_NONE)
+                               ds_proto = XPRT_TRANSPORT_TCP_TLS;
+
+                       clp = nfs4_set_ds_client(mds_srv, &da->da_addr,
+                                                da->da_addrlen, ds_proto,
+                                                timeo, retrans, minor_version);
                        if (IS_ERR(clp))
                                continue;
 
@@ -981,7 +982,6 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
                                clp = ERR_PTR(-EIO);
                                continue;
                        }
-
                }
        }