@@ -430,32 +430,53 @@ vdev_get_nparity(vdev_t *vd)
430
430
}
431
431
432
432
static int
433
- vdev_prop_get_int (vdev_t * vd , vdev_prop_t prop , uint64_t * value )
433
+ vdev_prop_get_objid (vdev_t * vd , uint64_t * objid )
434
434
{
435
- spa_t * spa = vd -> vdev_spa ;
436
- objset_t * mos = spa -> spa_meta_objset ;
437
- uint64_t objid ;
438
- int err ;
439
435
440
436
if (vd -> vdev_root_zap != 0 ) {
441
- objid = vd -> vdev_root_zap ;
437
+ * objid = vd -> vdev_root_zap ;
442
438
} else if (vd -> vdev_top_zap != 0 ) {
443
- objid = vd -> vdev_top_zap ;
439
+ * objid = vd -> vdev_top_zap ;
444
440
} else if (vd -> vdev_leaf_zap != 0 ) {
445
- objid = vd -> vdev_leaf_zap ;
441
+ * objid = vd -> vdev_leaf_zap ;
446
442
} else {
447
443
return (EINVAL );
448
444
}
449
445
446
+ return (0 );
447
+ }
448
+
449
+ static int
450
+ vdev_prop_get_int (vdev_t * vd , vdev_prop_t prop , uint64_t * value )
451
+ {
452
+ spa_t * spa = vd -> vdev_spa ;
453
+ objset_t * mos = spa -> spa_meta_objset ;
454
+ uint64_t objid ;
455
+ int err ;
456
+
457
+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
458
+ return (EINVAL );
459
+
450
460
err = zap_lookup (mos , objid , vdev_prop_to_name (prop ),
451
461
sizeof (uint64_t ), 1 , value );
452
-
453
462
if (err == ENOENT )
454
463
* value = vdev_prop_default_numeric (prop );
455
464
456
465
return (err );
457
466
}
458
467
468
+ static int
469
+ vdev_prop_get_bool (vdev_t * vd , vdev_prop_t prop , boolean_t * bvalue )
470
+ {
471
+ int err ;
472
+ uint64_t ivalue ;
473
+
474
+ err = vdev_prop_get_int (vd , prop , & ivalue );
475
+ * bvalue = ivalue != 0 ;
476
+
477
+ return (err );
478
+ }
479
+
459
480
/*
460
481
* Get the number of data disks for a top-level vdev.
461
482
*/
@@ -717,8 +738,12 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
717
738
*/
718
739
vd -> vdev_checksum_n = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
719
740
vd -> vdev_checksum_t = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
741
+
720
742
vd -> vdev_io_n = vdev_prop_default_numeric (VDEV_PROP_IO_N );
721
743
vd -> vdev_io_t = vdev_prop_default_numeric (VDEV_PROP_IO_T );
744
+
745
+ vd -> vdev_slow_io_events = vdev_prop_default_numeric (
746
+ VDEV_PROP_SLOW_IO_EVENTS );
722
747
vd -> vdev_slow_io_n = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_N );
723
748
vd -> vdev_slow_io_t = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_T );
724
749
@@ -3879,6 +3904,11 @@ vdev_load(vdev_t *vd)
3879
3904
vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3880
3905
"failed [error=%d]" , (u_longlong_t )zapobj , error );
3881
3906
3907
+ error = vdev_prop_get_bool (vd , VDEV_PROP_SLOW_IO_EVENTS ,
3908
+ & vd -> vdev_slow_io_events );
3909
+ if (error && error != ENOENT )
3910
+ vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3911
+ "failed [error=%d]" , (u_longlong_t )zapobj , error );
3882
3912
error = vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
3883
3913
& vd -> vdev_slow_io_n );
3884
3914
if (error && error != ENOENT )
@@ -5926,15 +5956,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
5926
5956
/*
5927
5957
* Set vdev property values in the vdev props mos object.
5928
5958
*/
5929
- if (vd -> vdev_root_zap != 0 ) {
5930
- objid = vd -> vdev_root_zap ;
5931
- } else if (vd -> vdev_top_zap != 0 ) {
5932
- objid = vd -> vdev_top_zap ;
5933
- } else if (vd -> vdev_leaf_zap != 0 ) {
5934
- objid = vd -> vdev_leaf_zap ;
5935
- } else {
5959
+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
5936
5960
panic ("unexpected vdev type" );
5937
- }
5938
5961
5939
5962
mutex_enter (& spa -> spa_props_lock );
5940
5963
@@ -6111,6 +6134,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6111
6134
}
6112
6135
vd -> vdev_io_t = intval ;
6113
6136
break ;
6137
+ case VDEV_PROP_SLOW_IO_EVENTS :
6138
+ if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6139
+ error = EINVAL ;
6140
+ break ;
6141
+ }
6142
+ vd -> vdev_slow_io_events = intval != 0 ;
6143
+ break ;
6114
6144
case VDEV_PROP_SLOW_IO_N :
6115
6145
if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6116
6146
error = EINVAL ;
@@ -6152,6 +6182,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6152
6182
nvpair_t * elem = NULL ;
6153
6183
nvlist_t * nvprops = NULL ;
6154
6184
uint64_t intval = 0 ;
6185
+ boolean_t boolval = 0 ;
6155
6186
char * strval = NULL ;
6156
6187
const char * propname = NULL ;
6157
6188
vdev_prop_t prop ;
@@ -6165,15 +6196,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6165
6196
6166
6197
nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
6167
6198
6168
- if (vd -> vdev_root_zap != 0 ) {
6169
- objid = vd -> vdev_root_zap ;
6170
- } else if (vd -> vdev_top_zap != 0 ) {
6171
- objid = vd -> vdev_top_zap ;
6172
- } else if (vd -> vdev_leaf_zap != 0 ) {
6173
- objid = vd -> vdev_leaf_zap ;
6174
- } else {
6199
+ if (vdev_prop_get_objid (vd , & objid ) != 0 )
6175
6200
return (SET_ERROR (EINVAL ));
6176
- }
6177
6201
ASSERT (objid != 0 );
6178
6202
6179
6203
mutex_enter (& spa -> spa_props_lock );
@@ -6482,6 +6506,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6482
6506
vdev_prop_add_list (outnvl , propname , strval ,
6483
6507
intval , src );
6484
6508
break ;
6509
+ case VDEV_PROP_SLOW_IO_EVENTS :
6510
+ err = vdev_prop_get_bool (vd , prop , & boolval );
6511
+ if (err && err != ENOENT )
6512
+ break ;
6513
+
6514
+ src = ZPROP_SRC_LOCAL ;
6515
+ if (boolval == vdev_prop_default_numeric (prop ))
6516
+ src = ZPROP_SRC_DEFAULT ;
6517
+
6518
+ vdev_prop_add_list (outnvl , propname , NULL ,
6519
+ boolval , src );
6520
+ break ;
6485
6521
case VDEV_PROP_CHECKSUM_N :
6486
6522
case VDEV_PROP_CHECKSUM_T :
6487
6523
case VDEV_PROP_IO_N :
0 commit comments