svn commit: r220761 - head/sys/fs/nfsclient

Rick Macklem rmacklem at FreeBSD.org
Sun Apr 17 23:04:04 UTC 2011


Author: rmacklem
Date: Sun Apr 17 23:04:03 2011
New Revision: 220761
URL: http://svn.freebsd.org/changeset/base/220761

Log:
  Add checks for MNTK_UNMOUNTF at the beginning of three
  functions, so that threads don't get stuck in them during
  a forced dismount. nfs_sync/VFS_SYNC() needs this, since it is
  called by dounmount() before VFS_UNMOUNT(). The nfscl_nget()
  case makes sure that a thread doing an VOP_OPEN() or
  VOP_ADVLOCK() call doesn't get blocked before attempting
  the RPC. Attempting RPCs don't block, since they all
  fail once a forced dismount is in progress.
  The third one at the beginning of nfsrpc_close()
  is done so threads don't get blocked while doing VOP_INACTIVE()
  as the vnodes are cleared out.
  With these three changes plus a change to the umount(1)
  command so that it doesn't do "sync()" for the forced case
  seem to make forced dismounts work for the experimental NFS
  client.
  
  MFC after:	2 weeks

Modified:
  head/sys/fs/nfsclient/nfs_clrpcops.c
  head/sys/fs/nfsclient/nfs_clstate.c
  head/sys/fs/nfsclient/nfs_clvfsops.c

Modified: head/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clrpcops.c	Sun Apr 17 22:31:36 2011	(r220760)
+++ head/sys/fs/nfsclient/nfs_clrpcops.c	Sun Apr 17 23:04:03 2011	(r220761)
@@ -567,6 +567,11 @@ nfsrpc_close(vnode_t vp, int doclose, NF
 
 	if (vnode_vtype(vp) != VREG)
 		return (0);
+
+	/* For forced unmounts, just return. */
+	if ((vp->v_mount->mnt_kern_flag & MNTK_UNMOUNTF) != 0)
+		return (0);
+
 	if (doclose)
 		error = nfscl_doclose(vp, &clp, p);
 	else

Modified: head/sys/fs/nfsclient/nfs_clstate.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clstate.c	Sun Apr 17 22:31:36 2011	(r220760)
+++ head/sys/fs/nfsclient/nfs_clstate.c	Sun Apr 17 23:04:03 2011	(r220761)
@@ -692,6 +692,10 @@ nfscl_getcl(vnode_t vp, struct ucred *cr
 	int igotlock = 0, error, trystalecnt, clidinusedelay, i;
 	u_int16_t idlen = 0;
 
+	/* For forced unmounts, just return an error. */
+	if ((vnode_mount(vp)->mnt_kern_flag & MNTK_UNMOUNTF) != 0)
+		return (EPERM);
+
 	if (cred != NULL) {
 		getcredhostuuid(cred, uuid, sizeof uuid);
 		idlen = strlen(uuid);

Modified: head/sys/fs/nfsclient/nfs_clvfsops.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clvfsops.c	Sun Apr 17 22:31:36 2011	(r220760)
+++ head/sys/fs/nfsclient/nfs_clvfsops.c	Sun Apr 17 23:04:03 2011	(r220761)
@@ -1386,6 +1386,10 @@ nfs_sync(struct mount *mp, int waitfor)
 
 	td = curthread;
 
+	/* For a forced unmount, just return EPERM. */
+	if ((mp->mnt_kern_flag & MNTK_UNMOUNTF) != 0)
+		return (EPERM);
+
 	/*
 	 * Force stale buffer cache information to be flushed.
 	 */


More information about the svn-src-all mailing list