From ca18c876e52dca44bed961ab93cef47538ae9022 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Tue, 29 Aug 2023 22:02:45 +1000 Subject: [PATCH] zio: function to issue flushes by trace tree If you have a trace tree from, say, a write, hand it directly to zio_flush_traced() to flush only the leaf vdevs that were involved in the write. Signed-off-by: Rob Norris --- include/sys/zio.h | 1 + module/zfs/zio.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/sys/zio.h b/include/sys/zio.h index daa2b2d23f..9adeb5f1e8 100644 --- a/include/sys/zio.h +++ b/include/sys/zio.h @@ -594,6 +594,7 @@ extern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg, extern int zio_alloc_zil(spa_t *spa, objset_t *os, uint64_t txg, blkptr_t *new_bp, uint64_t size, boolean_t *slog); extern void zio_flush(zio_t *zio, vdev_t *vd, boolean_t propagate); +extern void zio_flush_traced(zio_t *zio, avl_tree_t *t, boolean_t propagate); extern void zio_shrink(zio_t *zio, uint64_t size); extern int zio_wait(zio_t *zio); diff --git a/module/zfs/zio.c b/module/zfs/zio.c index 6597b0ff29..bee0324578 100644 --- a/module/zfs/zio.c +++ b/module/zfs/zio.c @@ -1613,6 +1613,36 @@ zio_flush(zio_t *pio, vdev_t *vd, boolean_t propagate) zio_nowait(zio); } +void +zio_flush_traced(zio_t *pio, avl_tree_t *t, boolean_t propagate) +{ + const int cmd = DKIOCFLUSHWRITECACHE; + const zio_flag_t flags = + ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY | + (propagate ? 0 : ZIO_FLAG_DONT_PROPAGATE); + spa_t *spa = pio->io_spa; + zio_t *fio, *zio; + zio_vdev_trace_t *zvt; + vdev_t *vd; + + fio = zio_null(pio, spa, NULL, NULL, NULL, flags); + + for (zvt = avl_first(t); zvt != NULL; zvt = AVL_NEXT(t, zvt)) { + vd = vdev_lookup_by_guid(spa->spa_root_vdev, zvt->zvt_guid); + if (vd == NULL) + continue; + if (vd->vdev_children == 0) { + zio = zio_create(fio, spa, 0, NULL, NULL, 0, 0, NULL, + NULL, ZIO_TYPE_IOCTL, ZIO_PRIORITY_NOW, flags, vd, + 0, NULL, ZIO_STAGE_OPEN, ZIO_IOCTL_PIPELINE); + zio->io_cmd = cmd; + zio_nowait(zio); + } + } + + zio_nowait(fio); +} + void zio_shrink(zio_t *zio, uint64_t size) {