@@ -846,18 +846,24 @@ dsl_scan_setup_check(void *arg, dmu_tx_t *tx)
846
846
return (0 );
847
847
}
848
848
849
+ typedef struct {
850
+ pool_scan_func_t func ;
851
+ uint64_t txgstart ;
852
+ uint64_t txgend ;
853
+ } setup_sync_arg_t ;
854
+
849
855
void
850
856
dsl_scan_setup_sync (void * arg , dmu_tx_t * tx )
851
857
{
852
- ( void ) arg ;
858
+ setup_sync_arg_t * setup_sync_arg = ( setup_sync_arg_t * ) arg ;
853
859
dsl_scan_t * scn = dmu_tx_pool (tx )-> dp_scan ;
854
- pool_scan_func_t * funcp = arg ;
855
860
dmu_object_type_t ot = 0 ;
856
861
dsl_pool_t * dp = scn -> scn_dp ;
857
862
spa_t * spa = dp -> dp_spa ;
858
863
859
864
ASSERT (!dsl_scan_is_running (scn ));
860
- ASSERT (* funcp > POOL_SCAN_NONE && * funcp < POOL_SCAN_FUNCS );
865
+ ASSERT (setup_sync_arg -> func > POOL_SCAN_NONE &&
866
+ setup_sync_arg -> func < POOL_SCAN_FUNCS );
861
867
memset (& scn -> scn_phys , 0 , sizeof (scn -> scn_phys ));
862
868
863
869
/*
@@ -867,10 +873,14 @@ dsl_scan_setup_sync(void *arg, dmu_tx_t *tx)
867
873
memset (& scn -> errorscrub_phys , 0 , sizeof (scn -> errorscrub_phys ));
868
874
dsl_errorscrub_sync_state (scn , tx );
869
875
870
- scn -> scn_phys .scn_func = * funcp ;
876
+ scn -> scn_phys .scn_func = setup_sync_arg -> func ;
871
877
scn -> scn_phys .scn_state = DSS_SCANNING ;
872
- scn -> scn_phys .scn_min_txg = 0 ;
873
- scn -> scn_phys .scn_max_txg = tx -> tx_txg ;
878
+ scn -> scn_phys .scn_min_txg = setup_sync_arg -> txgstart ;
879
+ if (setup_sync_arg -> txgend == 0 ) {
880
+ scn -> scn_phys .scn_max_txg = tx -> tx_txg ;
881
+ } else {
882
+ scn -> scn_phys .scn_max_txg = setup_sync_arg -> txgend ;
883
+ }
874
884
scn -> scn_phys .scn_ddt_class_max = DDT_CLASSES - 1 ; /* the entire DDT */
875
885
scn -> scn_phys .scn_start_time = gethrestime_sec ();
876
886
scn -> scn_phys .scn_errors = 0 ;
@@ -955,7 +965,7 @@ dsl_scan_setup_sync(void *arg, dmu_tx_t *tx)
955
965
956
966
spa_history_log_internal (spa , "scan setup" , tx ,
957
967
"func=%u mintxg=%llu maxtxg=%llu" ,
958
- * funcp , (u_longlong_t )scn -> scn_phys .scn_min_txg ,
968
+ setup_sync_arg -> func , (u_longlong_t )scn -> scn_phys .scn_min_txg ,
959
969
(u_longlong_t )scn -> scn_phys .scn_max_txg );
960
970
}
961
971
@@ -965,10 +975,16 @@ dsl_scan_setup_sync(void *arg, dmu_tx_t *tx)
965
975
* error scrub.
966
976
*/
967
977
int
968
- dsl_scan (dsl_pool_t * dp , pool_scan_func_t func )
978
+ dsl_scan (dsl_pool_t * dp , pool_scan_func_t func , uint64_t txgstart ,
979
+ uint64_t txgend )
969
980
{
970
981
spa_t * spa = dp -> dp_spa ;
971
982
dsl_scan_t * scn = dp -> dp_scan ;
983
+ setup_sync_arg_t setup_sync_arg ;
984
+
985
+ if (func != POOL_SCAN_SCRUB && (txgstart != 0 || txgend != 0 )) {
986
+ return (EINVAL );
987
+ }
972
988
973
989
/*
974
990
* Purge all vdev caches and probe all devices. We do this here
@@ -1019,8 +1035,13 @@ dsl_scan(dsl_pool_t *dp, pool_scan_func_t func)
1019
1035
return (SET_ERROR (err ));
1020
1036
}
1021
1037
1038
+ setup_sync_arg .func = func ;
1039
+ setup_sync_arg .txgstart = txgstart ;
1040
+ setup_sync_arg .txgend = txgend ;
1041
+
1022
1042
return (dsl_sync_task (spa_name (spa ), dsl_scan_setup_check ,
1023
- dsl_scan_setup_sync , & func , 0 , ZFS_SPACE_CHECK_EXTRA_RESERVED ));
1043
+ dsl_scan_setup_sync , & setup_sync_arg , 0 ,
1044
+ ZFS_SPACE_CHECK_EXTRA_RESERVED ));
1024
1045
}
1025
1046
1026
1047
static void
@@ -4283,13 +4304,16 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx)
4283
4304
*/
4284
4305
if (dsl_scan_restarting (scn , tx ) ||
4285
4306
(spa -> spa_resilver_deferred && zfs_resilver_disable_defer )) {
4286
- pool_scan_func_t func = POOL_SCAN_SCRUB ;
4307
+ setup_sync_arg_t setup_sync_arg = {
4308
+ .func = POOL_SCAN_SCRUB ,
4309
+ };
4287
4310
dsl_scan_done (scn , B_FALSE , tx );
4288
4311
if (vdev_resilver_needed (spa -> spa_root_vdev , NULL , NULL ))
4289
- func = POOL_SCAN_RESILVER ;
4312
+ setup_sync_arg . func = POOL_SCAN_RESILVER ;
4290
4313
zfs_dbgmsg ("restarting scan func=%u on %s txg=%llu" ,
4291
- func , dp -> dp_spa -> spa_name , (longlong_t )tx -> tx_txg );
4292
- dsl_scan_setup_sync (& func , tx );
4314
+ setup_sync_arg .func , dp -> dp_spa -> spa_name ,
4315
+ (longlong_t )tx -> tx_txg );
4316
+ dsl_scan_setup_sync (& setup_sync_arg , tx );
4293
4317
}
4294
4318
4295
4319
/*
0 commit comments