4218b4
autofs-5.1.7 - refactor get_nfs_info()
4218b4
4218b4
From: Ian Kent <raven@themaw.net>
4218b4
4218b4
Make getting a portmap client and getting a service port from portmap
4218b4
helper functions and simplify the return handling.
4218b4
4218b4
Signed-off-by: Ian Kent <raven@themaw.net>
4218b4
---
4218b4
 CHANGELOG            |    1 
4218b4
 modules/replicated.c |  135 ++++++++++++++++++++++++++++-----------------------
4218b4
 2 files changed, 76 insertions(+), 60 deletions(-)
4218b4
4218b4
--- autofs-5.1.7.orig/CHANGELOG
4218b4
+++ autofs-5.1.7/CHANGELOG
4218b4
@@ -97,6 +97,7 @@
4218b4
 - remove nonstrict parameter from tree_mapent_umount_offsets().
4218b4
 - fix handling of incorrect return from umount_ent().
4218b4
 - make NFS version check flags consistent.
4218b4
+- refactor get_nfs_info().
4218b4
 
4218b4
 25/01/2021 autofs-5.1.7
4218b4
 - make bind mounts propagation slave by default.
4218b4
--- autofs-5.1.7.orig/modules/replicated.c
4218b4
+++ autofs-5.1.7/modules/replicated.c
4218b4
@@ -223,6 +223,49 @@ void free_host_list(struct host **list)
4218b4
 	*list = NULL;
4218b4
 }
4218b4
 
4218b4
+static unsigned int get_portmap_client(unsigned logopt,
4218b4
+			struct conn_info *pm_info, struct host *host,
4218b4
+			int proto)
4218b4
+{
4218b4
+	unsigned int status;
4218b4
+
4218b4
+	/* On success client is stored in pm_info->client */
4218b4
+	status = rpc_portmap_getclient(pm_info,
4218b4
+			host->name, host->addr, host->addr_len,
4218b4
+			proto, RPC_CLOSE_DEFAULT);
4218b4
+	if (status == -EHOSTUNREACH)
4218b4
+		debug(logopt,
4218b4
+		      "host not reachable getting portmap client");
4218b4
+	else if (status)
4218b4
+		debug(logopt, "error 0x%d getting portmap client");
4218b4
+
4218b4
+	return status;
4218b4
+}
4218b4
+
4218b4
+static unsigned int get_portmap_port(unsigned logopt,
4218b4
+		struct conn_info *pm_info, struct pmap *parms,
4218b4
+		unsigned long vers, unsigned int version,
4218b4
+		short unsigned int *port)
4218b4
+{
4218b4
+	unsigned int status;
4218b4
+	short unsigned int nfs_port;
4218b4
+
4218b4
+	parms->pm_vers = vers;
4218b4
+	status = rpc_portmap_getport(pm_info, parms, &nfs_port);
4218b4
+	if (status == -EHOSTUNREACH || status == -ETIMEDOUT) {
4218b4
+		debug(logopt,
4218b4
+		      "host not reachable or timed out getting service port");
4218b4
+	} else if (status < 0) {
4218b4
+		if (!(version & NFS_VERS_MASK))
4218b4
+			debug(logopt, "error 0x%d getting service port");
4218b4
+	}
4218b4
+
4218b4
+	if (!status)
4218b4
+		*port = nfs_port;
4218b4
+
4218b4
+	return status;
4218b4
+}
4218b4
+
4218b4
 static unsigned int get_nfs_info(unsigned logopt, struct host *host,
4218b4
 			 struct conn_info *pm_info, struct conn_info *rpc_info,
4218b4
 			 int proto, unsigned int version, int port)
