@@ -449,32 +449,53 @@ vdev_get_nparity(vdev_t *vd)
449449}
450450
451451static int
452- vdev_prop_get_int (vdev_t * vd , vdev_prop_t prop , uint64_t * value )
452+ vdev_prop_get_objid (vdev_t * vd , uint64_t * objid )
453453{
454- spa_t * spa = vd -> vdev_spa ;
455- objset_t * mos = spa -> spa_meta_objset ;
456- uint64_t objid ;
457- int err ;
458454
459455 if (vd -> vdev_root_zap != 0 ) {
460- objid = vd -> vdev_root_zap ;
456+ * objid = vd -> vdev_root_zap ;
461457 } else if (vd -> vdev_top_zap != 0 ) {
462- objid = vd -> vdev_top_zap ;
458+ * objid = vd -> vdev_top_zap ;
463459 } else if (vd -> vdev_leaf_zap != 0 ) {
464- objid = vd -> vdev_leaf_zap ;
460+ * objid = vd -> vdev_leaf_zap ;
465461 } else {
466462 return (EINVAL );
467463 }
468464
465+ return (0 );
466+ }
467+
468+ static int
469+ vdev_prop_get_int (vdev_t * vd , vdev_prop_t prop , uint64_t * value )
470+ {
471+ spa_t * spa = vd -> vdev_spa ;
472+ objset_t * mos = spa -> spa_meta_objset ;
473+ uint64_t objid ;
474+ int err ;
475+
476+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
477+ return (EINVAL );
478+
469479 err = zap_lookup (mos , objid , vdev_prop_to_name (prop ),
470480 sizeof (uint64_t ), 1 , value );
471-
472481 if (err == ENOENT )
473482 * value = vdev_prop_default_numeric (prop );
474483
475484 return (err );
476485}
477486
487+ static int
488+ vdev_prop_get_bool (vdev_t * vd , vdev_prop_t prop , boolean_t * bvalue )
489+ {
490+ int err ;
491+ uint64_t ivalue ;
492+
493+ err = vdev_prop_get_int (vd , prop , & ivalue );
494+ * bvalue = ivalue != 0 ;
495+
496+ return (err );
497+ }
498+
478499/*
479500 * Get the number of data disks for a top-level vdev.
480501 */
@@ -737,8 +758,12 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
737758 */
738759 vd -> vdev_checksum_n = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
739760 vd -> vdev_checksum_t = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
761+
740762 vd -> vdev_io_n = vdev_prop_default_numeric (VDEV_PROP_IO_N );
741763 vd -> vdev_io_t = vdev_prop_default_numeric (VDEV_PROP_IO_T );
764+
765+ vd -> vdev_slow_io_events = vdev_prop_default_numeric (
766+ VDEV_PROP_SLOW_IO_EVENTS );
742767 vd -> vdev_slow_io_n = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_N );
743768 vd -> vdev_slow_io_t = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_T );
744769
@@ -3931,6 +3956,11 @@ vdev_load(vdev_t *vd)
39313956 vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
39323957 "failed [error=%d]" , (u_longlong_t )zapobj , error );
39333958
3959+ error = vdev_prop_get_bool (vd , VDEV_PROP_SLOW_IO_EVENTS ,
3960+ & vd -> vdev_slow_io_events );
3961+ if (error && error != ENOENT )
3962+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3963+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
39343964 error = vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
39353965 & vd -> vdev_slow_io_n );
39363966 if (error && error != ENOENT )
@@ -5980,15 +6010,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
59806010 /*
59816011 * Set vdev property values in the vdev props mos object.
59826012 */
5983- if (vd -> vdev_root_zap != 0 ) {
5984- objid = vd -> vdev_root_zap ;
5985- } else if (vd -> vdev_top_zap != 0 ) {
5986- objid = vd -> vdev_top_zap ;
5987- } else if (vd -> vdev_leaf_zap != 0 ) {
5988- objid = vd -> vdev_leaf_zap ;
5989- } else {
6013+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
59906014 panic ("unexpected vdev type" );
5991- }
59926015
59936016 mutex_enter (& spa -> spa_props_lock );
59946017
@@ -6215,6 +6238,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
62156238 }
62166239 vd -> vdev_io_t = intval ;
62176240 break ;
6241+ case VDEV_PROP_SLOW_IO_EVENTS :
6242+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6243+ error = EINVAL ;
6244+ break ;
6245+ }
6246+ vd -> vdev_slow_io_events = intval != 0 ;
6247+ break ;
62186248 case VDEV_PROP_SLOW_IO_N :
62196249 if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
62206250 error = EINVAL ;
@@ -6256,6 +6286,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
62566286 nvpair_t * elem = NULL ;
62576287 nvlist_t * nvprops = NULL ;
62586288 uint64_t intval = 0 ;
6289+ boolean_t boolval = 0 ;
62596290 char * strval = NULL ;
62606291 const char * propname = NULL ;
62616292 vdev_prop_t prop ;
@@ -6269,15 +6300,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
62696300
62706301 nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
62716302
6272- if (vd -> vdev_root_zap != 0 ) {
6273- objid = vd -> vdev_root_zap ;
6274- } else if (vd -> vdev_top_zap != 0 ) {
6275- objid = vd -> vdev_top_zap ;
6276- } else if (vd -> vdev_leaf_zap != 0 ) {
6277- objid = vd -> vdev_leaf_zap ;
6278- } else {
6303+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
62796304 return (SET_ERROR (EINVAL ));
6280- }
62816305 ASSERT (objid != 0 );
62826306
62836307 mutex_enter (& spa -> spa_props_lock );
@@ -6622,6 +6646,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
66226646 intval , src );
66236647 break ;
66246648
6649+ case VDEV_PROP_SLOW_IO_EVENTS :
6650+ err = vdev_prop_get_bool (vd , prop , & boolval );
6651+ if (err && err != ENOENT )
6652+ break ;
6653+
6654+ src = ZPROP_SRC_LOCAL ;
6655+ if (boolval == vdev_prop_default_numeric (prop ))
6656+ src = ZPROP_SRC_DEFAULT ;
6657+
6658+ vdev_prop_add_list (outnvl , propname , NULL ,
6659+ boolval , src );
6660+ break ;
66256661 case VDEV_PROP_CHECKSUM_N :
66266662 case VDEV_PROP_CHECKSUM_T :
66276663 case VDEV_PROP_IO_N :
0 commit comments