Module Name:    src
Committed By:   hannken
Date:           Mon Apr 15 12:59:38 UTC 2019

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

Log Message:
Add support for fifos, character and block devices.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
cvs rdiff -u -r1.47 -r1.48 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c
cvs rdiff -u -r1.25 -r1.26 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.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_vfsops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.21 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.22
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.21	Mon Mar 18 09:22:14 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c	Mon Apr 15 12:59:38 2019
@@ -147,10 +147,14 @@ void zfs_init(void);
 void zfs_fini(void);
 
 extern const struct vnodeopv_desc zfs_vnodeop_opv_desc;
+extern const struct vnodeopv_desc zfs_specop_opv_desc;
+extern const struct vnodeopv_desc zfs_fifoop_opv_desc;
 extern const struct vnodeopv_desc zfs_sfsop_opv_desc;
 
 static const struct vnodeopv_desc * const zfs_vnodeop_descs[] = {
 	&zfs_vnodeop_opv_desc,
+	&zfs_specop_opv_desc,
+	&zfs_fifoop_opv_desc,
 	&zfs_sfsop_opv_desc,
 	NULL,
 };

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.47 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.48
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.47	Mon Mar 18 09:20:58 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c	Mon Apr 15 12:59:38 2019
@@ -81,6 +81,7 @@
 
 #ifdef __NetBSD__
 #include <dev/mm.h>
+#include <miscfs/fifofs/fifo.h>
 #include <miscfs/genfs/genfs.h>
 #include <miscfs/genfs/genfs_node.h>
 #include <uvm/uvm_extern.h>
@@ -5072,16 +5073,39 @@ static int
 zfs_netbsd_read(void *v)
 {
 	struct vop_read_args *ap = v;
+	vnode_t *vp = ap->a_vp;
+	znode_t *zp = VTOZ(vp);
 
-	return (zfs_read(ap->a_vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL));
+	switch (vp->v_type) {
+	case VBLK:
+	case VCHR:
+		ZFS_ACCESSTIME_STAMP(zp->z_zfsvfs, zp);
+		return (VOCALL(spec_vnodeop_p, VOFFSET(vop_read), ap));
+	case VFIFO:
+		ZFS_ACCESSTIME_STAMP(zp->z_zfsvfs, zp);
+		return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_read), ap));
+	}
+
+	return (zfs_read(vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL));
 }
 
 static int
 zfs_netbsd_write(void *v)
 {
 	struct vop_write_args *ap = v;
+	vnode_t *vp = ap->a_vp;
 
-	return (zfs_write(ap->a_vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL));
+	switch (vp->v_type) {
+	case VBLK:
+	case VCHR:
+		GOP_MARKUPDATE(vp, GOP_UPDATE_MODIFIED);
+		return (VOCALL(spec_vnodeop_p, VOFFSET(vop_write), ap));
+	case VFIFO:
+		GOP_MARKUPDATE(vp, GOP_UPDATE_MODIFIED);
+		return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_write), ap));
+	}
+
+	return (zfs_write(vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL));
 }
 
 static int
@@ -5278,6 +5302,44 @@ zfs_netbsd_create(void *v)
 }
 
 static int
