@@ -449,32 +449,53 @@ vdev_get_nparity(vdev_t *vd)
449
449
}
450
450
451
451
static 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 )
453
453
{
454
- spa_t * spa = vd -> vdev_spa ;
455
- objset_t * mos = spa -> spa_meta_objset ;
456
- uint64_t objid ;
457
- int err ;
458
454
459
455
if (vd -> vdev_root_zap != 0 ) {
460
- objid = vd -> vdev_root_zap ;
456
+ * objid = vd -> vdev_root_zap ;
461
457
} else if (vd -> vdev_top_zap != 0 ) {
462
- objid = vd -> vdev_top_zap ;
458
+ * objid = vd -> vdev_top_zap ;
463
459
} else if (vd -> vdev_leaf_zap != 0 ) {
464
- objid = vd -> vdev_leaf_zap ;
460
+ * objid = vd -> vdev_leaf_zap ;
465
461
} else {
466
462
return (EINVAL );
467
463
}
468
464
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
+
469
479
err = zap_lookup (mos , objid , vdev_prop_to_name (prop ),
470
480
sizeof (uint64_t ), 1 , value );
471
-
472
481
if (err == ENOENT )
473
482
* value = vdev_prop_default_numeric (prop );
474
483
475
484
return (err );
476
485
}
477
486
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
+
478
499
/*
479
500
* Get the number of data disks for a top-level vdev.
480
501
*/
@@ -737,8 +758,12 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
737
758
*/
738
759
vd -> vdev_checksum_n = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
739
760
vd -> vdev_checksum_t = vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
761
+
740
762
vd -> vdev_io_n = vdev_prop_default_numeric (VDEV_PROP_IO_N );
741
763
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 );
742
767
vd -> vdev_slow_io_n = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_N );
743
768
vd -> vdev_slow_io_t = vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_T );
744
769
@@ -3903,6 +3928,11 @@ vdev_load(vdev_t *vd)
3903
3928
vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) "
3904
3929
"failed [error=%d]" , (u_longlong_t )zapobj , error );
3905
3930
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 );
3906
3936
error = vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
3907
3937
& vd -> vdev_slow_io_n );
3908
3938
if (error && error != ENOENT )
@@ -5950,15 +5980,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
5950
5980
/*
5951
5981
* Set vdev property values in the vdev props mos object.
5952
5982
*/
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 )
5960
5984
panic ("unexpected vdev type" );
5961
- }
5962
5985
5963
5986
mutex_enter (& spa -> spa_props_lock );
5964
5987
@@ -6135,6 +6158,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6135
6158
}
6136
6159
vd -> vdev_io_t = intval ;
6137
6160
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 ;
6138
6168
case VDEV_PROP_SLOW_IO_N :
6139
6169
if (nvpair_value_uint64 (elem , & intval ) != 0 ) {
6140
6170
error = EINVAL ;
@@ -6176,6 +6206,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6176
6206
nvpair_t * elem = NULL ;
6177
6207
nvlist_t * nvprops = NULL ;
6178
6208
uint64_t intval = 0 ;
6209
+ boolean_t boolval = 0 ;
6179
6210
char * strval = NULL ;
6180
6211
const char * propname = NULL ;
6181
6212
vdev_prop_t prop ;
@@ -6189,15 +6220,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6189
6220
6190
6221
nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
6191
6222
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 )
6199
6224
return (SET_ERROR (EINVAL ));
6200
- }
6201
6225
ASSERT (objid != 0 );
6202
6226
6203
6227
mutex_enter (& spa -> spa_props_lock );
@@ -6506,6 +6530,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
6506
6530
vdev_prop_add_list (outnvl , propname , strval ,
6507
6531
intval , src );
6508
6532
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 ;
6509
6545
case VDEV_PROP_CHECKSUM_N :
6510
6546
case VDEV_PROP_CHECKSUM_T :
6511
6547
case VDEV_PROP_IO_N :
0 commit comments