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 )