@@ -695,6 +695,7 @@ spa_prop_validate(spa_t *spa, nvlist_t *props)
695
695
int error = 0 , reset_bootfs = 0 ;
696
696
uint64_t objnum = 0 ;
697
697
boolean_t has_feature = B_FALSE ;
698
+ zia_props_t * zia_props = zia_get_props (spa );
698
699
699
700
elem = NULL ;
700
701
while ((elem = nvlist_next_nvpair (props , elem )) != NULL ) {
@@ -890,6 +891,40 @@ spa_prop_validate(spa_t *spa, nvlist_t *props)
890
891
break ;
891
892
892
893
case ZPOOL_PROP_ZIA_PROVIDER :
894
+ strval = fnvpair_value_string (elem );
895
+ if (strncmp (strval , "NULL" , 5 ) == 0 ||
896
+ strncmp (strval , "off" , 4 ) == 0 ) {
897
+ zia_put_provider (& zia_props -> provider ,
898
+ spa -> spa_root_vdev );
899
+ break ;
900
+ }
901
+
902
+ void * new_provider = zia_get_provider (strval );
903
+ if (new_provider == NULL ) {
904
+ error = SET_ERROR (ZFS_ERR_ZIA_NONEXISTENT_PROVIDER );
905
+ break ;
906
+ }
907
+
908
+ if (zia_props -> provider != NULL )
909
+ zia_put_provider (& zia_props -> provider ,
910
+ spa -> spa_root_vdev );
911
+
912
+ zia_props -> provider = new_provider ;
913
+ zia_props -> can_offload = !!zia_props -> provider ;
914
+
915
+ /*
916
+ * It is possible to enable disk_write or file_write
917
+ * without passing a provider, or swapping one
918
+ * provider with another while these flags are enabled.
919
+ * In those cases, vdevs must be opened for the new
920
+ * provider upon being passed.
921
+ * The vdevs will be closed for the older provider
922
+ * in zia_put_provider() first.
923
+ */
924
+ ASSERT3P (spa -> spa_root_vdev , != , NULL );
925
+ if (zia_props -> disk_write || zia_props -> file_write )
926
+ zia_open_vdevs (spa -> spa_root_vdev );
927
+ break ;
893
928
case ZPOOL_PROP_ZIA_COMPRESS :
894
929
case ZPOOL_PROP_ZIA_DECOMPRESS :
895
930
case ZPOOL_PROP_ZIA_CHECKSUM :
@@ -9812,32 +9847,6 @@ spa_sync_props(void *arg, dmu_tx_t *tx)
9812
9847
break ;
9813
9848
case ZPOOL_PROP_ZIA_PROVIDER :
9814
9849
strval = fnvpair_value_string (elem );
9815
- if (strncmp (strval , "NULL" , 5 ) == 0 ||
9816
- strncmp (strval , "off" , 4 ) == 0 ) {
9817
- zia_put_provider (& zia_props -> provider ,
9818
- spa -> spa_root_vdev );
9819
- break ;
9820
- }
9821
-
9822
- if (zia_props -> provider != NULL )
9823
- zia_put_provider (& zia_props -> provider ,
9824
- spa -> spa_root_vdev );
9825
- zia_props -> provider = zia_get_provider (strval );
9826
- zia_props -> can_offload = !!zia_props -> provider ;
9827
-
9828
- /*
9829
- * It is possible to enable disk_write or file_write
9830
- * without passing a provider, or swapping one
9831
- * provider with another while these flags are enabled.
9832
- * In those cases, vdevs must be opened for the new
9833
- * provider upon being passed.
9834
- * The vdevs will be closed for the older provider
9835
- * in zia_put_provider() first.
9836
- */
9837
- ASSERT3P (spa -> spa_root_vdev , != , NULL );
9838
- if (zia_props -> disk_write || zia_props -> file_write )
9839
- zia_open_vdevs (spa -> spa_root_vdev );
9840
-
9841
9850
spa_history_log_internal (spa , "set" , tx ,
9842
9851
"%s=%s" , nvpair_name (elem ), strval );
9843
9852
break ;
0 commit comments