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
This commit is contained in:
Rob Norris 2024-01-09 12:29:19 +11:00 committed by Brian Behlendorf
parent 867178ae1d
commit c4a13ba483

View File

@ -946,6 +946,8 @@ vdev_disk_io_trim(zio_t *zio)
#endif #endif
} }
int (*vdev_disk_io_rw_fn)(zio_t *zio) = NULL;
static void static void
vdev_disk_io_start(zio_t *zio) 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_READ:
case ZIO_TYPE_WRITE: case ZIO_TYPE_WRITE:
zio->io_target_timestamp = zio_handle_io_delay(zio); 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); rw_exit(&vd->vd_lock);
if (error) { if (error) {
zio->io_error = 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 */ /* 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_ops_t vdev_disk_ops = {
.vdev_op_init = NULL, .vdev_op_init = vdev_disk_init,
.vdev_op_fini = NULL, .vdev_op_fini = NULL,
.vdev_op_open = vdev_disk_open, .vdev_op_open = vdev_disk_open,
.vdev_op_close = vdev_disk_close, .vdev_op_close = vdev_disk_close,