Module Name:    src
Committed By:   hannken
Date:           Wed May 22 08:46:27 UTC 2019

Modified Files:
        src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_ioctl.c zvol.c

Log Message:
Add missing zvol_close() to zfsdev_close().

Change zvol_size_changed() to initialize "zv->zv_volsize"
and initialize only "dg_secsize" and "dg_secperunit".
Calling disk_set_info() will initialize the remaining
parts of the geometry.

Set "doread" in zvol_strategy() to make reading from
device possible.

Reorganize/add disk_busy()/disk_unbusy() instrumentation.

Redo zvol_ioctl() to implement DIOCGWEDGEINFO and let
disk_ioctl() process the remaining ioctls.


To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c
cvs rdiff -u -r1.10 -r1.11 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.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_ioctl.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.19 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.20
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.19	Wed May 22 08:45:32 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c	Wed May 22 08:46:27 2019
@@ -6285,6 +6285,7 @@ zfsdev_close(dev_t dev, int flag, int ot
 #ifdef __FreeBSD__
 		return;
 #else
+		return zvol_close(dev, flag, otyp, cr);
 		return 0;
 #endif
 	}
@@ -6303,7 +6304,7 @@ zfsdev_ioctl(struct cdev *dev, u_long zc
 #endif
 #ifdef __NetBSD__
 static int
-zfsdev_ioctl(dev_t dev, int zcmd, intptr_t iarg, int flag, cred_t *cr, int *rvalp)
+zfsdev_ioctl(dev_t dev, u_long zcmd, intptr_t iarg, int flag, cred_t *cr, int *rvalp)
 #endif
 {
 	zfs_cmd_t *zc;

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c:1.10 src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c:1.11
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c:1.10	Wed May 22 08:45:32 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c	Wed May 22 08:46:27 2019
@@ -315,29 +315,14 @@ zvol_size_changed(zvol_state_t *zv, uint
 	}
 #endif /* __FreeBSD__ */
 #ifdef __NetBSD__
-	prop_dictionary_t disk_info, odisk_info, geom;
-	struct disk *disk;
+	struct disk_geom *dg = &zv->zv_dk.dk_geom;
 
-	disk = &zv->zv_dk;
+	zv->zv_volsize = volsize;
 
-	disk_info = prop_dictionary_create();
-	geom = prop_dictionary_create();
-
-	prop_dictionary_set_cstring_nocopy(disk_info, "type", "ESDI");
-	prop_dictionary_set_uint64(geom, "sectors-per-unit", zv->zv_volsize);
-	prop_dictionary_set_uint32(geom, "sector-size",
-	    DEV_BSIZE /* XXX 512? */);
-	prop_dictionary_set_uint32(geom, "sectors-per-track", 32);
-	prop_dictionary_set_uint32(geom, "tracks-per-cylinder", 64);
-	prop_dictionary_set_uint32(geom, "cylinders-per-unit", zv->zv_volsize / 2048);
-	prop_dictionary_set(disk_info, "geometry", geom);
-	prop_object_release(geom);
-
-	odisk_info = disk->dk_info;
-	disk->dk_info = disk_info;
-
-	if (odisk_info != NULL)
-		prop_object_release(odisk_info);
+	memset(dg, 0, sizeof(*dg));
+	dg->dg_secsize = DEV_BSIZE; /* XXX 512? */
+	dg->dg_secperunit = zv->zv_volsize / dg->dg_secsize;;
+	disk_set_info(NULL, &zv->zv_dk, "ZVOL");
 #endif
 }
 
@@ -1793,7 +1778,7 @@ zvol_strategy(buf_t *bp)
 	objset_t *os;
 	rl_t *rl;
 	int error = 0;
-#ifdef illumos
+#if defined(illumos) || defined(__NetBSD__)
 	boolean_t doread = bp->b_flags & B_READ;
 #else
 	boolean_t doread = 0;
@@ -2136,6 +2121,12 @@ zvol_read(struct cdev *dev, struct uio *
 	}
 #endif
 
+#ifdef __NetBSD__
+	uint64_t resid = uio->uio_resid;
+	mutex_enter(&zv->zv_dklock);
+	disk_busy(&zv->zv_dk);
+	mutex_exit(&zv->zv_dklock);
+#endif
 	rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid,
 	    RL_READER);
 	while (uio->uio_resid > 0 && uio->uio_loffset < volsize) {
@@ -2154,6 +2145,11 @@ zvol_read(struct cdev *dev, struct uio *
 		}
 	}
 	zfs_range_unlock(rl);
