From 1d44eb79b9ac674136c563ca77cb717b8de0bd6c Mon Sep 17 00:00:00 2001
From: Christoph Hellwig <hch@cloudius-systems.com>
Date: Thu, 25 Jul 2013 17:30:04 +0200
Subject: [PATCH] zfs: support cache flushes in vdev_disk

---
 .../opensolaris/uts/common/fs/zfs/vdev_disk.c | 25 +++++++++++++++----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/bsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c b/bsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
index cf5059830..5a5fedbdc 100644
--- a/bsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
+++ b/bsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
@@ -145,6 +145,24 @@ vdev_disk_start_bio(zio_t *zio)
 	return ZIO_PIPELINE_STOP;
 }
 
+static int
+vdev_disk_start_flush(zio_t *zio)
+{
+	vdev_t *vd = zio->io_vd;
+	struct vdev_disk *dvd = vd->vdev_tsd;
+	struct bio *bio;
+
+	bio = alloc_bio();
+	bio->bio_cmd = BIO_FLUSH;
+	bio->bio_dev = dvd->device;
+
+	bio->bio_caller1 = zio;
+	bio->bio_done = vdev_disk_bio_done;
+
+	bio->bio_dev->driver->devops->strategy(bio);
+	return ZIO_PIPELINE_STOP;
+}
+
 static int
 vdev_disk_start_ioctl(zio_t *zio)
 {
@@ -152,7 +170,7 @@ vdev_disk_start_ioctl(zio_t *zio)
 
 	switch (zio->io_cmd) {
 	case DKIOCFLUSHWRITECACHE:
-		if (1 || zfs_nocacheflush) {
+		if (zfs_nocacheflush) {
 			kprintf("DKIOCFLUSHWRITECACHE ignored\n");
 			break;
 		}
@@ -161,10 +179,7 @@ vdev_disk_start_ioctl(zio_t *zio)
 			break;
 		}
 
-		kprintf("DKIOCFLUSHWRITECACHE used\n");
-		abort();
-		break;
-
+		return vdev_disk_start_flush(zio);
 	default:
 		zio->io_error = ENOTSUP;
 		break;
-- 
GitLab