diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
index d45900246..d3094d448 100644
--- a/cmd/zpool/zpool_main.c
+++ b/cmd/zpool/zpool_main.c
@@ -12070,6 +12070,11 @@ zpool_do_events_nvprint(nvlist_t *nvl, int depth)
zfs_valstr_zio_stage(i32, flagstr,
sizeof (flagstr));
printf(gettext("0x%x [%s]"), i32, flagstr);
+ } else if (strcmp(name,
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_TYPE) == 0) {
+ zfs_valstr_zio_type(i32, flagstr,
+ sizeof (flagstr));
+ printf(gettext("0x%x [%s]"), i32, flagstr);
} else if (strcmp(name,
FM_EREPORT_PAYLOAD_ZFS_ZIO_PRIORITY) == 0) {
zfs_valstr_zio_priority(i32, flagstr,
diff --git a/include/sys/fm/fs/zfs.h b/include/sys/fm/fs/zfs.h
index 30ced55da..659c64bf1 100644
--- a/include/sys/fm/fs/zfs.h
+++ b/include/sys/fm/fs/zfs.h
@@ -103,6 +103,7 @@ extern "C" {
#define FM_EREPORT_PAYLOAD_ZFS_ZIO_FLAGS "zio_flags"
#define FM_EREPORT_PAYLOAD_ZFS_ZIO_STAGE "zio_stage"
#define FM_EREPORT_PAYLOAD_ZFS_ZIO_PRIORITY "zio_priority"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_TYPE "zio_type"
#define FM_EREPORT_PAYLOAD_ZFS_ZIO_PIPELINE "zio_pipeline"
#define FM_EREPORT_PAYLOAD_ZFS_ZIO_DELAY "zio_delay"
#define FM_EREPORT_PAYLOAD_ZFS_ZIO_TIMESTAMP "zio_timestamp"
diff --git a/include/zfs_valstr.h b/include/zfs_valstr.h
index 295449396..27b4c9ebb 100644
--- a/include/zfs_valstr.h
+++ b/include/zfs_valstr.h
@@ -73,6 +73,7 @@ extern "C" {
_ZFS_VALSTR_DECLARE_BITFIELD(zio_flag)
_ZFS_VALSTR_DECLARE_BITFIELD(zio_stage)
+_ZFS_VALSTR_DECLARE_ENUM(zio_type)
_ZFS_VALSTR_DECLARE_ENUM(zio_priority)
#undef _ZFS_VALSTR_DECLARE_BITFIELD
diff --git a/lib/libzfs/libzfs.abi b/lib/libzfs/libzfs.abi
index 01fe98db8..35ecdca76 100644
--- a/lib/libzfs/libzfs.abi
+++ b/lib/libzfs/libzfs.abi
@@ -466,6 +466,7 @@
+
@@ -10080,6 +10081,12 @@
+
+
+
+
+
+
diff --git a/man/man8/zpool-events.8 b/man/man8/zpool-events.8
index a176e54a2..7af1917da 100644
--- a/man/man8/zpool-events.8
+++ b/man/man8/zpool-events.8
@@ -26,9 +26,9 @@
.\" Copyright (c) 2018 George Melikov. All Rights Reserved.
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
-.\" Copyright (c) 2024, Klara Inc.
+.\" Copyright (c) 2024, 2025, Klara, Inc.
.\"
-.Dd February 28, 2024
+.Dd May 27, 2025
.Dt ZPOOL-EVENTS 8
.Os
.
@@ -308,6 +308,16 @@ The valid pipeline stages for the I/O.
See the
.Sy I/O STAGES
section for a full list of all the I/O stages.
+.It Sy zio_priority
+The queue priority of the I/O request.
+See the
+.Sy I/O PRIORITIES
+section for a full list of all the I/O priorities.
+.It Sy zio_tyoe
+The type of the I/O request.
+See the
+.Sy I/O TYPES
+section for a full list of all the I/O types.
.It Sy zio_delay
The time elapsed (in nanoseconds) waiting for the block layer to complete the
I/O request.
@@ -477,6 +487,51 @@ ZIO_FLAG_DELEGATED:0x40000000
ZIO_FLAG_FASTWRITE:0x80000000
.TE
.
+.Sh I/O TYPES
+Every I/O request in the pipeline has a single type value.
+This value describes the kind of low-level work the I/O represents.
+This value will be set in an event as a
+.Sy zio_type
+payload entry.
+.Pp
+.TS
+tab(:);
+l l l .
+Type:Value:Description
+_:_:_
+ZIO_TYPE_NULL:0x0:internal I/O sync point
+ZIO_TYPE_READ:0x1:data read
+ZIO_TYPE_WRITE:0x2:data write
+ZIO_TYPE_FREE:0x3:block free
+ZIO_TYPE_CLAIM:0x4:block claim (ZIL replay)
+ZIO_TYPE_FLUSH:0x5:disk cache flush request
+ZIO_TYPE_TRIM:0x6:trim (discard)
+.TE
+.
+.Sh I/O PRIORITIES
+Every I/O request in the pipeline has a single priority value.
+This value is used by the queuing code to decide which I/O to issue next.
+This value will be set in an event as a
+.Sy zio_priority
+payload entry.
+.Pp
+.TS
+tab(:);
+l l l .
+Type:Value:Description
+_:_:_
+ZIO_PRIORITY_SYNC_READ:0x0:
+ZIO_PRIORITY_SYNC_WRITE:0x1:ZIL
+ZIO_PRIORITY_ASYNC_READ:0x2:prefetch
+ZIO_PRIORITY_ASYNC_WRITE:0x3:spa_sync()
+ZIO_PRIORITY_SCRUB:0x4:asynchronous scrub/resilver reads
+ZIO_PRIORITY_REMOVAL:0x5:reads/writes for vdev removal
+ZIO_PRIORITY_INITIALIZING:0x6:initializing I/O
+ZIO_PRIORITY_TRIM:0x7:trim I/O (discard)
+ZIO_PRIORITY_REBUILD:0x8:reads/writes for vdev rebuild
+ZIO_PRIORITY_NOW:0xa:non-queued i/os (e.g. free)
+.TE
+.
.Sh SEE ALSO
.Xr zfs 4 ,
.Xr zed 8 ,
diff --git a/module/zcommon/zfs_valstr.c b/module/zcommon/zfs_valstr.c
index fce5658b4..c39ac62f6 100644
--- a/module/zcommon/zfs_valstr.c
+++ b/module/zcommon/zfs_valstr.c
@@ -259,6 +259,17 @@ _VALSTR_BITFIELD_IMPL(zio_stage,
{ 'X', "X ", "DONE" },
)
+/* ZIO type: zio_type_t, typically zio->io_type */
+_VALSTR_ENUM_IMPL(zio_type,
+ "NULL",
+ "READ",
+ "WRITE",
+ "FREE",
+ "CLAIM",
+ "FLUSH",
+ "TRIM",
+)
+
/* ZIO priority: zio_priority_t, typically zio->io_priority */
_VALSTR_ENUM_IMPL(zio_priority,
"SYNC_READ",
diff --git a/module/zfs/zfs_fm.c b/module/zfs/zfs_fm.c
index cd02ae78f..221f24e38 100644
--- a/module/zfs/zfs_fm.c
+++ b/module/zfs/zfs_fm.c
@@ -659,6 +659,8 @@ zfs_ereport_start(nvlist_t **ereport_out, nvlist_t **detector_out,
DATA_TYPE_UINT64, zio->io_timestamp, NULL);
fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_DELTA,
DATA_TYPE_UINT64, zio->io_delta, NULL);
+ fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_TYPE,
+ DATA_TYPE_UINT32, zio->io_type, NULL);
fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_PRIORITY,
DATA_TYPE_UINT32, zio->io_priority, NULL);
diff --git a/tests/zfs-tests/cmd/ereports.c b/tests/zfs-tests/cmd/ereports.c
index f05579e15..f981d5b34 100644
--- a/tests/zfs-tests/cmd/ereports.c
+++ b/tests/zfs-tests/cmd/ereports.c
@@ -49,6 +49,7 @@ static const char *const criteria_name[] = {
FM_EREPORT_PAYLOAD_ZFS_ZIO_ERR,
FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE,
FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_TYPE,
FM_EREPORT_PAYLOAD_ZFS_ZIO_PRIORITY,
/* logical zio criteriai (optional) */