+#ifdef __NetBSD__
+	mutex_enter(&zv->zv_dklock);
+	disk_unbusy(&zv->zv_dk, resid - uio->uio_resid, 1);
+	mutex_exit(&zv->zv_dklock);
+#endif
 	return (error);
 }
 
@@ -2205,6 +2201,12 @@ zvol_write(struct cdev *dev, struct uio 
 #endif
 	    (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS);
 
+#ifdef __NetBSD__
+	uint64_t resid = uio->uio_resid;
+	mutex_enter(&zv->zv_dklock);
+	disk_busy(&zv->zv_dk);
+	mutex_exit(&zv->zv_dklock);
+#endif
 	rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid,
 	    RL_WRITER);
 	while (uio->uio_resid > 0 && uio->uio_loffset < volsize) {
@@ -2232,6 +2234,11 @@ zvol_write(struct cdev *dev, struct uio 
 	zfs_range_unlock(rl);
 	if (sync)
 		zil_commit(zv->zv_zilog, ZVOL_OBJ);
+#ifdef __NetBSD__
+	mutex_enter(&zv->zv_dklock);
+	disk_unbusy(&zv->zv_dk, resid - uio->uio_resid, 0);
+	mutex_exit(&zv->zv_dklock);
+#endif
 	return (error);
 }
 
@@ -3568,42 +3575,33 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t 
 		return (ENXIO);
 	}
 
+	error = disk_ioctl(&zv->zv_dk, NODEV, cmd, (void *)arg, flag, curlwp);
+	if (error != EPASSTHROUGH) {
+		mutex_exit(&zfsdev_state_lock);
+		return error;
+	}
+
+	error = 0;
+
 	switch(cmd) {
 	case DIOCGWEDGEINFO:
 	{
 		struct dkwedge_info *dkw = (void *) arg;
-
-		strlcpy(dkw->dkw_devname, zv->zv_name, 16);
-		strlcpy(dkw->dkw_wname, zv->zv_name, MAXPATHLEN);
-		strlcpy(dkw->dkw_parent, zv->zv_name, 16);
+		
+		memset(dkw, 0, sizeof(*dkw));
+		strlcpy(dkw->dkw_devname, zv->zv_name,
+		    sizeof(dkw->dkw_devname));
+		strlcpy(dkw->dkw_parent, "ZFS", sizeof(dkw->dkw_parent));
 		
 		dkw->dkw_offset = 0;
-		/* XXX NetBSD supports only DEV_BSIZE device block
-		   size zv_volblocksize >> DEV_BSIZE*/
-		dkw->dkw_size = (zv->zv_volsize / DEV_BSIZE);
-		dprintf("dkw %"PRIu64" volsize %"PRIu64" volblock %"PRIu64" \n",
-		    dkw->dkw_size, zv->zv_volsize, zv->zv_volblocksize);
+		dkw->dkw_size = zv->zv_volsize / DEV_BSIZE;
 		strcpy(dkw->dkw_ptype, DKW_PTYPE_FFS);
 
 		break;
 	}
 
-	case DIOCGDISKINFO:
-	{
-		struct plistref *pref = (struct plistref *) arg;
-
-		if (zv->zv_dk.dk_info == NULL) {
-			mutex_exit(&zfsdev_state_lock);
-			return ENOTSUP;
-		} else
-			prop_dictionary_copyout_ioctl(pref, cmd,
-			    zv->zv_dk.dk_info);
-		
-		break;
-	}
-	
 	default:
-		aprint_debug("unknown disk_ioctl called\n");
+		dprintf("unknown disk_ioctl called\n");
 		error = ENOTTY;
 		break; 
 	}

Reply via email to