@@ -427,32 +427,53 @@ vdev_get_nparity(vdev_t *vd)
427
427
}
428
428
429
429
static 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 )
431
431
{
432
- spa_t * spa = vd -> vdev_spa ;
433
- objset_t * mos = spa -> spa_meta_objset ;
434
- uint64_t objid ;
435
- int err ;
436
432
437
433
if (vd -> vdev_root_zap != 0 ) {
438
- objid = vd -> vdev_root_zap ;
434
+ * objid = vd -> vdev_root_zap ;
439
435
} else if (vd -> vdev_top_zap != 0 ) {
440
- objid = vd -> vdev_top_zap ;
436
+ * objid = vd -> vdev_top_zap ;
441
437
} else if (vd -> vdev_leaf_zap != 0 ) {
442
- objid = vd -> vdev_leaf_zap ;
438
+ * objid = vd -> vdev_leaf_zap ;
443
439
} else {
444
440
return (EINVAL );
445
441
}
446
442
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
+
447
457
err = zap_lookup (mos , objid , vdev_prop_to_name (prop ),
448
458
sizeof (uint64_t ), 1 , value );
449
-
450
459
if (err == ENOENT )
451
460
* value = vdev_prop_default_numeric (prop );
452
461
453
462
return (err );
454
463
}
455
464
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
+
456
477
/*
457
478
* Get the number of data disks for a top-level vdev.
458
479
*/
@@ -714,8 +735,12 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
714
735
*/
715
736
vd -> vdev_checksum_n = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
716
737
vd -> vdev_checksum_t = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
738
+
717
739
vd -> vdev_io_n = vdev_prop_default_numeric (VDEV_PROP_IO_N );
718
740
vd -> vdev_io_t = vdev_prop_default_numeric (VDEV_PROP_IO_T );
741
+
742
+ vd -> vdev_slow_io_events = vdev_prop_default_numeric (
743
+ VDEV_PROP_SLOW_IO_EVENTS );
719
744
vd -> vdev_slow_io_n = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_N );
720
745
vd -> vdev_slow_io_t = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_T );
721
746
@@ -3870,6 +3895,11 @@ vdev_load(vdev_t *vd)
3870
3895
vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3871
3896
"failed [error=%d]" , (u_longlong_t )zapobj , error );
3872
3897
3898
+ error = vdev_prop_get_bool (vd , VDEV_PROP_SLOW_IO_EVENTS ,
3899
+ & vd -> vdev_slow_io_events );
3900
+ if (error && error != ENOENT )
3901
+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3902
+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
3873
3903
error = vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
3874
3904
& vd -> vdev_slow_io_n );
3875
3905
if (error && error != ENOENT )
@@ -5917,15 +5947,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
5917
5947
/*
5918
5948
* Set vdev property values in the vdev props mos object.
5919
5949
*/
5920
- if (vd -> vdev_root_zap != 0 ) {
5921
- objid = vd -> vdev_root_zap ;
5922
- } else if (vd -> vdev_top_zap != 0 ) {
5923
- objid = vd -> vdev_top_zap ;
5924
- } else if (vd -> vdev_leaf_zap != 0 ) {
5925
- objid = vd -> vdev_leaf_zap ;
5926
- } else {
5950
+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
5927
5951
panic ("unexpected vdev type" );
5928
- }
5929
5952
5930
5953
mutex_enter (& spa -> spa_props_lock );
5931
5954
@@ -6102,6 +6125,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6102
6125
}
6103
6126
vd -> vdev_io_t = intval ;
6104
6127
break ;
6128
+ case VDEV_PROP_SLOW_IO_EVENTS :
6129
+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6130
+ error = EINVAL ;
6131
+ break ;
6132
+ }
6133
+ vd -> vdev_slow_io_events = intval != 0 ;
6134
+ break ;
6105
6135
case VDEV_PROP_SLOW_IO_N :
6106
6136
if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6107
6137
error = EINVAL ;
@@ -6143,6 +6173,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6143
6173
nvpair_t * elem = NULL ;
6144
6174
nvlist_t * nvprops = NULL ;
6145
6175
uint64_t intval = 0 ;
6176
+ boolean_t boolval = 0 ;
6146
6177
char * strval = NULL ;
6147
6178
const char * propname = NULL ;
6148
6179
vdev_prop_t prop ;
@@ -6156,15 +6187,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6156
6187
6157
6188
nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
6158
6189
6159
- if (vd -> vdev_root_zap != 0 ) {
6160
- objid = vd -> vdev_root_zap ;
6161
- } else if (vd -> vdev_top_zap != 0 ) {
6162
- objid = vd -> vdev_top_zap ;
6163
- } else if (vd -> vdev_leaf_zap != 0 ) {
6164
- objid = vd -> vdev_leaf_zap ;
6165
- } else {
6190
+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
6166
6191
return (SET_ERROR (EINVAL ));
6167
- }
6168
6192
ASSERT (objid != 0 );
6169
6193
6170
6194
mutex_enter (& spa -> spa_props_lock );
@@ -6473,6 +6497,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6473
6497
vdev_prop_add_list (outnvl , propname , strval ,
6474
6498
intval , src );
6475
6499
break ;
6500
+ case VDEV_PROP_SLOW_IO_EVENTS :
6501
+ err = vdev_prop_get_bool (vd , prop , & boolval );
6502
+ if (err && err != ENOENT )
6503
+ break ;
6504
+
6505
+ src = ZPROP_SRC_LOCAL ;
6506
+ if (boolval == vdev_prop_default_numeric (prop ))
6507
+ src = ZPROP_SRC_DEFAULT ;
6508
+
6509
+ vdev_prop_add_list (outnvl , propname , NULL ,
6510
+ boolval , src );
6511
+ break ;
6476
6512
case VDEV_PROP_CHECKSUM_N :
6477
6513
case VDEV_PROP_CHECKSUM_T :
6478
6514
case VDEV_PROP_IO_N :
0 commit comments