diff --git a/include/sys/fs/zfs.h b/include/sys/fs/zfs.h
index e191420f2d..b572c22a29 100644
--- a/include/sys/fs/zfs.h
+++ b/include/sys/fs/zfs.h
@@ -368,6 +368,9 @@ typedef enum {
VDEV_PROP_RAIDZ_EXPANDING,
VDEV_PROP_SLOW_IO_N,
VDEV_PROP_SLOW_IO_T,
+ VDEV_PROP_TRIM_SUPPORT,
+ VDEV_PROP_TRIM_ERRORS,
+ VDEV_PROP_SLOW_IOS,
VDEV_NUM_PROPS
} vdev_prop_t;
diff --git a/lib/libzfs/libzfs.abi b/lib/libzfs/libzfs.abi
index 80f4b7439a..a75f5bbb47 100644
--- a/lib/libzfs/libzfs.abi
+++ b/lib/libzfs/libzfs.abi
@@ -5702,7 +5702,10 @@
-
+
+
+
+
diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c
index 979bbdd380..d5e934045f 100644
--- a/lib/libzfs/libzfs_pool.c
+++ b/lib/libzfs/libzfs_pool.c
@@ -5225,6 +5225,8 @@ zpool_get_vdev_prop_value(nvlist_t *nvprop, vdev_prop_t prop, char *prop_name,
case VDEV_PROP_WRITE_ERRORS:
case VDEV_PROP_CHECKSUM_ERRORS:
case VDEV_PROP_INITIALIZE_ERRORS:
+ case VDEV_PROP_TRIM_ERRORS:
+ case VDEV_PROP_SLOW_IOS:
case VDEV_PROP_OPS_NULL:
case VDEV_PROP_OPS_READ:
case VDEV_PROP_OPS_WRITE:
@@ -5304,6 +5306,11 @@ zpool_get_vdev_prop_value(nvlist_t *nvprop, vdev_prop_t prop, char *prop_name,
src = fnvlist_lookup_uint64(nv, ZPROP_SOURCE);
intval = fnvlist_lookup_uint64(nv, ZPROP_VALUE);
} else {
+ /* 'trim_support' only valid for leaf vdevs */
+ if (prop == VDEV_PROP_TRIM_SUPPORT) {
+ (void) strlcpy(buf, "-", len);
+ break;
+ }
src = ZPROP_SRC_DEFAULT;
intval = vdev_prop_default_numeric(prop);
/* Only use if provided by the RAIDZ VDEV above */
diff --git a/man/man7/vdevprops.7 b/man/man7/vdevprops.7
index 5ec37df179..34d4026b10 100644
--- a/man/man7/vdevprops.7
+++ b/man/man7/vdevprops.7
@@ -102,8 +102,14 @@ Parent of this vdev
Comma separated list of children of this vdev
.It Sy numchildren
The number of children belonging to this vdev
-.It Sy read_errors , write_errors , checksum_errors , initialize_errors
+.It Sy read_errors , write_errors , checksum_errors , initialize_errors , trim_errors
The number of errors of each type encountered by this vdev
+.It Sy slow_ios
+The number of slow I/Os encountered by this vdev,
+These represent I/O operations that didn't complete in
+.Sy zio_slow_io_ms
+milliseconds
+.Pq Sy 30000 No by default .
.It Sy null_ops , read_ops , write_ops , free_ops , claim_ops , trim_ops
The number of I/O operations of each type performed by this vdev
.It Xo
@@ -113,6 +119,8 @@ The number of I/O operations of each type performed by this vdev
The cumulative size of all operations of each type performed by this vdev
.It Sy removing
If this device is currently being removed from the pool
+.It Sy trim_support
+Indicates if a leaf device supports trim operations.
.El
.Pp
The following native properties can be used to change the behavior of a vdev.
diff --git a/module/zcommon/zpool_prop.c b/module/zcommon/zpool_prop.c
index e2e3bf5be6..b367c95b83 100644
--- a/module/zcommon/zpool_prop.c
+++ b/module/zcommon/zpool_prop.c
@@ -381,6 +381,12 @@ vdev_prop_init(void)
zprop_register_number(VDEV_PROP_INITIALIZE_ERRORS,
"initialize_errors", 0, PROP_READONLY, ZFS_TYPE_VDEV, "",
"INITERR", B_FALSE, sfeatures);
+ zprop_register_number(VDEV_PROP_TRIM_ERRORS, "trim_errors", 0,
+ PROP_READONLY, ZFS_TYPE_VDEV, "", "TRIMERR", B_FALSE,
+ sfeatures);
+ zprop_register_number(VDEV_PROP_SLOW_IOS, "slow_ios", 0,
+ PROP_READONLY, ZFS_TYPE_VDEV, "", "SLOW", B_FALSE,
+ sfeatures);
zprop_register_number(VDEV_PROP_OPS_NULL, "null_ops", 0,
PROP_READONLY, ZFS_TYPE_VDEV, "", "NULLOP", B_FALSE,
sfeatures);
@@ -448,6 +454,9 @@ vdev_prop_init(void)
zprop_register_index(VDEV_PROP_RAIDZ_EXPANDING, "raidz_expanding", 0,
PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "RAIDZ_EXPANDING",
boolean_table, sfeatures);
+ zprop_register_index(VDEV_PROP_TRIM_SUPPORT, "trim_support", 0,
+ PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "TRIMSUP",
+ boolean_table, sfeatures);
/* default index properties */
zprop_register_index(VDEV_PROP_FAILFAST, "failfast", B_TRUE,
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c
index 11cc39ba35..6ae0a14127 100644
--- a/module/zfs/vdev.c
+++ b/module/zfs/vdev.c
@@ -6222,6 +6222,16 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
vd->vdev_stat.vs_initialize_errors,
ZPROP_SRC_NONE);
continue;
+ case VDEV_PROP_TRIM_ERRORS:
+ vdev_prop_add_list(outnvl, propname, NULL,
+ vd->vdev_stat.vs_trim_errors,
+ ZPROP_SRC_NONE);
+ continue;
+ case VDEV_PROP_SLOW_IOS:
+ vdev_prop_add_list(outnvl, propname, NULL,
+ vd->vdev_stat.vs_slow_ios,
+ ZPROP_SRC_NONE);
+ continue;
case VDEV_PROP_OPS_NULL:
vdev_prop_add_list(outnvl, propname, NULL,
vd->vdev_stat.vs_ops[ZIO_TYPE_NULL],
@@ -6306,6 +6316,14 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
ZPROP_SRC_NONE);
}
continue;
+ case VDEV_PROP_TRIM_SUPPORT:
+ /* only valid for leaf vdevs */
+ if (vd->vdev_ops->vdev_op_leaf) {
+ vdev_prop_add_list(outnvl, propname,
+ NULL, vd->vdev_has_trim,
+ ZPROP_SRC_NONE);
+ }
+ continue;
/* Numeric Properites */
case VDEV_PROP_ALLOCATING:
/* Leaf vdevs cannot have this property */
diff --git a/tests/zfs-tests/tests/functional/cli_root/zpool_get/vdev_get.cfg b/tests/zfs-tests/tests/functional/cli_root/zpool_get/vdev_get.cfg
index c3b9efd646..6cfa7eaf75 100644
--- a/tests/zfs-tests/tests/functional/cli_root/zpool_get/vdev_get.cfg
+++ b/tests/zfs-tests/tests/functional/cli_root/zpool_get/vdev_get.cfg
@@ -72,4 +72,7 @@ typeset -a properties=(
io_t
slow_io_n
slow_io_t
+ trim_support
+ trim_errors
+ slow_ios
)