@@ -427,32 +427,53 @@ vdev_get_nparity(vdev_t *vd)
427427}
428428
429429static  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 )
431431{
432- 	spa_t  * spa  =  vd -> vdev_spa ;
433- 	objset_t  * mos  =  spa -> spa_meta_objset ;
434- 	uint64_t  objid ;
435- 	int  err ;
436432
437433	if  (vd -> vdev_root_zap  !=  0 ) {
438- 		objid  =  vd -> vdev_root_zap ;
434+ 		* objid  =  vd -> vdev_root_zap ;
439435	} else  if  (vd -> vdev_top_zap  !=  0 ) {
440- 		objid  =  vd -> vdev_top_zap ;
436+ 		* objid  =  vd -> vdev_top_zap ;
441437	} else  if  (vd -> vdev_leaf_zap  !=  0 ) {
442- 		objid  =  vd -> vdev_leaf_zap ;
438+ 		* objid  =  vd -> vdev_leaf_zap ;
443439	} else  {
444440		return  (EINVAL );
445441	}
446442
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+ 
447457	err  =  zap_lookup (mos , objid , vdev_prop_to_name (prop ),
448458	    sizeof  (uint64_t ), 1 , value );
449- 
450459	if  (err  ==  ENOENT )
451460		* value  =  vdev_prop_default_numeric (prop );
452461
453462	return  (err );
454463}
455464
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+ 
456477/* 
457478 * Get the number of data disks for a top-level vdev. 
458479 */ 
@@ -713,8 +734,12 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
713734	 */ 
714735	vd -> vdev_checksum_n  =  vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
715736	vd -> vdev_checksum_t  =  vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
737+ 
716738	vd -> vdev_io_n  =  vdev_prop_default_numeric (VDEV_PROP_IO_N );
717739	vd -> vdev_io_t  =  vdev_prop_default_numeric (VDEV_PROP_IO_T );
740+ 
741+ 	vd -> vdev_slow_io_events  =  vdev_prop_default_numeric (
742+ 	    VDEV_PROP_SLOW_IO_EVENTS );
718743	vd -> vdev_slow_io_n  =  vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_N );
719744	vd -> vdev_slow_io_t  =  vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_T );
720745
@@ -3852,6 +3877,11 @@ vdev_load(vdev_t *vd)
38523877			vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) " 
38533878			    "failed [error=%d]" , (u_longlong_t )zapobj , error );
38543879
3880+ 		error  =  vdev_prop_get_bool (vd , VDEV_PROP_SLOW_IO_EVENTS ,
3881+ 		    & vd -> vdev_slow_io_events );
3882+ 		if  (error  &&  error  !=  ENOENT )
3883+ 			vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) " 
3884+ 			    "failed [error=%d]" , (u_longlong_t )zapobj , error );
38553885		error  =  vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
38563886		    & vd -> vdev_slow_io_n );
38573887		if  (error  &&  error  !=  ENOENT )
@@ -5899,15 +5929,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
58995929	/* 
59005930	 * Set vdev property values in the vdev props mos object. 
59015931	 */ 
5902- 	if  (vd -> vdev_root_zap  !=  0 ) {
5903- 		objid  =  vd -> vdev_root_zap ;
5904- 	} else  if  (vd -> vdev_top_zap  !=  0 ) {
5905- 		objid  =  vd -> vdev_top_zap ;
5906- 	} else  if  (vd -> vdev_leaf_zap  !=  0 ) {
5907- 		objid  =  vd -> vdev_leaf_zap ;
5908- 	} else  {
5932+ 	if  (vdev_prop_get_objid (vd , & objid ) !=  0 )
59095933		panic ("unexpected vdev type" );
5910- 	}
59115934
59125935	mutex_enter (& spa -> spa_props_lock );
59135936
@@ -6084,6 +6107,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
60846107			}
60856108			vd -> vdev_io_t  =  intval ;
60866109			break ;
6110+ 		case  VDEV_PROP_SLOW_IO_EVENTS :
6111+ 			if  (nvpair_value_uint64 (elem , & intval ) !=  0 ) {
6112+ 				error  =  EINVAL ;
6113+ 				break ;
6114+ 			}
6115+ 			vd -> vdev_slow_io_events  =  intval  !=  0 ;
6116+ 			break ;
60876117		case  VDEV_PROP_SLOW_IO_N :
60886118			if  (nvpair_value_uint64 (elem , & intval ) !=  0 ) {
60896119				error  =  EINVAL ;
@@ -6125,6 +6155,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61256155	nvpair_t  * elem  =  NULL ;
61266156	nvlist_t  * nvprops  =  NULL ;
61276157	uint64_t  intval  =  0 ;
6158+ 	boolean_t  boolval  =  0 ;
61286159	char  * strval  =  NULL ;
61296160	const  char  * propname  =  NULL ;
61306161	vdev_prop_t  prop ;
@@ -6138,15 +6169,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61386169
61396170	nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
61406171
6141- 	if  (vd -> vdev_root_zap  !=  0 ) {
6142- 		objid  =  vd -> vdev_root_zap ;
6143- 	} else  if  (vd -> vdev_top_zap  !=  0 ) {
6144- 		objid  =  vd -> vdev_top_zap ;
6145- 	} else  if  (vd -> vdev_leaf_zap  !=  0 ) {
6146- 		objid  =  vd -> vdev_leaf_zap ;
6147- 	} else  {
6172+ 	if  (vdev_prop_get_objid (vd , & objid ) !=  0 )
61486173		return  (SET_ERROR (EINVAL ));
6149- 	}
61506174	ASSERT (objid  !=  0 );
61516175
61526176	mutex_enter (& spa -> spa_props_lock );
@@ -6455,6 +6479,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
64556479				vdev_prop_add_list (outnvl , propname , strval ,
64566480				    intval , src );
64576481				break ;
6482+ 			case  VDEV_PROP_SLOW_IO_EVENTS :
6483+ 				err  =  vdev_prop_get_bool (vd , prop , & boolval );
6484+ 				if  (err  &&  err  !=  ENOENT )
6485+ 					break ;
6486+ 
6487+ 				src  =  ZPROP_SRC_LOCAL ;
6488+ 				if  (boolval  ==  vdev_prop_default_numeric (prop ))
6489+ 					src  =  ZPROP_SRC_DEFAULT ;
6490+ 
6491+ 				vdev_prop_add_list (outnvl , propname , NULL ,
6492+ 				    boolval , src );
6493+ 				break ;
64586494			case  VDEV_PROP_CHECKSUM_N :
64596495			case  VDEV_PROP_CHECKSUM_T :
64606496			case  VDEV_PROP_IO_N :
0 commit comments