Module Name: src
Committed By: hannken
Date: Sun May 26 10:22:59 UTC 2019
Modified Files:
src/external/cddl/osnet/dist/uts/common/fs/zfs: vdev_disk.c
Log Message:
upport wedges as vdevs, use DIOCGWEDGEINFO before DIOCGPARTINFO.
PR kern/54219 zpool create pool dk5 causes kernel panic
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.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/vdev_disk.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.8 src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.9
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.8 Mon Sep 3 16:29:22 2018
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c Sun May 26 10:22:59 2019
@@ -34,6 +34,7 @@
#include <sys/zio.h>
#include <sys/sunldi.h>
#include <sys/fm/fs/zfs.h>
+#include <sys/disk.h>
#include <sys/disklabel.h>
#include <sys/dkio.h>
#include <sys/workqueue.h>
@@ -146,6 +147,8 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi
spa_t *spa = vd->vdev_spa;
vdev_disk_t *dvd;
vnode_t *vp;
+ struct dkwedge_info dkw;
+ struct disk *pdk;
int error, cmd;
struct partinfo pinfo;
@@ -235,9 +238,20 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi
skip_open:
/*
* Determine the actual size of the device.
- * XXXNETBSD wedges.
+ * Try wedge info first as it supports larger disks.
*/
- error = VOP_IOCTL(vp, DIOCGPARTINFO, &pinfo, FREAD|FWRITE, kcred);
+ error = VOP_IOCTL(vp, DIOCGWEDGEINFO, &dkw, FREAD, NOCRED);
+ if (error == 0) {
+ pdk = disk_find(dkw.dkw_parent);
+ if (pdk) {
+ pinfo.pi_secsize = (1 << pdk->dk_byteshift);
+ pinfo.pi_size = dkw.dkw_size;
+ pinfo.pi_offset = dkw.dkw_offset;
+ } else
+ error = ENODEV;
+ }
+ if (error)
+ error = VOP_IOCTL(vp, DIOCGPARTINFO, &pinfo, FREAD, kcred);
if (error != 0) {
vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
return (SET_ERROR(error));