@@ -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
@@ -3903,6 +3928,11 @@ vdev_load(vdev_t *vd)
39033928 vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
39043929 "failed [error=%d]" , (u_longlong_t )zapobj , error );
39053930
3931+ error = vdev_prop_get_bool (vd , VDEV_PROP_SLOW_IO_EVENTS ,
3932+ & vd -> vdev_slow_io_events );
3933+ if (error && error != ENOENT )
3934+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3935+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
39063936 error = vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
39073937 & vd -> vdev_slow_io_n );
39083938 if (error && error != ENOENT )
@@ -5950,15 +5980,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
59505980 /*
59515981 * Set vdev property values in the vdev props mos object.
59525982 */
5953- if (vd -> vdev_root_zap != 0 ) {
5954- objid = vd -> vdev_root_zap ;
5955- } else if (vd -> vdev_top_zap != 0 ) {
5956- objid = vd -> vdev_top_zap ;
5957- } else if (vd -> vdev_leaf_zap != 0 ) {
5958- objid = vd -> vdev_leaf_zap ;
5959- } else {
5983+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
59605984 panic ("unexpected vdev type" );
5961- }
59625985
59635986 mutex_enter (& spa -> spa_props_lock );
59645987
@@ -6135,6 +6158,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61356158 }
61366159 vd -> vdev_io_t = intval ;
61376160 break ;
6161+ case VDEV_PROP_SLOW_IO_EVENTS :
6162+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6163+ error = EINVAL ;
6164+ break ;
6165+ }
6166+ vd -> vdev_slow_io_events = intval != 0 ;
6167+ break ;
61386168 case VDEV_PROP_SLOW_IO_N :
61396169 if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
61406170 error = EINVAL ;
@@ -6176,6 +6206,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61766206 nvpair_t * elem = NULL ;
61776207 nvlist_t * nvprops = NULL ;
61786208 uint64_t intval = 0 ;
6209+ boolean_t boolval = 0 ;
61796210 char * strval = NULL ;
61806211 const char * propname = NULL ;
61816212 vdev_prop_t prop ;
@@ -6189,15 +6220,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61896220
61906221 nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
61916222
6192- if (vd -> vdev_root_zap != 0 ) {
6193- objid = vd -> vdev_root_zap ;
6194- } else if (vd -> vdev_top_zap != 0 ) {
6195- objid = vd -> vdev_top_zap ;
6196- } else if (vd -> vdev_leaf_zap != 0 ) {
6197- objid = vd -> vdev_leaf_zap ;
6198- } else {
6223+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
61996224 return (SET_ERROR (EINVAL ));
6200- }
62016225 ASSERT (objid != 0 );
62026226
62036227 mutex_enter (& spa -> spa_props_lock );
@@ -6506,6 +6530,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
65066530 vdev_prop_add_list (outnvl , propname , strval ,
65076531 intval , src );
65086532 break ;
6533+ case VDEV_PROP_SLOW_IO_EVENTS :
6534+ err = vdev_prop_get_bool (vd , prop , & boolval );
6535+ if (err && err != ENOENT )
6536+ break ;
6537+
6538+ src = ZPROP_SRC_LOCAL ;
6539+ if (boolval == vdev_prop_default_numeric (prop ))
6540+ src = ZPROP_SRC_DEFAULT ;
6541+
6542+ vdev_prop_add_list (outnvl , propname , NULL ,
6543+ boolval , src );
6544+ break ;
65096545 case VDEV_PROP_CHECKSUM_N :
65106546 case VDEV_PROP_CHECKSUM_T :
65116547 case VDEV_PROP_IO_N :
0 commit comments