+zfs_netbsd_mknod(void *v)
+{
+	struct vop_mknod_v3_args /* {
+		struct vnode *a_dvp;
+		struct vnode **a_vpp;
+		struct componentname *a_cnp;
+		struct vattr *a_vap;
+	} */ *ap = v;
+	struct vnode *dvp = ap->a_dvp;
+	struct vnode **vpp = ap->a_vpp;
+	struct componentname *cnp = ap->a_cnp;
+	struct vattr *vap = ap->a_vap;
+	char *nm;
+	int mode;
+	int error;
+
+	KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE);
+
+	vattr_init_mask(vap);
+	mode = vap->va_mode & ALLPERMS;
+
+	/* ZFS wants a null-terminated name. */
+	nm = PNBUF_GET();
+	(void)strlcpy(nm, cnp->cn_nameptr, cnp->cn_namelen + 1);
+
+	/* XXX !EXCL is wrong here...  */
+	error = zfs_create(dvp, nm, vap, !EXCL, mode, vpp, cnp->cn_cred, NULL);
+
+	PNBUF_PUT(nm);
+
+	KASSERT((error == 0) == (*vpp != NULL));
+	KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE);
+	VOP_UNLOCK(*vpp, 0);
+
+	return (error);
+}
+
+static int
 zfs_netbsd_remove(void *v)
 {
 	struct vop_remove_v2_args /* {
@@ -6149,6 +6211,7 @@ const struct vnodeopv_entry_desc zfs_vno
 	{ &vop_default_desc,		vn_default_error },
 	{ &vop_lookup_desc,		zfs_netbsd_lookup },
 	{ &vop_create_desc,		zfs_netbsd_create },
+	{ &vop_mknod_desc,		zfs_netbsd_mknod },
 	{ &vop_open_desc,		zfs_netbsd_open },
 	{ &vop_close_desc,		zfs_netbsd_close },
 	{ &vop_access_desc,		zfs_netbsd_access },
@@ -6185,4 +6248,87 @@ const struct vnodeopv_entry_desc zfs_vno
 const struct vnodeopv_desc zfs_vnodeop_opv_desc =
 	{ &zfs_vnodeop_p, zfs_vnodeop_entries };
 
+int (**zfs_specop_p)(void *);
+const struct vnodeopv_entry_desc zfs_specop_entries[] = {
+	{ &vop_default_desc,		vn_default_error },
+	{ &vop_lookup_desc,		spec_lookup },
+	{ &vop_create_desc,		spec_create },
+	{ &vop_mknod_desc,		spec_mknod },
+	{ &vop_open_desc,		spec_open },
+	{ &vop_close_desc,		spec_close },
+	{ &vop_access_desc,		zfs_netbsd_access },
+	{ &vop_getattr_desc,		zfs_netbsd_getattr },
+	{ &vop_setattr_desc,		zfs_netbsd_setattr },
+	{ &vop_read_desc,		/**/zfs_netbsd_read },
+	{ &vop_write_desc,		/**/zfs_netbsd_write },
+	{ &vop_ioctl_desc,		spec_ioctl },
+	{ &vop_fsync_desc,		zfs_netbsd_fsync },
+	{ &vop_remove_desc,		spec_remove },
+	{ &vop_link_desc,		spec_link },
+	{ &vop_lock_desc,		zfs_netbsd_lock },
+	{ &vop_unlock_desc,		zfs_netbsd_unlock },
+	{ &vop_rename_desc,		spec_rename },
+	{ &vop_mkdir_desc,		spec_mkdir },
+	{ &vop_rmdir_desc,		spec_rmdir },
+	{ &vop_symlink_desc,		spec_symlink },
+	{ &vop_readdir_desc,		spec_readdir },
+	{ &vop_readlink_desc,		spec_readlink },
+	{ &vop_inactive_desc,		zfs_netbsd_inactive },
+	{ &vop_reclaim_desc,		zfs_netbsd_reclaim },
+	{ &vop_pathconf_desc,		spec_pathconf },
+	{ &vop_seek_desc,		spec_seek },
+	{ &vop_getpages_desc,		spec_getpages },
+	{ &vop_putpages_desc,		spec_putpages },
+	{ &vop_mmap_desc,		spec_mmap },
+	{ &vop_islocked_desc,		zfs_netbsd_islocked },
+	{ &vop_advlock_desc,		spec_advlock },
+	{ &vop_print_desc,		zfs_netbsd_print },
+	{ &vop_fcntl_desc,		zfs_netbsd_fcntl },
+	{ NULL, NULL }
+};
+
+const struct vnodeopv_desc zfs_specop_opv_desc =
+	{ &zfs_specop_p, zfs_specop_entries };
+
+int (**zfs_fifoop_p)(void *);
+const struct vnodeopv_entry_desc zfs_fifoop_entries[] = {
+	{ &vop_default_desc,		vn_default_error },
+	{ &vop_lookup_desc,		vn_fifo_bypass },
+	{ &vop_create_desc,		vn_fifo_bypass },
+	{ &vop_mknod_desc,		vn_fifo_bypass },
+	{ &vop_open_desc,		vn_fifo_bypass },
+	{ &vop_close_desc,		vn_fifo_bypass },
+	{ &vop_access_desc,		zfs_netbsd_access },
+	{ &vop_getattr_desc,		zfs_netbsd_getattr },
+	{ &vop_setattr_desc,		zfs_netbsd_setattr },
+	{ &vop_read_desc,		/**/zfs_netbsd_read },
+	{ &vop_write_desc,		/**/zfs_netbsd_write },
+	{ &vop_ioctl_desc,		vn_fifo_bypass },
+	{ &vop_fsync_desc,		zfs_netbsd_fsync },
+	{ &vop_remove_desc,		vn_fifo_bypass },
+	{ &vop_link_desc,		vn_fifo_bypass },
+	{ &vop_lock_desc,		zfs_netbsd_lock },
+	{ &vop_unlock_desc,		zfs_netbsd_unlock },
+	{ &vop_rename_desc,		vn_fifo_bypass },
+	{ &vop_mkdir_desc,		vn_fifo_bypass },
+	{ &vop_rmdir_desc,		vn_fifo_bypass },
+	{ &vop_symlink_desc,		vn_fifo_bypass },
+	{ &vop_readdir_desc,		vn_fifo_bypass },
+	{ &vop_readlink_desc,		vn_fifo_bypass },
+	{ &vop_inactive_desc,		zfs_netbsd_inactive },
+	{ &vop_reclaim_desc,		zfs_netbsd_reclaim },
+	{ &vop_pathconf_desc,		vn_fifo_bypass },
+	{ &vop_seek_desc,		vn_fifo_bypass },
+	{ &vop_putpages_desc,		vn_fifo_bypass },
+	{ &vop_mmap_desc,		vn_fifo_bypass },
+	{ &vop_islocked_desc,		zfs_netbsd_islocked },
+	{ &vop_advlock_desc,		vn_fifo_bypass },
+	{ &vop_print_desc,		zfs_netbsd_print },
+	{ &vop_fcntl_desc,		zfs_netbsd_fcntl },
+	{ NULL, NULL }
+};
+
+const struct vnodeopv_desc zfs_fifoop_opv_desc =
+	{ &zfs_fifoop_p, zfs_fifoop_entries };
+
 #endif /* __NetBSD__ */

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c:1.25 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c:1.26
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c:1.25	Tue Feb  5 09:54:36 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c	Mon Apr 15 12:59:38 2019
@@ -727,6 +727,7 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_bu
 #ifdef illumos
 			vp->v_rdev = zfs_cmpldev(rdev);
 #else
+			vp->v_op = zfs_specop_p;
 	        	spec_node_init(vp, zfs_cmpldev(rdev));
 #endif
 		}
@@ -734,7 +735,7 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_bu
 #endif
 	case VFIFO:
 #ifdef __NetBSD__
-		/* XXX NetBSD vp->v_op = zfs_fifoop_p; */
+		vp->v_op = zfs_fifoop_p;
 		break;
 #else /* __NetBSD__ */
 #ifdef illumos

Reply via email to