From 4383355e5125a296d036c350bfa04a243951bc07 Mon Sep 17 00:00:00 2001 From: Pavel Snajdr Date: Thu, 25 Jan 2024 03:13:14 +0100 Subject: [PATCH] Refactor dsl_scan_sync a bit In hope the result is more readable. Signed-off-by: Pavel Snajdr --- module/zfs/dsl_scan.c | 75 ++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/module/zfs/dsl_scan.c b/module/zfs/dsl_scan.c index b7e14709a0..38d252e850 100644 --- a/module/zfs/dsl_scan.c +++ b/module/zfs/dsl_scan.c @@ -4266,47 +4266,6 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx) uint64_t to_issue, issued; int restart_early; - /* - * Check for scn_restart_txg before checking spa_load_state, so - * that we can restart an old-style scan while the pool is being - * imported (see dsl_scan_init). We also restart scans if there - * is a deferred resilver and the user has manually disabled - * deferred resilvers via the tunable, or if the curent scan progress - * is below zfs_resilver_defer_percent. - */ - - /* - * Taken from spa_misc.c spa_scan_get_stats(): - */ - to_issue = scn->scn_phys.scn_to_examine - scn->scn_phys.scn_skipped; - issued = scn->scn_issued_before_pass + spa->spa_scan_pass_issued; - - /* - * Make sure we're not in a restart loop and check the threshold - */ - restart_early = (spa_sync_pass(spa) == 1) && - spa->spa_resilver_deferred && - (issued < (to_issue * zfs_resilver_defer_percent / 100)); - - /* - * Only increment the feature if we're not about to restart early - */ - if (!restart_early && spa->spa_resilver_deferred && - !spa_feature_is_active(dp->dp_spa, SPA_FEATURE_RESILVER_DEFER)) - spa_feature_incr(spa, SPA_FEATURE_RESILVER_DEFER, tx); - - if (dsl_scan_restarting(scn, tx) || restart_early || - (spa->spa_resilver_deferred && zfs_resilver_disable_defer)) { - pool_scan_func_t func = POOL_SCAN_SCRUB; - dsl_scan_done(scn, B_FALSE, tx); - if (vdev_resilver_needed(spa->spa_root_vdev, NULL, NULL)) - func = POOL_SCAN_RESILVER; - zfs_dbgmsg("restarting scan func=%u on %s txg=%llu early=%d", - func, dp->dp_spa->spa_name, (longlong_t)tx->tx_txg, - restart_early); - dsl_scan_setup_sync(&func, tx); - } - /* * Only process scans in sync pass 1. */ @@ -4327,6 +4286,40 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx) if (!scn->scn_async_stalled && !dsl_scan_active(scn)) return; + /* + * issued/to_issue as presented to the user + * in print_scan_scrub_resilver_status() issued/total_i + * @ cmd/zpool/zpool_main.c + */ + to_issue = scn->scn_phys.scn_to_examine - scn->scn_phys.scn_skipped; + issued = scn->scn_issued_before_pass + spa->spa_scan_pass_issued; + restart_early = spa->spa_resilver_deferred && ( + zfs_resilver_disable_defer || + (issued < (to_issue * zfs_resilver_defer_percent / 100))); + + if (spa->spa_resilver_deferred && + !spa_feature_is_active(dp->dp_spa, SPA_FEATURE_RESILVER_DEFER)) + spa_feature_incr(spa, SPA_FEATURE_RESILVER_DEFER, tx); + + /* + * Check for scn_restart_txg before checking spa_load_state, so + * that we can restart an old-style scan while the pool is being + * imported (see dsl_scan_init). We also restart scans if there + * is a deferred resilver and the user has manually disabled + * deferred resilvers via zfs_resilver_disable_defer, or if the + * curent scan progress is below zfs_resilver_defer_percent. + */ + if (dsl_scan_restarting(scn, tx) || restart_early) { + pool_scan_func_t func = POOL_SCAN_SCRUB; + dsl_scan_done(scn, B_FALSE, tx); + if (vdev_resilver_needed(spa->spa_root_vdev, NULL, NULL)) + func = POOL_SCAN_RESILVER; + zfs_dbgmsg("restarting scan func=%u on %s txg=%llu early=%d", + func, dp->dp_spa->spa_name, (longlong_t)tx->tx_txg, + restart_early); + dsl_scan_setup_sync(&func, tx); + } + /* reset scan statistics */ scn->scn_visited_this_txg = 0; scn->scn_dedup_frees_this_txg = 0;