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