Module Name:    src
Committed By:   hannken
Date:           Mon Mar 18 09:20:58 UTC 2019

Modified Files:
        src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_ctldir.c
            zfs_vfsops.c zfs_vnops.c

Log Message:
Set "mnt_stat.f_fsid" and "mnt_stat.f_fsidx" from the objset guid
like FreeBSD and Illumos do.

Use "f_fsid" for "va_fsid" and cheat NFSD to export snapshots under
".zfs" by setting these snaphots "f_fsidx" to the parents "f_fsidx".


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c
cvs rdiff -u -r1.19 -r1.20 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
cvs rdiff -u -r1.46 -r1.47 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.6 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.7
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.6	Wed Feb 20 10:08:37 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c	Mon Mar 18 09:20:58 2019
@@ -1335,7 +1335,9 @@ sfs_snapshot_mount(vnode_t *vp, const ch
 	if (error)
 		goto out;
 
-	vfs_getnewfsid(vfsp);
+	/* Set f_fsidx from parent to cheat NFSD. */
+	vfsp->mnt_stat.f_fsidx = vp->v_vfsp->mnt_stat.f_fsidx;
+
 	strlcpy(vfsp->mnt_stat.f_mntfromname, osname,
 	    sizeof(vfsp->mnt_stat.f_mntfromname));
 	set_statvfs_info(path, UIO_SYSSPACE, vfsp->mnt_stat.f_mntfromname,
@@ -1622,7 +1624,7 @@ sfs_getattr(void *v)
 	vap->va_nlink = 2;
 	vap->va_uid = 0;
 	vap->va_gid = 0;
-	vap->va_fsid = vp->v_vfsp->mnt_stat.f_fsidx.__fsid_val[0];
+	vap->va_fsid = vp->v_vfsp->mnt_stat.f_fsid;
 	vap->va_fileid = node->sn_id;
 	vap->va_size = 0;
 	vap->va_blocksize = 0;

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.19 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.20
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.19	Tue Feb  5 09:54:36 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c	Mon Mar 18 09:20:58 2019
@@ -1374,7 +1374,9 @@ zfs_domount(vfs_t *vfsp, char *osname)
 #endif
 #ifdef __NetBSD__
 	vfsp->mnt_stat.f_fsidx.__fsid_val[0] = fsid_guid;
-	vfsp->mnt_stat.f_fsidx.__fsid_val[1] = fsid_guid >> 32;
+	vfsp->mnt_stat.f_fsidx.__fsid_val[1] = ((fsid_guid>>32) << 8) |
+	    makefstype(vfsp->mnt_op->vfs_name) & 0xFF;
+	vfsp->mnt_stat.f_fsid = fsid_guid;
 #endif
 
 	/*
@@ -1962,8 +1964,6 @@ zfs_mount(vfs_t *vfsp, const char *path,
 #endif
 
 #ifdef __NetBSD__
-	vfs_getnewfsid(vfsp);
-
 	/* setup zfs mount info */
 	strlcpy(vfsp->mnt_stat.f_mntfromname, osname,
 	    sizeof(vfsp->mnt_stat.f_mntfromname));
@@ -2036,7 +2036,8 @@ zfs_statvfs(vfs_t *vfsp, struct statvfs 
 	statp->f_fsid = d32;
 #endif
 #ifdef __NetBSD__
-	statp->f_fsid = vfsp->mnt_stat.f_fsidx.__fsid_val[0];
+	statp->f_fsid = vfsp->mnt_stat.f_fsid;
+	statp->f_fsidx = vfsp->mnt_stat.f_fsidx;
 #endif
 
 	/*

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.46 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.47
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.46	Mon Mar 18 09:20:15 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c	Mon Mar 18 09:20:58 2019
@@ -3073,7 +3073,7 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i
 	vap->va_nodeid = zp->z_id;
 #endif
 #ifdef __NetBSD__
-	vap->va_fsid = vp->v_mount->mnt_stat.f_fsidx.__fsid_val[0];
+	vap->va_fsid = vp->v_mount->mnt_stat.f_fsid;
 	vap->va_nodeid = zp->z_id;
 	/*
 	 * If we are a snapshot mounted under .zfs, return

Reply via email to