Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Jun 2016 14:37:18 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r301275 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201606031437.u53EbI26051616@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Fri Jun  3 14:37:18 2016
New Revision: 301275
URL: https://svnweb.freebsd.org/changeset/base/301275

Log:
  zfs: set VROOT / VV_ROOT consistently and in a single place
  
  This is a followup to r300131.
  
  A filesystem's root vnode can be reached not only through VSF_ROOT, but
  by other means as well.  For example, via a dot-dot lookup.
  Also, a root vnode can get reclaimed and then re-created.  For these
  reasons it was insufficient to clear VV_ROOT flag from a root vnode of a
  snapshot mounted under .zfs in zfsctl_snapdir_lookup().
  
  So, now we set the flag in zfs_znode_sa_init() only if a vnode
  represent a root of a filesystem or a standalone snapshot.
  That is, the flag is not set for snapshots mounted under .zfs.
  
  MFC after:	2 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c	Fri Jun  3 14:30:32 2016	(r301274)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c	Fri Jun  3 14:37:18 2016	(r301275)
@@ -1051,13 +1051,6 @@ relookup:
 			 */
 			VERIFY(zfsctl_snapshot_zname(dvp, nm, MAXNAMELEN, snapname) == 0);
 			goto domount;
-		} else {
-			/*
-			 * VROOT was set during the traverse call.  We need
-			 * to clear it since we're pretending to be part
-			 * of our parent's vfs.
-			 */
-			(*vpp)->v_flag &= ~VROOT;
 		}
 		mutex_exit(&sdp->sd_lock);
 		ZFS_EXIT(zfsvfs);
@@ -1132,7 +1125,6 @@ domount:
 		 */
 		ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs);
 		VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs;
-		(*vpp)->v_flag &= ~VROOT;
 	}
 	ZFS_EXIT(zfsvfs);
 

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	Fri Jun  3 14:30:32 2016	(r301274)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	Fri Jun  3 14:37:18 2016	(r301275)
@@ -574,9 +574,10 @@ zfs_znode_sa_init(zfsvfs_t *zfsvfs, znod
 	zp->z_is_sa = (obj_type == DMU_OT_SA) ? B_TRUE : B_FALSE;
 
 	/*
-	 * Slap on VROOT if we are the root znode
+	 * Slap on VROOT if we are the root znode unless we are the root
+	 * node of a snapshot mounted under .zfs.
 	 */
-	if (zp->z_id == zfsvfs->z_root)
+	if (zp->z_id == zfsvfs->z_root && zfsvfs->z_parent == zfsvfs)
 		ZTOV(zp)->v_flag |= VROOT;
 
 	mutex_exit(&zp->z_lock);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606031437.u53EbI26051616>