svn commit: r217567 - stable/8/sys/fs/nfsserver

Rick Macklem rmacklem at FreeBSD.org
Wed Jan 19 01:26:49 UTC 2011


Author: rmacklem
Date: Wed Jan 19 01:26:49 2011
New Revision: 217567
URL: http://svn.freebsd.org/changeset/base/217567

Log:
  MFC: r217176
  Modify readdirplus in the experimental NFS server in a
  manner analogous to r216633 for the regular server. This
  change busies the file system so that VFS_VGET() is
  guaranteed to be using the correct mount point even
  during a forced dismount attempt. Since nfsd_fhtovp() is
  not called immediately before readdirplus, the patch is
  actually a clone of pjd@'s nfs_serv.c.4.patch instead of
  the one committed in r216633.

Modified:
  stable/8/sys/fs/nfsserver/nfs_nfsdport.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- stable/8/sys/fs/nfsserver/nfs_nfsdport.c	Wed Jan 19 00:57:58 2011	(r217566)
+++ stable/8/sys/fs/nfsserver/nfs_nfsdport.c	Wed Jan 19 01:26:49 2011	(r217567)
@@ -1685,6 +1685,7 @@ nfsrvd_readdirplus(struct nfsrv_descript
 	struct iovec iv;
 	struct componentname cn;
 	int not_zfs;
+	struct mount *mp;
 
 	if (nd->nd_repstat) {
 		nfsrv_postopattr(nd, getret, &at);
@@ -1854,7 +1855,24 @@ again:
 		toff = off;
 		goto again;
 	}
+
+	/*
+	 * Busy the file system so that the mount point won't go away
+	 * and, as such, VFS_VGET() can be used safely.
+	 */
+	mp = vp->v_mount;
+	vfs_ref(mp);
 	VOP_UNLOCK(vp, 0);
+	nd->nd_repstat = vfs_busy(mp, 0);
+	vfs_rel(mp);
+	if (nd->nd_repstat != 0) {
+		vrele(vp);
+		free(cookies, M_TEMP);
+		free(rbuf, M_TEMP);
+		if (nd->nd_flag & ND_NFSV3)
+			nfsrv_postopattr(nd, getret, &at);
+		return (0);
+	}
 
 	/*
 	 * Save this position, in case there is an error before one entry
@@ -1914,9 +1932,8 @@ again:
 					    vp, dp->d_fileno);
 				if (refp == NULL) {
 					if (usevget)
-						r = VFS_VGET(vp->v_mount,
-						    dp->d_fileno, LK_SHARED,
-						    &nvp);
+						r = VFS_VGET(mp, dp->d_fileno,
+						    LK_SHARED, &nvp);
 					else
 						r = EOPNOTSUPP;
 					if (r == EOPNOTSUPP) {
@@ -2035,6 +2052,7 @@ again:
 		ncookies--;
 	}
 	vrele(vp);
+	vfs_unbusy(mp);
 
 	/*
 	 * If dirlen > cnt, we must strip off the last entry. If that


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