@@ -389,6 +389,31 @@ vdev_get_nparity(vdev_t *vd)
389389 return (nparity );
390390}
391391
392+ static int
393+ vdev_prop_get_int (vdev_t * vd , vdev_prop_t prop , uint64_t * value )
394+ {
395+ spa_t * spa = vd -> vdev_spa ;
396+ objset_t * mos = spa -> spa_meta_objset ;
397+ uint64_t objid ;
398+ int err ;
399+
400+ if (vd -> vdev_top_zap != 0 ) {
401+ objid = vd -> vdev_top_zap ;
402+ } else if (vd -> vdev_leaf_zap != 0 ) {
403+ objid = vd -> vdev_leaf_zap ;
404+ } else {
405+ return (EINVAL );
406+ }
407+
408+ err = zap_lookup (mos , objid , vdev_prop_to_name (prop ),
409+ sizeof (uint64_t ), 1 , value );
410+
411+ if (err == ENOENT )
412+ * value = vdev_prop_default_numeric (prop );
413+
414+ return (err );
415+ }
416+
392417/*
393418 * Get the number of data disks for a top-level vdev.
394419 */
@@ -642,6 +667,14 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
642667 zfs_ratelimit_init (& vd -> vdev_checksum_rl ,
643668 & zfs_checksum_events_per_second , 1 );
644669
670+ /*
671+ * Default Thresholds for tuning ZED
672+ */
673+ vd -> vdev_checksum_n = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
674+ vd -> vdev_checksum_t = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
675+ vd -> vdev_io_n = vdev_prop_default_numeric (VDEV_PROP_IO_N );
676+ vd -> vdev_io_t = vdev_prop_default_numeric (VDEV_PROP_IO_T );
677+
645678 list_link_init (& vd -> vdev_config_dirty_node );
646679 list_link_init (& vd -> vdev_state_dirty_node );
647680 list_link_init (& vd -> vdev_initialize_node );
@@ -3597,6 +3630,39 @@ vdev_load(vdev_t *vd)
35973630 }
35983631 }
35993632
3633+ if (vd -> vdev_top_zap != 0 || vd -> vdev_leaf_zap != 0 ) {
3634+ uint64_t zapobj ;
3635+
3636+ if (vd -> vdev_top_zap != 0 )
3637+ zapobj = vd -> vdev_top_zap ;
3638+ else
3639+ zapobj = vd -> vdev_leaf_zap ;
3640+
3641+ error = vdev_prop_get_int (vd , VDEV_PROP_CHECKSUM_N ,
3642+ & vd -> vdev_checksum_n );
3643+ if (error && error != ENOENT )
3644+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3645+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
3646+
3647+ error = vdev_prop_get_int (vd , VDEV_PROP_CHECKSUM_T ,
3648+ & vd -> vdev_checksum_t );
3649+ if (error && error != ENOENT )
3650+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3651+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
3652+
3653+ error = vdev_prop_get_int (vd , VDEV_PROP_IO_N ,
3654+ & vd -> vdev_io_n );
3655+ if (error && error != ENOENT )
3656+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3657+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
3658+
3659+ error = vdev_prop_get_int (vd , VDEV_PROP_IO_T ,
3660+ & vd -> vdev_io_t );
3661+ if (error && error != ENOENT )
3662+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3663+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
3664+ }
3665+
36003666 /*
36013667 * If this is a top-level vdev, initialize its metaslabs.
36023668 */
@@ -5736,6 +5802,34 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
57365802 }
57375803 vd -> vdev_failfast = intval & 1 ;
57385804 break ;
5805+ case VDEV_PROP_CHECKSUM_N :
5806+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
5807+ error = EINVAL ;
5808+ break ;
5809+ }
5810+ vd -> vdev_checksum_n = intval ;
5811+ break ;
5812+ case VDEV_PROP_CHECKSUM_T :
5813+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
5814+ error = EINVAL ;
5815+ break ;
5816+ }
5817+ vd -> vdev_checksum_t = intval ;
5818+ break ;
5819+ case VDEV_PROP_IO_N :
5820+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
5821+ error = EINVAL ;
5822+ break ;
5823+ }
5824+ vd -> vdev_io_n = intval ;
5825+ break ;
5826+ case VDEV_PROP_IO_T :
5827+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
5828+ error = EINVAL ;
5829+ break ;
5830+ }
5831+ vd -> vdev_io_t = intval ;
5832+ break ;
57395833 default :
57405834 /* Most processing is done in vdev_props_set_sync */
57415835 break ;
@@ -6025,28 +6119,25 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
60256119 continue ;
60266120 /* Numeric Properites */
60276121 case VDEV_PROP_ALLOCATING :
6028- src = ZPROP_SRC_LOCAL ;
6029- strval = NULL ;
6030-
6031- err = zap_lookup (mos , objid , nvpair_name (elem ),
6032- sizeof (uint64_t ), 1 , & intval );
6033- if (err == ENOENT ) {
6034- intval =
6035- vdev_prop_default_numeric (prop );
6036- err = 0 ;
6037- } else if (err )
6038- break ;
6039- if (intval == vdev_prop_default_numeric (prop ))
6040- src = ZPROP_SRC_DEFAULT ;
6041-
60426122 /* Leaf vdevs cannot have this property */
60436123 if (vd -> vdev_mg == NULL &&
60446124 vd -> vdev_top != NULL ) {
60456125 src = ZPROP_SRC_NONE ;
60466126 intval = ZPROP_BOOLEAN_NA ;
6127+ } else {
6128+ err = vdev_prop_get_int (vd , prop ,
6129+ & intval );
6130+ if (err && err != ENOENT )
6131+ break ;
6132+
6133+ if (intval ==
6134+ vdev_prop_default_numeric (prop ))
6135+ src = ZPROP_SRC_DEFAULT ;
6136+ else
6137+ src = ZPROP_SRC_LOCAL ;
60476138 }
60486139
6049- vdev_prop_add_list (outnvl , propname , strval ,
6140+ vdev_prop_add_list (outnvl , propname , NULL ,
60506141 intval , src );
60516142 break ;
60526143 case VDEV_PROP_FAILFAST :
@@ -6068,6 +6159,22 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
60686159 vdev_prop_add_list (outnvl , propname , strval ,
60696160 intval , src );
60706161 break ;
6162+ case VDEV_PROP_CHECKSUM_N :
6163+ case VDEV_PROP_CHECKSUM_T :
6164+ case VDEV_PROP_IO_N :
6165+ case VDEV_PROP_IO_T :
6166+ err = vdev_prop_get_int (vd , prop , & intval );
6167+ if (err && err != ENOENT )
6168+ break ;
6169+
6170+ if (intval == vdev_prop_default_numeric (prop ))
6171+ src = ZPROP_SRC_DEFAULT ;
6172+ else
6173+ src = ZPROP_SRC_LOCAL ;
6174+
6175+ vdev_prop_add_list (outnvl , propname , NULL ,
6176+ intval , src );
6177+ break ;
60716178 /* Text Properties */
60726179 case VDEV_PROP_COMMENT :
60736180 /* Exists in the ZAP below */
0 commit comments