Thu Jun 25 09:39:15 2020 UTC ()
Don't assume everything is a wedge and has a parent device. On non-wedges
this crashes.

Instead, just talk to the referenced device and rely on the dk driver
to pass requests correctly.


(mlelstv)
diff -r1.17 -r1.18 src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c

cvs diff -r1.17 -r1.18 src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c (expand / switch to unified diff)

--- src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c 2020/06/21 21:29:11 1.17
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c 2020/06/25 09:39:15 1.18
@@ -212,39 +212,38 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi @@ -212,39 +212,38 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi
212 &vp, CRCREAT, 0); 212 &vp, CRCREAT, 0);
213 if (error != 0) { 213 if (error != 0) {
214 vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED; 214 vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
215 return (SET_ERROR(error)); 215 return (SET_ERROR(error));
216 } 216 }
217 if (vp->v_type != VBLK) { 217 if (vp->v_type != VBLK) {
218 vrele(vp); 218 vrele(vp);
219 vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED; 219 vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
220 return (SET_ERROR(EINVAL)); 220 return (SET_ERROR(EINVAL));
221 } 221 }
222 222
223 pdk = NULL; 223 pdk = NULL;
224 if (getdiskinfo(vp, &dkw) == 0) 224 if (getdiskinfo(vp, &dkw) == 0)
225 pdk = disk_find(dkw.dkw_parent); 225 pdk = disk_find(dkw.dkw_devname);
226 226
227 /* XXXNETBSD Once tls-maxphys gets merged this block becomes: 227 /* XXXNETBSD Once tls-maxphys gets merged this block becomes:
228 dvd->vd_maxphys = (pdk ? disk_maxphys(pdk) : MACHINE_MAXPHYS); 228 dvd->vd_maxphys = (pdk ? disk_maxphys(pdk) : MACHINE_MAXPHYS);
229 */ 229 */
230 { 230 {
231 struct buf buf = { 231 struct buf buf = {
 232 .b_dev = vp->v_rdev,
232 .b_bcount = MAXPHYS, 233 .b_bcount = MAXPHYS,
233 }; 234 };
234 if (pdk && pdk->dk_driver && pdk->dk_driver->d_minphys) { 235 if (pdk && pdk->dk_driver && pdk->dk_driver->d_minphys)
235 buf.b_dev = pdk->dk_rawvp->v_rdev; 
236 (*pdk->dk_driver->d_minphys)(&buf); 236 (*pdk->dk_driver->d_minphys)(&buf);
237 } 
238 dvd->vd_maxphys = buf.b_bcount; 237 dvd->vd_maxphys = buf.b_bcount;
239 } 238 }
240 239
241 /* 240 /*
242 * XXXNETBSD Compare the devid to the stored value. 241 * XXXNETBSD Compare the devid to the stored value.
243 */ 242 */
244 243
245 /* 244 /*
246 * Create a workqueue to process cache-flushes concurrently. 245 * Create a workqueue to process cache-flushes concurrently.
247 */ 246 */
248 error = workqueue_create(&dvd->vd_wq, "vdevsync", 247 error = workqueue_create(&dvd->vd_wq, "vdevsync",
249 vdev_disk_flush, dvd, PRI_NONE, IPL_NONE, WQ_MPSAFE); 248 vdev_disk_flush, dvd, PRI_NONE, IPL_NONE, WQ_MPSAFE);
250 if (error != 0) { 249 if (error != 0) {