@@ -1065,6 +1065,10 @@ vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, uint_t id,
10651065 }
10661066 }
10671067
1068+ if (top_level && (ops == & vdev_raidz_ops || ops == & vdev_draid_ops ))
1069+ vd -> vdev_autosit =
1070+ vdev_prop_default_numeric (VDEV_PROP_AUTOSIT );
1071+
10681072 /*
10691073 * Add ourselves to the parent's list of children.
10701074 */
@@ -1166,6 +1170,9 @@ vdev_free(vdev_t *vd)
11661170 spa_spare_remove (vd );
11671171 if (vd -> vdev_isl2cache )
11681172 spa_l2cache_remove (vd );
1173+ if (vd -> vdev_prev_histo )
1174+ kmem_free (vd -> vdev_prev_histo ,
1175+ sizeof (uint64_t ) * VDEV_L_HISTO_BUCKETS );
11691176
11701177 txg_list_destroy (& vd -> vdev_ms_list );
11711178 txg_list_destroy (& vd -> vdev_dtl_list );
@@ -3833,6 +3840,26 @@ vdev_load(vdev_t *vd)
38333840 }
38343841 }
38353842
3843+ if (vd == vd -> vdev_top && vd -> vdev_top_zap != 0 ) {
3844+ spa_t * spa = vd -> vdev_spa ;
3845+ uint64_t autosit ;
3846+
3847+ error = zap_lookup (spa -> spa_meta_objset , vd -> vdev_top_zap ,
3848+ vdev_prop_to_name (VDEV_PROP_AUTOSIT ), sizeof (autosit ),
3849+ 1 , & autosit );
3850+ if (error == 0 ) {
3851+ vd -> vdev_autosit = autosit == 1 ;
3852+ } else if (error == ENOENT ) {
3853+ vd -> vdev_autosit = vdev_prop_default_numeric (
3854+ VDEV_PROP_AUTOSIT );
3855+ } else {
3856+ vdev_dbgmsg (vd ,
3857+ "vdev_load: zap_lookup(top_zap=%llu) "
3858+ "failed [error=%d]" ,
3859+ (u_longlong_t )vd -> vdev_top_zap , error );
3860+ }
3861+ }
3862+
38363863 /*
38373864 * Load any rebuild state from the top-level vdev zap.
38383865 */
@@ -6085,6 +6112,52 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
60856112 }
60866113 vd -> vdev_failfast = intval & 1 ;
60876114 break ;
6115+ case VDEV_PROP_SIT_OUT :
6116+ /* Only expose this for a draid or raidz leaf */
6117+ if (!vd -> vdev_ops -> vdev_op_leaf ||
6118+ vd -> vdev_top == NULL ||
6119+ (vd -> vdev_top -> vdev_ops != & vdev_raidz_ops &&
6120+ vd -> vdev_top -> vdev_ops != & vdev_draid_ops )) {
6121+ error = ENOTSUP ;
6122+ break ;
6123+ }
6124+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6125+ error = EINVAL ;
6126+ break ;
6127+ }
6128+ if (intval == 1 ) {
6129+ vdev_t * pvd = vd -> vdev_top ;
6130+ uint_t sitouts = 0 ;
6131+ for (int i = 0 ; i < pvd -> vdev_children ; i ++ ) {
6132+ if (pvd -> vdev_child [i ] == vd )
6133+ continue ;
6134+ if (vdev_sit_out_reads (
6135+ pvd -> vdev_child [i ], 0 )) {
6136+ sitouts ++ ;
6137+ }
6138+ }
6139+ if (sitouts >= vdev_get_nparity (pvd )) {
6140+ error = ZFS_ERR_TOO_MANY_SITOUTS ;
6141+ break ;
6142+ }
6143+ if (error == 0 )
6144+ vdev_raidz_sit_child (vd );
6145+ } else {
6146+ vd -> vdev_read_sit_out_expire = 0 ;
6147+ }
6148+ break ;
6149+ case VDEV_PROP_AUTOSIT :
6150+ if (vd -> vdev_ops != & vdev_raidz_ops &&
6151+ vd -> vdev_ops != & vdev_draid_ops ) {
6152+ error = ENOTSUP ;
6153+ break ;
6154+ }
6155+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6156+ error = EINVAL ;
6157+ break ;
6158+ }
6159+ vd -> vdev_autosit = intval == 1 ;
6160+ break ;
60886161 case VDEV_PROP_CHECKSUM_N :
60896162 if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
60906163 error = EINVAL ;
@@ -6497,6 +6570,29 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
64976570 vdev_prop_add_list (outnvl , propname , strval ,
64986571 intval , src );
64996572 break ;
6573+ case VDEV_PROP_AUTOSIT :
6574+ /* Only raidz vdevs cannot have this property */
6575+ if (vd -> vdev_ops != & vdev_raidz_ops &&
6576+ vd -> vdev_ops != & vdev_draid_ops ) {
6577+ src = ZPROP_SRC_NONE ;
6578+ intval = ZPROP_BOOLEAN_NA ;
6579+ } else {
6580+ err = vdev_prop_get_int (vd , prop ,
6581+ & intval );
6582+ if (err && err != ENOENT )
6583+ break ;
6584+
6585+ if (intval ==
6586+ vdev_prop_default_numeric (prop ))
6587+ src = ZPROP_SRC_DEFAULT ;
6588+ else
6589+ src = ZPROP_SRC_LOCAL ;
6590+ }
6591+
6592+ vdev_prop_add_list (outnvl , propname , NULL ,
6593+ intval , src );
6594+ break ;
6595+
65006596 case VDEV_PROP_CHECKSUM_N :
65016597 case VDEV_PROP_CHECKSUM_T :
65026598 case VDEV_PROP_IO_N :
0 commit comments