Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/cddl/osnet/dist/uts/common/fs/zfs upport wedges as ...



details:   https://anonhg.NetBSD.org/src/rev/ee550a690fcb
branches:  trunk
changeset: 451518:ee550a690fcb
user:      hannken <hannken%NetBSD.org@localhost>
date:      Sun May 26 10:22:59 2019 +0000

description:
upport wedges as vdevs, use DIOCGWEDGEINFO before DIOCGPARTINFO.

PR kern/54219 zpool create pool dk5 causes kernel panic

diffstat:

 external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c |  18 ++++++++++++++++--
 1 files changed, 16 insertions(+), 2 deletions(-)

diffs (43 lines):

diff -r 4fe89874ae1e -r ee550a690fcb external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c
--- a/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c    Sun May 26 10:22:07 2019 +0000
+++ b/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c    Sun May 26 10:22:59 2019 +0000
@@ -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 @@
        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 @@
 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));



Home | Main Index | Thread Index | Old Index