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 <rob.norris@klarasystems.com>
This commit is contained in:
Rob Norris 2023-08-29 22:02:45 +10:00 committed by Geoff Amey
parent 4b07fb9a98
commit ca18c876e5
2 changed files with 31 additions and 0 deletions

View File

@ -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, extern int zio_alloc_zil(spa_t *spa, objset_t *os, uint64_t txg,
blkptr_t *new_bp, uint64_t size, boolean_t *slog); 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(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 void zio_shrink(zio_t *zio, uint64_t size);
extern int zio_wait(zio_t *zio); extern int zio_wait(zio_t *zio);

View File

@ -1613,6 +1613,36 @@ zio_flush(zio_t *pio, vdev_t *vd, boolean_t propagate)
zio_nowait(zio); 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 void
zio_shrink(zio_t *zio, uint64_t size) zio_shrink(zio_t *zio, uint64_t size)
{ {