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
This commit is contained in:
parent
28e3357884
commit
a68789426a
@ -1051,13 +1051,6 @@ zfsctl_snapdir_lookup(ap)
|
||||
*/
|
||||
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 @@ zfsctl_snapdir_lookup(ap)
|
||||
*/
|
||||
ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs);
|
||||
VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs;
|
||||
(*vpp)->v_flag &= ~VROOT;
|
||||
}
|
||||
ZFS_EXIT(zfsvfs);
|
||||
|
||||
|
@ -574,9 +574,10 @@ zfs_znode_sa_init(zfsvfs_t *zfsvfs, znode_t *zp,
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user