Skip to content

Commit

Permalink
vdev_disk: reorganise vdev_disk_io_start
Browse files Browse the repository at this point in the history
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 <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 867178a)
  • Loading branch information
robn authored and behlendorf committed Mar 28, 2024
1 parent 4820185 commit 13b5348
Showing 1 changed file with 31 additions and 20 deletions.
51 changes: 31 additions & 20 deletions module/os/linux/zfs/vdev_disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand Down

0 comments on commit 13b5348

Please sign in to comment.