@@ -852,18 +852,24 @@ dsl_scan_setup_check(void *arg, dmu_tx_t *tx)
852
852
return (0 );
853
853
}
854
854
855
+ typedef struct {
856
+ pool_scan_func_t func ;
857
+ uint64_t txgstart ;
858
+ uint64_t txgend ;
859
+ } setup_sync_arg_t ;
860
+
855
861
void
856
862
dsl_scan_setup_sync (void * arg , dmu_tx_t * tx )
857
863
{
858
- ( void ) arg ;
864
+ setup_sync_arg_t * setup_sync_arg = ( setup_sync_arg_t * ) arg ;
859
865
dsl_scan_t * scn = dmu_tx_pool (tx )-> dp_scan ;
860
- pool_scan_func_t * funcp = arg ;
861
866
dmu_object_type_t ot = 0 ;
862
867
dsl_pool_t * dp = scn -> scn_dp ;
863
868
spa_t * spa = dp -> dp_spa ;
864
869
865
870
ASSERT (!dsl_scan_is_running (scn ));
866
- ASSERT (* funcp > POOL_SCAN_NONE && * funcp < POOL_SCAN_FUNCS );
871
+ ASSERT3U (setup_sync_arg -> func , > , POOL_SCAN_NONE );
872
+ ASSERT3U (setup_sync_arg -> func , < , POOL_SCAN_FUNCS );
867
873
memset (& scn -> scn_phys , 0 , sizeof (scn -> scn_phys ));
868
874
869
875
/*
@@ -873,10 +879,14 @@ dsl_scan_setup_sync(void *arg, dmu_tx_t *tx)
873
879
memset (& scn -> errorscrub_phys , 0 , sizeof (scn -> errorscrub_phys ));
874
880
dsl_errorscrub_sync_state (scn , tx );
875
881
876
- scn -> scn_phys .scn_func = * funcp ;
882
+ scn -> scn_phys .scn_func = setup_sync_arg -> func ;
877
883
scn -> scn_phys .scn_state = DSS_SCANNING ;
878
- scn -> scn_phys .scn_min_txg = 0 ;
879
- scn -> scn_phys .scn_max_txg = tx -> tx_txg ;
884
+ scn -> scn_phys .scn_min_txg = setup_sync_arg -> txgstart ;
885
+ if (setup_sync_arg -> txgend == 0 ) {
886
+ scn -> scn_phys .scn_max_txg = tx -> tx_txg ;
887
+ } else {
888
+ scn -> scn_phys .scn_max_txg = setup_sync_arg -> txgend ;
889
+ }
880
890
scn -> scn_phys .scn_ddt_class_max = DDT_CLASSES - 1 ; /* the entire DDT */
881
891
scn -> scn_phys .scn_start_time = gethrestime_sec ();
882
892
scn -> scn_phys .scn_errors = 0 ;
@@ -963,7 +973,7 @@ dsl_scan_setup_sync(void *arg, dmu_tx_t *tx)
963
973
964
974
spa_history_log_internal (spa , "scan setup" , tx ,
965
975
"func=%u mintxg=%llu maxtxg=%llu" ,
966
- * funcp , (u_longlong_t )scn -> scn_phys .scn_min_txg ,
976
+ setup_sync_arg -> func , (u_longlong_t )scn -> scn_phys .scn_min_txg ,
967
977
(u_longlong_t )scn -> scn_phys .scn_max_txg );
968
978
}
969
979
@@ -973,10 +983,16 @@ dsl_scan_setup_sync(void *arg, dmu_tx_t *tx)
973
983
* error scrub.
974
984
*/
975
985
int
976
- dsl_scan (dsl_pool_t * dp , pool_scan_func_t func )
986
+ dsl_scan (dsl_pool_t * dp , pool_scan_func_t func , uint64_t txgstart ,
987
+ uint64_t txgend )
977
988
{
978
989
spa_t * spa = dp -> dp_spa ;
979
990
dsl_scan_t * scn = dp -> dp_scan ;
991
+ setup_sync_arg_t setup_sync_arg ;
992
+
993
+ if (func != POOL_SCAN_SCRUB && (txgstart != 0 || txgend != 0 )) {
994
+ return (EINVAL );
995
+ }
980
996
981
997
/*
982
998
* Purge all vdev caches and probe all devices. We do this here
@@ -1027,8 +1043,13 @@ dsl_scan(dsl_pool_t *dp, pool_scan_func_t func)
1027
1043
return (SET_ERROR (err ));
1028
1044
}
1029
1045
1046
+ setup_sync_arg .func = func ;
1047
+ setup_sync_arg .txgstart = txgstart ;
1048
+ setup_sync_arg .txgend = txgend ;
1049
+
1030
1050
return (dsl_sync_task (spa_name (spa ), dsl_scan_setup_check ,
1031
- dsl_scan_setup_sync , & func , 0 , ZFS_SPACE_CHECK_EXTRA_RESERVED ));
1051
+ dsl_scan_setup_sync , & setup_sync_arg , 0 ,
1052
+ ZFS_SPACE_CHECK_EXTRA_RESERVED ));
1032
1053
}
1033
1054
1034
1055
static void
@@ -4330,14 +4351,16 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx)
4330
4351
* current scan progress is below zfs_resilver_defer_percent.
4331
4352
*/
4332
4353
if (dsl_scan_restarting (scn , tx ) || restart_early ) {
4333
- pool_scan_func_t func = POOL_SCAN_SCRUB ;
4354
+ setup_sync_arg_t setup_sync_arg = {
4355
+ .func = POOL_SCAN_SCRUB ,
4356
+ };
4334
4357
dsl_scan_done (scn , B_FALSE , tx );
4335
4358
if (vdev_resilver_needed (spa -> spa_root_vdev , NULL , NULL ))
4336
- func = POOL_SCAN_RESILVER ;
4359
+ setup_sync_arg . func = POOL_SCAN_RESILVER ;
4337
4360
zfs_dbgmsg ("restarting scan func=%u on %s txg=%llu early=%d" ,
4338
- func , dp -> dp_spa -> spa_name , ( longlong_t ) tx -> tx_txg ,
4339
- restart_early );
4340
- dsl_scan_setup_sync (& func , tx );
4361
+ setup_sync_arg . func , dp -> dp_spa -> spa_name ,
4362
+ ( longlong_t ) tx -> tx_txg , restart_early );
4363
+ dsl_scan_setup_sync (& setup_sync_arg , tx );
4341
4364
}
4342
4365
4343
4366
/*
0 commit comments