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

Reply via email to