svn commit: r231636 - in stable/9/sys: fs/nfsclient nfsclient

Rick Macklem rmacklem at FreeBSD.org
Tue Feb 14 04:48:37 UTC 2012


Author: rmacklem
Date: Tue Feb 14 04:48:36 2012
New Revision: 231636
URL: http://svn.freebsd.org/changeset/base/231636

Log:
  MFC: r230803
  When a "mount -u" switches an NFS mount point from TCP to UDP,
  any thread doing an I/O RPC with a transfer size greater than
  NFS_UDPMAXDATA will be hung indefinitely, retrying the RPC.
  After a discussion on freebsd-fs@, I decided to add a warning
  message for this case, as suggested by Jeremy Chadwick.

Modified:
  stable/9/sys/fs/nfsclient/nfs_clvfsops.c
  stable/9/sys/nfsclient/nfs_vfsops.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/amd64/include/xen/   (props changed)
  stable/9/sys/boot/   (props changed)
  stable/9/sys/boot/i386/efi/   (props changed)
  stable/9/sys/boot/ia64/efi/   (props changed)
  stable/9/sys/boot/ia64/ski/   (props changed)
  stable/9/sys/boot/powerpc/boot1.chrp/   (props changed)
  stable/9/sys/boot/powerpc/ofw/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/contrib/dev/acpica/   (props changed)
  stable/9/sys/contrib/octeon-sdk/   (props changed)
  stable/9/sys/contrib/pf/   (props changed)
  stable/9/sys/contrib/x86emu/   (props changed)

Modified: stable/9/sys/fs/nfsclient/nfs_clvfsops.c
==============================================================================
--- stable/9/sys/fs/nfsclient/nfs_clvfsops.c	Tue Feb 14 04:20:02 2012	(r231635)
+++ stable/9/sys/fs/nfsclient/nfs_clvfsops.c	Tue Feb 14 04:48:36 2012	(r231636)
@@ -989,6 +989,19 @@ nfs_mount(struct mount *mp)
 			error = EIO;
 			goto out;
 		}
+
+		/*
+		 * If a change from TCP->UDP is done and there are thread(s)
+		 * that have I/O RPC(s) in progress with a tranfer size
+		 * greater than NFS_MAXDGRAMDATA, those thread(s) will be
+		 * hung, retrying the RPC(s) forever. Usually these threads
+		 * will be seen doing an uninterruptible sleep on wait channel
+		 * "newnfsreq" (truncated to "newnfsre" by procstat).
+		 */
+		if (args.sotype == SOCK_DGRAM && nmp->nm_sotype == SOCK_STREAM)
+			tprintf(td->td_proc, LOG_WARNING,
+	"Warning: mount -u that changes TCP->UDP can result in hung threads\n");
+
 		/*
 		 * When doing an update, we can't change version,
 		 * security, switch lockd strategies or change cookie

Modified: stable/9/sys/nfsclient/nfs_vfsops.c
==============================================================================
--- stable/9/sys/nfsclient/nfs_vfsops.c	Tue Feb 14 04:20:02 2012	(r231635)
+++ stable/9/sys/nfsclient/nfs_vfsops.c	Tue Feb 14 04:48:36 2012	(r231636)
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/socketvar.h>
 #include <sys/sockio.h>
 #include <sys/sysctl.h>
+#include <sys/syslog.h>
 #include <sys/vnode.h>
 #include <sys/signalvar.h>
 
@@ -1106,6 +1107,19 @@ nfs_mount(struct mount *mp)
 			error = EIO;
 			goto out;
 		}
+
+		/*
+		 * If a change from TCP->UDP is done and there are thread(s)
+		 * that have I/O RPC(s) in progress with a tranfer size
+		 * greater than NFS_MAXDGRAMDATA, those thread(s) will be
+		 * hung, retrying the RPC(s) forever. Usually these threads
+		 * will be seen doing an uninterruptible sleep on wait channel
+		 * "newnfsreq" (truncated to "newnfsre" by procstat).
+		 */
+		if (args.sotype == SOCK_DGRAM && nmp->nm_sotype == SOCK_STREAM)
+			tprintf(curthread->td_proc, LOG_WARNING,
+	"Warning: mount -u that changes TCP->UDP can result in hung threads\n");
+
 		/*
 		 * When doing an update, we can't change from or to
 		 * v3, switch lockd strategies or change cookie translation


More information about the svn-src-stable-9 mailing list