Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Dec 2016 21:56:46 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r309518 - stable/10/sbin/umount
Message-ID:  <201612032156.uB3Lukdr038464@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Sat Dec  3 21:56:46 2016
New Revision: 309518
URL: https://svnweb.freebsd.org/changeset/base/309518

Log:
  MFC: r308871
  Modify umount so that it does not do an Unmount RPC for NFSv4 mounts
  and uses TCP for the Unmount RPC if the mount is over TCP.
  Without this patch, umount does an Unmount RPC over UDP for all NFS mounts.

Modified:
  stable/10/sbin/umount/umount.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/umount/umount.c
==============================================================================
--- stable/10/sbin/umount/umount.c	Sat Dec  3 21:49:26 2016	(r309517)
+++ stable/10/sbin/umount/umount.c	Sat Dec  3 21:56:46 2016	(r309518)
@@ -49,6 +49,7 @@ static const char rcsid[] =
 #include <netdb.h>
 #include <rpc/rpc.h>
 #include <rpcsvc/mount.h>
+#include <nfs/nfssvc.h>
 
 #include <ctype.h>
 #include <err.h>
@@ -317,6 +318,9 @@ umountfs(struct statfs *sfs)
 	CLIENT *clp;
 	char *nfsdirname, *orignfsdirname;
 	char *hostp, *delimp;
+	char buf[1024];
+	struct nfscl_dumpmntopts dumpmntopts;
+	const char *proto_ptr = NULL;
 
 	ai = NULL;
 	do_rpc = 0;
@@ -355,8 +359,24 @@ umountfs(struct statfs *sfs)
 		 * mount from mntfromname that is still mounted.
 		 */
 		if (getmntentry(sfs->f_mntfromname, NULL, NULL,
-		    CHECKUNIQUE) != NULL)
+		    CHECKUNIQUE) != NULL) {
 			do_rpc = 1;
+			proto_ptr = "udp";
+			/*
+			 * Try and find out whether this NFS mount is NFSv4 and
+			 * what protocol is being used. If this fails, the
+			 * default is NFSv2,3 and use UDP for the Unmount RPC.
+			 */
+			dumpmntopts.ndmnt_fname = sfs->f_mntonname;
+			dumpmntopts.ndmnt_buf = buf;
+			dumpmntopts.ndmnt_blen = sizeof(buf);
+			if (nfssvc(NFSSVC_DUMPMNTOPTS, &dumpmntopts) >= 0) {
+				if (strstr(buf, "nfsv4,") != NULL)
+					do_rpc = 0;
+				else if (strstr(buf, ",tcp,") != NULL)
+					proto_ptr = "tcp";
+			}
+		}
 	}
 
 	if (!namematch(ai)) {
@@ -394,7 +414,7 @@ umountfs(struct statfs *sfs)
 	 * has been unmounted.
 	 */
 	if (ai != NULL && !(fflag & MNT_FORCE) && do_rpc) {
-		clp = clnt_create(hostp, MOUNTPROG, MOUNTVERS3, "udp");
+		clp = clnt_create(hostp, MOUNTPROG, MOUNTVERS3, proto_ptr);
 		if (clp  == NULL) {
 			warnx("%s: %s", hostp,
 			    clnt_spcreateerror("MOUNTPROG"));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612032156.uB3Lukdr038464>