svn commit: r308871 - head/sbin/umount

Rick Macklem rmacklem at FreeBSD.org
Sat Nov 19 23:58:51 UTC 2016


Author: rmacklem
Date: Sat Nov 19 23:58:50 2016
New Revision: 308871
URL: https://svnweb.freebsd.org/changeset/base/308871

Log:
  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.
  
  Suggested by:	cperciva
  Reviewed by:	cperciva
  MFC after:	2 weeks
  Differential Revision:	https://reviews.freebsd.org/D8503

Modified:
  head/sbin/umount/umount.c

Modified: head/sbin/umount/umount.c
==============================================================================
--- head/sbin/umount/umount.c	Sat Nov 19 22:01:58 2016	(r308870)
+++ head/sbin/umount/umount.c	Sat Nov 19 23:58:50 2016	(r308871)
@@ -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>
@@ -323,6 +324,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;
@@ -361,8 +365,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)) {
@@ -400,7 +420,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"));


More information about the svn-src-all mailing list