Commit 28e19737 authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker
Browse files

pnfs: Fix TLS logic in _nfs4_pnfs_v4_ds_connect()



Don't try to add an RDMA transport to a client that is already marked as
being a TCP/TLS transport.

Fixes: a35518ca ("NFSv4.1/pnfs: fix NFS with TLS in pnfs")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarAnna Schumaker <anna.schumaker@oracle.com>
parent 7aca00d9
Loading
Loading
Loading
Loading
+17 −17
Original line number Diff line number Diff line
@@ -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;
			}

		}
	}