@@ -449,32 +449,53 @@ vdev_get_nparity(vdev_t *vd)
449449}
450450
451451static  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 )
453453{
454- 	spa_t  * spa  =  vd -> vdev_spa ;
455- 	objset_t  * mos  =  spa -> spa_meta_objset ;
456- 	uint64_t  objid ;
457- 	int  err ;
458454
459455	if  (vd -> vdev_root_zap  !=  0 ) {
460- 		objid  =  vd -> vdev_root_zap ;
456+ 		* objid  =  vd -> vdev_root_zap ;
461457	} else  if  (vd -> vdev_top_zap  !=  0 ) {
462- 		objid  =  vd -> vdev_top_zap ;
458+ 		* objid  =  vd -> vdev_top_zap ;
463459	} else  if  (vd -> vdev_leaf_zap  !=  0 ) {
464- 		objid  =  vd -> vdev_leaf_zap ;
460+ 		* objid  =  vd -> vdev_leaf_zap ;
465461	} else  {
466462		return  (EINVAL );
467463	}
468464
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+ 
469479	err  =  zap_lookup (mos , objid , vdev_prop_to_name (prop ),
470480	    sizeof  (uint64_t ), 1 , value );
471- 
472481	if  (err  ==  ENOENT )
473482		* value  =  vdev_prop_default_numeric (prop );
474483
475484	return  (err );
476485}
477486
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+ 
478499/* 
479500 * Get the number of data disks for a top-level vdev. 
480501 */ 
@@ -737,8 +758,12 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
737758	 */ 
738759	vd -> vdev_checksum_n  =  vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_N );
739760	vd -> vdev_checksum_t  =  vdev_prop_default_numeric (VDEV_PROP_CHECKSUM_T );
761+ 
740762	vd -> vdev_io_n  =  vdev_prop_default_numeric (VDEV_PROP_IO_N );
741763	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 );
742767	vd -> vdev_slow_io_n  =  vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_N );
743768	vd -> vdev_slow_io_t  =  vdev_prop_default_numeric (VDEV_PROP_SLOW_IO_T );
744769
@@ -3903,6 +3928,11 @@ vdev_load(vdev_t *vd)
39033928			vdev_dbgmsg (vd , "vdev_load: zap_lookup(zap=%llu) " 
39043929			    "failed [error=%d]" , (u_longlong_t )zapobj , error );
39053930
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 );
39063936		error  =  vdev_prop_get_int (vd , VDEV_PROP_SLOW_IO_N ,
39073937		    & vd -> vdev_slow_io_n );
39083938		if  (error  &&  error  !=  ENOENT )
@@ -5950,15 +5980,8 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
59505980	/* 
59515981	 * Set vdev property values in the vdev props mos object. 
59525982	 */ 
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 )
59605984		panic ("unexpected vdev type" );
5961- 	}
59625985
59635986	mutex_enter (& spa -> spa_props_lock );
59645987
@@ -6135,6 +6158,13 @@ vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61356158			}
61366159			vd -> vdev_io_t  =  intval ;
61376160			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 ;
61386168		case  VDEV_PROP_SLOW_IO_N :
61396169			if  (nvpair_value_uint64 (elem , & intval ) !=  0 ) {
61406170				error  =  EINVAL ;
@@ -6176,6 +6206,7 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61766206	nvpair_t  * elem  =  NULL ;
61776207	nvlist_t  * nvprops  =  NULL ;
61786208	uint64_t  intval  =  0 ;
6209+ 	boolean_t  boolval  =  0 ;
61796210	char  * strval  =  NULL ;
61806211	const  char  * propname  =  NULL ;
61816212	vdev_prop_t  prop ;
@@ -6189,15 +6220,8 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
61896220
61906221	nvlist_lookup_nvlist (innvl , ZPOOL_VDEV_PROPS_GET_PROPS , & nvprops );
61916222
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 )
61996224		return  (SET_ERROR (EINVAL ));
6200- 	}
62016225	ASSERT (objid  !=  0 );
62026226
62036227	mutex_enter (& spa -> spa_props_lock );
@@ -6506,6 +6530,18 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
65066530				vdev_prop_add_list (outnvl , propname , strval ,
65076531				    intval , src );
65086532				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 ;
65096545			case  VDEV_PROP_CHECKSUM_N :
65106546			case  VDEV_PROP_CHECKSUM_T :
65116547			case  VDEV_PROP_IO_N :
0 commit comments