@@ -427,32 +427,53 @@ vdev_get_nparity(vdev_t *vd)
427427}
428428
429429static int
430- vdev_prop_get_int (vdev_t * vd , vdev_prop_t prop , uint64_t * value )
430+ vdev_prop_get_objid (vdev_t * vd , uint64_t * objid )
431431{
432- spa_t * spa = vd -> vdev_spa ;
433- objset_t * mos = spa -> spa_meta_objset ;
434- uint64_t objid ;
435- int err ;
436432
437433 if (vd -> vdev_root_zap != 0 ) {
438- objid = vd -> vdev_root_zap ;
434+ * objid = vd -> vdev_root_zap ;
439435 } else if (vd -> vdev_top_zap != 0 ) {
440- objid = vd -> vdev_top_zap ;
436+ * objid = vd -> vdev_top_zap ;
441437 } else if (vd -> vdev_leaf_zap != 0 ) {
442- objid = vd -> vdev_leaf_zap ;
438+ * objid = vd -> vdev_leaf_zap ;
443439 } else {
444440 return (EINVAL );
445441 }
446442
443+ return (0 );
444+ }
445+
446+ static int
447+ vdev_prop_get_int (vdev_t * vd , vdev_prop_t prop , uint64_t * value )
448+ {
449+ spa_t * spa = vd -> vdev_spa ;
450+ objset_t * mos = spa -> spa_meta_objset ;
451+ uint64_t objid ;
452+ int err ;
453+
454+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
455+ return (EINVAL );
456+
447457 err = zap_lookup (mos , objid , vdev_prop_to_name (prop ),
448458 sizeof (uint64_t ), 1 , value );
449-
450459 if (err == ENOENT )
451460 * value = vdev_prop_default_numeric (prop );
452461
453462 return (err );
454463}
455464
465+ static int
466+ vdev_prop_get_bool (vdev_t * vd , vdev_prop_t prop , boolean_t * bvalue )
467+ {
468+ int err ;
469+ uint64_t ivalue ;
470+
471+ err = vdev_prop_get_int (vd , prop , & ivalue );
472+ * bvalue = ivalue != 1 ;
473+
474+ return (err );
475+ }
476+
456477/*
457478 * Get the number of data disks for a top-level vdev.
458479 */
@@ -713,8 +734,12 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
713734 */
714735 vd -> vdev_checksum_n = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
715736 vd -> vdev_checksum_t = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
737+
716738 vd -> vdev_io_n = vdev_prop_default_numeric (VDEV_PROP_IO_N );
717739 vd -> vdev_io_t = vdev_prop_default_numeric (VDEV_PROP_IO_T );
740+
741+ vd -> vdev_slow_io_events = vdev_prop_default_numeric (
742+ VDEV_PROP_SLOW_IO_EVENTS );
718743 vd -> vdev_slow_io_n = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_N );
719744 vd -> vdev_slow_io_t = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_T );
720745
@@ -3852,6 +3877,11 @@ vdev_load(vdev_t *vd)
38523877 vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
38533878 "failed [error=%d]" , (u_longlong_t )zapobj , error );
38543879
3880+ error = vdev_prop_get_bool (vd , VDEV_PROP_SLOW_IO_EVENTS ,
3881+ & vd -> vdev_slow_io_events );
3882+ if (error && error != ENOENT )
3883+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3884+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
38553885 error = vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
38563886 & vd -> vdev_slow_io_n );
38573887 if (error && error != ENOENT )
@@ -5899,15 +5929,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
58995929 /*
59005930 * Set vdev property values in the vdev props mos object.
59015931 */
5902- if (vd -> vdev_root_zap != 0 ) {
5903- objid = vd -> vdev_root_zap ;
5904- } else if (vd -> vdev_top_zap != 0 ) {
5905- objid = vd -> vdev_top_zap ;
5906- } else if (vd -> vdev_leaf_zap != 0 ) {
5907- objid = vd -> vdev_leaf_zap ;
5908- } else {
5932+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
59095933 panic ("unexpected vdev type" );
5910- }
59115934
59125935 mutex_enter (& spa -> spa_props_lock );
59135936
@@ -6084,6 +6107,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
60846107 }
60856108 vd -> vdev_io_t = intval ;
60866109 break ;
6110+ case VDEV_PROP_SLOW_IO_EVENTS :
6111+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6112+ error = EINVAL ;
6113+ break ;
6114+ }
6115+ vd -> vdev_slow_io_events = intval != 0 ;
6116+ break ;
60876117 case VDEV_PROP_SLOW_IO_N :
60886118 if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
60896119 error = EINVAL ;
@@ -6125,6 +6155,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61256155 nvpair_t * elem = NULL ;
61266156 nvlist_t * nvprops = NULL ;
61276157 uint64_t intval = 0 ;
6158+ boolean_t boolval = 0 ;
61286159 char * strval = NULL ;
61296160 const char * propname = NULL ;
61306161 vdev_prop_t prop ;
@@ -6138,15 +6169,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61386169
61396170 nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
61406171
6141- if (vd -> vdev_root_zap != 0 ) {
6142- objid = vd -> vdev_root_zap ;
6143- } else if (vd -> vdev_top_zap != 0 ) {
6144- objid = vd -> vdev_top_zap ;
6145- } else if (vd -> vdev_leaf_zap != 0 ) {
6146- objid = vd -> vdev_leaf_zap ;
6147- } else {
6172+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
61486173 return (SET_ERROR (EINVAL ));
6149- }
61506174 ASSERT (objid != 0 );
61516175
61526176 mutex_enter (& spa -> spa_props_lock );
@@ -6455,6 +6479,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
64556479 vdev_prop_add_list (outnvl , propname , strval ,
64566480 intval , src );
64576481 break ;
6482+ case VDEV_PROP_SLOW_IO_EVENTS :
6483+ err = vdev_prop_get_bool (vd , prop , & boolval );
6484+ if (err && err != ENOENT )
6485+ break ;
6486+
6487+ src = ZPROP_SRC_LOCAL ;
6488+ if (boolval == vdev_prop_default_numeric (prop ))
6489+ src = ZPROP_SRC_DEFAULT ;
6490+
6491+ vdev_prop_add_list (outnvl , propname , NULL ,
6492+ boolval , src );
6493+ break ;
64586494 case VDEV_PROP_CHECKSUM_N :
64596495 case VDEV_PROP_CHECKSUM_T :
64606496 case VDEV_PROP_IO_N :
0 commit comments