summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2009-09-08 15:51:40 +0000
committerpjd <pjd@FreeBSD.org>2009-09-08 15:51:40 +0000
commit57ba4d8ec0188487a846982bfab3bd067fec199e (patch)
treef0856bad65e7debfcd630f644a1c39c15c0f2418 /sys/cddl
parent38aadfb10c071b497823121f1539fc3db7abbafa (diff)
downloadFreeBSD-src-57ba4d8ec0188487a846982bfab3bd067fec199e.zip
FreeBSD-src-57ba4d8ec0188487a846982bfab3bd067fec199e.tar.gz
When we automatically mount snapshot we want to return vnode of the mount point
from the lookup and not covered vnode. This is one of the fixes for using .zfs/ over NFS. MFC after: 1 week
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
index 72db1f0..e845a99 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
@@ -882,9 +882,25 @@ domount:
dvp->v_vfsp->mnt_stat.f_mntonname, nm);
err = domount(curthread, *vpp, "zfs", mountpoint, snapname, 0);
kmem_free(mountpoint, mountpoint_len);
- /* FreeBSD: This line was moved from below to avoid a lock recursion. */
- if (err == 0)
- vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY);
+ if (err == 0) {
+ vnode_t *mvp;
+
+ ASSERT((*vpp)->v_mountedhere != NULL);
+ err = VFS_ROOT((*vpp)->v_mountedhere, LK_EXCLUSIVE, &mvp);
+ ASSERT(err == 0);
+ VN_RELE(*vpp);
+ *vpp = mvp;
+
+ /*
+ * Fix up the root vnode mounted on .zfs/snapshot/<snapname>.
+ *
+ * This is where we lie about our v_vfsp in order to
+ * make .zfs/snapshot/<snapname> accessible over NFS
+ * without requiring manual mounts of <snapname>.
+ */
+ ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs);
+ VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs;
+ }
mutex_exit(&sdp->sd_lock);
/*
* If we had an error, drop our hold on the vnode and
OpenPOWER on IntegriCloud