Module Name: src Committed By: hannken Date: Tue Jun 11 09:04:37 UTC 2019
Modified Files: src/external/cddl/osnet/dist/uts/common/fs/zfs: vdev_disk.c src/external/cddl/osnet/dist/uts/common/fs/zfs/sys: vdev_disk.h Log Message: Try to retrieve the per-disk maximum transfer size and use it instead of MAXPHYS. Eagerly waiting for the merge of tls-maxphys. Addresses PR port-xen/54273: "zpool create pool xbd2" panics DOMU kernel To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 \ src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c cvs rdiff -u -r1.3 -r1.4 \ src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/vdev_disk.h 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.9 src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.10 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c:1.9 Sun May 26 10:22:59 2019 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_disk.c Tue Jun 11 09:04:37 2019 @@ -219,6 +219,27 @@ vdev_disk_open(vdev_t *vd, uint64_t *psi return (SET_ERROR(EINVAL)); } + /* XXXNETBSD Once tls-maxphys gets merged this block becomes: + pdk = disk_find_blk(vp->v_rdev); + dvd->vd_maxphys = (pdk ? disk_maxphys(pdk) : MACHINE_MAXPHYS); + */ + { + struct buf buf = { b_bcount: MAXPHYS }; + const char *dev_name; + + dev_name = devsw_blk2name(major(vp->v_rdev)); + if (dev_name) { + char disk_name[16]; + + snprintf(disk_name, sizeof(disk_name), "%s%d", + dev_name, DISKUNIT(vp->v_rdev)); + pdk = disk_find(disk_name); + if (pdk && pdk->dk_driver && pdk->dk_driver->d_minphys) + (*pdk->dk_driver->d_minphys)(&buf); + } + dvd->vd_maxphys = buf.b_bcount; + } + /* * XXXNETBSD Compare the devid to the stored value. */ @@ -421,6 +442,7 @@ vdev_disk_io_start(zio_t *zio) zio_interrupt(zio); return; } + ASSERT3U(dvd->vd_maxphys, >, 0); vp = dvd->vd_vp; #endif @@ -473,7 +495,7 @@ vdev_disk_io_start(zio_t *zio) mutex_exit(vp->v_interlock); } - if (bp->b_bcount <= MAXPHYS) { + if (bp->b_bcount <= dvd->vd_maxphys) { /* We can do this I/O in one pass. */ (void)VOP_STRATEGY(vp, bp); } else { @@ -484,7 +506,7 @@ vdev_disk_io_start(zio_t *zio) resid = zio->io_size; off = 0; while (resid != 0) { - size = uimin(resid, MAXPHYS); + size = uimin(resid, dvd->vd_maxphys); nbp = getiobuf(vp, true); nbp->b_blkno = btodb(zio->io_offset + off); /* Below call increments v_numoutput. */ Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/vdev_disk.h diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/vdev_disk.h:1.3 src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/vdev_disk.h:1.4 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/vdev_disk.h:1.3 Mon May 28 21:05:07 2018 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/vdev_disk.h Tue Jun 11 09:04:37 2019 @@ -52,6 +52,7 @@ typedef struct vdev_disk { char *vd_minor; vnode_t *vd_vp; struct workqueue *vd_wq; + int vd_maxphys; #endif } vdev_disk_t; #endif