4218b4
@@ -263,33 +306,20 @@ static unsigned int get_nfs_info(unsigne
4218b4
 		goto v3_ver;
4218b4
 
4218b4
 	if (!port) {
4218b4
-		status = rpc_portmap_getclient(pm_info,
4218b4
-				host->name, host->addr, host->addr_len,
4218b4
-				proto, RPC_CLOSE_DEFAULT);
4218b4
-		if (status == -EHOSTUNREACH) {
4218b4
-			debug(logopt,
4218b4
-			      "host not reachable getting portmap client");
4218b4
-			supported = status;
4218b4
-			goto done_ver;
4218b4
-		} else if (status) {
4218b4
-			debug(logopt, "error 0x%d getting portmap client");
4218b4
+		status = get_portmap_client(logopt, pm_info, host, proto);
4218b4
+		if (status) {
4218b4
+			if (status == -EHOSTUNREACH)
4218b4
+				supported = status;
4218b4
 			goto done_ver;
4218b4
 		}
4218b4
-		parms.pm_vers = NFS4_VERSION;
4218b4
-		status = rpc_portmap_getport(pm_info, &parms, &rpc_info->port);
4218b4
-		if (status == -EHOSTUNREACH || status == -ETIMEDOUT) {
4218b4
-			debug(logopt,
4218b4
-			      "host not reachable or timed out getting service port");
4218b4
-			supported = status;
4218b4
-			goto done_ver;
4218b4
-		} else if (status < 0) {
4218b4
-			if (version & NFS_VERS_MASK)
4218b4
+		status = get_portmap_port(logopt, pm_info, &parms,
4218b4
+				NFS4_VERSION, version, &rpc_info->port);
4218b4
+		if (status) {
4218b4
+			if (status == -EHOSTUNREACH || status == -ETIMEDOUT)
4218b4
+				supported = status;
4218b4
+			if (status < 0 && version & NFS_VERS_MASK)
4218b4
 				goto v3_ver; /* MOUNT_NFS_DEFAULT_PROTOCOL=4 */
4218b4
-			else {
4218b4
-				debug(logopt,
4218b4
-				      "error 0x%d getting service port");
4218b4
-				goto done_ver;
4218b4
-			}
4218b4
+			goto done_ver;
4218b4
 		}
4218b4
 	}
4218b4
 
4218b4
@@ -334,31 +364,22 @@ v3_ver:
4218b4
 		goto v2_ver;
4218b4
 
4218b4
 	if (!port && !pm_info->client) {
4218b4
-		status = rpc_portmap_getclient(pm_info,
4218b4
-				host->name, host->addr, host->addr_len,
4218b4
-				proto, RPC_CLOSE_DEFAULT);
4218b4
-		if (status == -EHOSTUNREACH) {
4218b4
-			debug(logopt,
4218b4
-			      "host not reachable getting portmap client");
4218b4
-			supported = status;
4218b4
-			goto done_ver;
4218b4
-		} else if (status) {
4218b4
-			debug(logopt,
4218b4
-			      "error 0x%d getting getting portmap client");
4218b4
+		status = get_portmap_client(logopt, pm_info, host, proto);
4218b4
+		if (status) {
4218b4
+			if (status == -EHOSTUNREACH)
4218b4
+				supported = status;
4218b4
 			goto done_ver;
4218b4
 		}
4218b4
 	}
4218b4
 
4218b4
 	if (!port) {
4218b4
-		parms.pm_vers = NFS3_VERSION;
4218b4
-		status = rpc_portmap_getport(pm_info, &parms, &rpc_info->port);
4218b4
-		if (status == -EHOSTUNREACH || status == -ETIMEDOUT) {
4218b4
-			debug(logopt,
4218b4
-			      "host not reachable or timed out getting service port");
4218b4
-			supported = status;
4218b4
+		status = get_portmap_port(logopt, pm_info, &parms,
4218b4
+				NFS3_VERSION, version, &rpc_info->port);
4218b4
+		if (status) {
4218b4
+			if (status == -EHOSTUNREACH || status == -ETIMEDOUT)
4218b4
+				supported = status;
4218b4
 			goto done_ver;
4218b4
-		} else if (status < 0)
4218b4
-			goto v2_ver;
4218b4
+		}
4218b4
 	}
4218b4
 
4218b4
 	if (rpc_info->proto == IPPROTO_UDP)
4218b4
@@ -399,28 +420,22 @@ v2_ver:
4218b4
 		goto done_ver;
4218b4
 
4218b4
 	if (!port && !pm_info->client) {
4218b4
-		status = rpc_portmap_getclient(pm_info,
4218b4
-				host->name, host->addr, host->addr_len,
4218b4
-				proto, RPC_CLOSE_DEFAULT);
4218b4
-		if (status == -EHOSTUNREACH) {
4218b4
-			debug(logopt,
4218b4
-			      "host not reachable getting portmap client");
4218b4
-			supported = status;
4218b4
-			goto done_ver;
4218b4
-		} else if (status)
4218b4
+		status = get_portmap_client(logopt, pm_info, host, proto);
4218b4
+		if (status) {
4218b4
+			if (status == -EHOSTUNREACH)
4218b4
+				supported = status;
4218b4
 			goto done_ver;
4218b4
+		}
4218b4
 	}
4218b4
 
4218b4
 	if (!port) {
4218b4
-		parms.pm_vers = NFS2_VERSION;
4218b4
-		status = rpc_portmap_getport(pm_info, &parms, &rpc_info->port);
4218b4
-		if (status == -EHOSTUNREACH || status == -ETIMEDOUT) {
4218b4
-			debug(logopt,
4218b4
-			      "host not reachable or timed out getting service port");
4218b4
-			supported = status;
4218b4
-			goto done_ver;
4218b4
-		} else if (status < 0)
4218b4
+		status = get_portmap_port(logopt, pm_info, &parms,
4218b4
+				NFS2_VERSION, version, &rpc_info->port);
4218b4
+		if (status) {
4218b4
+			if (status == -EHOSTUNREACH || status == -ETIMEDOUT)
4218b4
+				supported = status;
4218b4
 			goto done_ver;
4218b4
+		}
4218b4
 	}
4218b4
 
4218b4
 	if (rpc_info->proto == IPPROTO_UDP)