68be554e71
Use the current ZFS 2.2.4 staging tree [0] with commit deb7a8423 ("Fix corruption caused by mmap flushing problems") on top. Additionally, include an open, but ack'd, pull request [1] that avoids a potential general protection fault due to touching a vbio after it was handed off to the kernel. [0]: https://github.com/openzfs/zfs/commits/zfs-2.2.4-staging/ [1]: https://github.com/openzfs/zfs/pull/16049 Both should mostly touch the module code. Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
70 lines
2.0 KiB
Diff
70 lines
2.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Rob Norris <rob.norris@klarasystems.com>
|
|
Date: Tue, 9 Jan 2024 12:29:19 +1100
|
|
Subject: [PATCH] vdev_disk: make read/write IO function configurable
|
|
|
|
This is just setting up for the next couple of commits, which will add a
|
|
new IO function and a parameter to select it.
|
|
|
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
|
Sponsored-by: Klara, Inc.
|
|
Sponsored-by: Wasabi Technology, Inc.
|
|
Closes #15533
|
|
Closes #15588
|
|
(cherry picked from commit c4a13ba483f08a81aa47479d2f763a470d95b2b0)
|
|
---
|
|
module/os/linux/zfs/vdev_disk.c | 23 +++++++++++++++++++++--
|
|
1 file changed, 21 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
|
index 51e7cef2f..de4dba72f 100644
|
|
--- a/module/os/linux/zfs/vdev_disk.c
|
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
|
@@ -946,6 +946,8 @@ vdev_disk_io_trim(zio_t *zio)
|
|
#endif
|
|
}
|
|
|
|
+int (*vdev_disk_io_rw_fn)(zio_t *zio) = NULL;
|
|
+
|
|
static void
|
|
vdev_disk_io_start(zio_t *zio)
|
|
{
|
|
@@ -1029,7 +1031,7 @@ vdev_disk_io_start(zio_t *zio)
|
|
case ZIO_TYPE_READ:
|
|
case ZIO_TYPE_WRITE:
|
|
zio->io_target_timestamp = zio_handle_io_delay(zio);
|
|
- error = vdev_classic_physio(zio);
|
|
+ error = vdev_disk_io_rw_fn(zio);
|
|
rw_exit(&vd->vd_lock);
|
|
if (error) {
|
|
zio->io_error = error;
|
|
@@ -1102,8 +1104,25 @@ vdev_disk_rele(vdev_t *vd)
|
|
/* XXX: Implement me as a vnode rele for the device */
|
|
}
|
|
|
|
+/*
|
|
+ * At first use vdev use, set the submission function from the default value if
|
|
+ * it hasn't been set already.
|
|
+ */
|
|
+static int
|
|
+vdev_disk_init(spa_t *spa, nvlist_t *nv, void **tsd)
|
|
+{
|
|
+ (void) spa;
|
|
+ (void) nv;
|
|
+ (void) tsd;
|
|
+
|
|
+ if (vdev_disk_io_rw_fn == NULL)
|
|
+ vdev_disk_io_rw_fn = vdev_classic_physio;
|
|
+
|
|
+ return (0);
|
|
+}
|
|
+
|
|
vdev_ops_t vdev_disk_ops = {
|
|
- .vdev_op_init = NULL,
|
|
+ .vdev_op_init = vdev_disk_init,
|
|
.vdev_op_fini = NULL,
|
|
.vdev_op_open = vdev_disk_open,
|
|
.vdev_op_close = vdev_disk_close,
|