X-Git-Url: https://git.proxmox.com/?p=zfsonlinux.git;a=blobdiff_plain;f=debian%2Fpatches%2F0017-vdev_disk-reorganise-vdev_disk_io_start.patch;fp=debian%2Fpatches%2F0017-vdev_disk-reorganise-vdev_disk_io_start.patch;h=23a946fc5919cb57b0fb2c4cda270e1c393f0716;hp=0000000000000000000000000000000000000000;hb=68be554e71e0cac3144d19930898f95bf6616620;hpb=6c9ff9b992b46b2ba7c7b8ab9b5eaf35fff17158 diff --git a/debian/patches/0017-vdev_disk-reorganise-vdev_disk_io_start.patch b/debian/patches/0017-vdev_disk-reorganise-vdev_disk_io_start.patch new file mode 100644 index 0000000..23a946f --- /dev/null +++ b/debian/patches/0017-vdev_disk-reorganise-vdev_disk_io_start.patch @@ -0,0 +1,111 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Rob Norris +Date: Tue, 9 Jan 2024 12:23:30 +1100 +Subject: [PATCH] vdev_disk: reorganise vdev_disk_io_start + +Light reshuffle to make it a bit more linear to read and get rid of a +bunch of args that aren't needed in all cases. + +Reviewed-by: Alexander Motin +Reviewed-by: Brian Behlendorf +Signed-off-by: Rob Norris +Sponsored-by: Klara, Inc. +Sponsored-by: Wasabi Technology, Inc. +Closes #15533 +Closes #15588 +(cherry picked from commit 867178ae1db28e73051c8a7ce662f2f2f81cd8e6) +--- + module/os/linux/zfs/vdev_disk.c | 51 ++++++++++++++++++++------------- + 1 file changed, 31 insertions(+), 20 deletions(-) + +diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c +index 957619b87..51e7cef2f 100644 +--- a/module/os/linux/zfs/vdev_disk.c ++++ b/module/os/linux/zfs/vdev_disk.c +@@ -720,9 +720,16 @@ vdev_classic_bio_max_segs(zio_t *zio, int bio_size, uint64_t abd_offset) + } + + static int +-vdev_classic_physio(struct block_device *bdev, zio_t *zio, +- size_t io_size, uint64_t io_offset, int rw, int flags) ++vdev_classic_physio(zio_t *zio) + { ++ vdev_t *v = zio->io_vd; ++ vdev_disk_t *vd = v->vdev_tsd; ++ struct block_device *bdev = BDH_BDEV(vd->vd_bdh); ++ size_t io_size = zio->io_size; ++ uint64_t io_offset = zio->io_offset; ++ int rw = zio->io_type == ZIO_TYPE_READ ? READ : WRITE; ++ int flags = 0; ++ + dio_request_t *dr; + uint64_t abd_offset; + uint64_t bio_offset; +@@ -944,7 +951,7 @@ vdev_disk_io_start(zio_t *zio) + { + vdev_t *v = zio->io_vd; + vdev_disk_t *vd = v->vdev_tsd; +- int rw, error; ++ int error; + + /* + * If the vdev is closed, it's likely in the REMOVED or FAULTED state. +@@ -1007,13 +1014,6 @@ vdev_disk_io_start(zio_t *zio) + rw_exit(&vd->vd_lock); + zio_execute(zio); + return; +- case ZIO_TYPE_WRITE: +- rw = WRITE; +- break; +- +- case ZIO_TYPE_READ: +- rw = READ; +- break; + + case ZIO_TYPE_TRIM: + zio->io_error = vdev_disk_io_trim(zio); +@@ -1026,23 +1026,34 @@ vdev_disk_io_start(zio_t *zio) + #endif + return; + +- default: ++ case ZIO_TYPE_READ: ++ case ZIO_TYPE_WRITE: ++ zio->io_target_timestamp = zio_handle_io_delay(zio); ++ error = vdev_classic_physio(zio); + rw_exit(&vd->vd_lock); +- zio->io_error = SET_ERROR(ENOTSUP); +- zio_interrupt(zio); ++ if (error) { ++ zio->io_error = error; ++ zio_interrupt(zio); ++ } + return; +- } + +- zio->io_target_timestamp = zio_handle_io_delay(zio); +- error = vdev_classic_physio(BDH_BDEV(vd->vd_bdh), zio, +- zio->io_size, zio->io_offset, rw, 0); +- rw_exit(&vd->vd_lock); ++ default: ++ /* ++ * Getting here means our parent vdev has made a very strange ++ * request of us, and shouldn't happen. Assert here to force a ++ * crash in dev builds, but in production return the IO ++ * unhandled. The pool will likely suspend anyway but that's ++ * nicer than crashing the kernel. ++ */ ++ ASSERT3S(zio->io_type, ==, -1); + +- if (error) { +- zio->io_error = error; ++ rw_exit(&vd->vd_lock); ++ zio->io_error = SET_ERROR(ENOTSUP); + zio_interrupt(zio); + return; + } ++ ++ __builtin_unreachable(); + } + + static void