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;
}