Fix 2 small bugs with cached dsl_scan_phys_t

This patch corrects 2 small bugs where scn->scn_phys_cached was
not properly updated to match the primary copy when it needed to
be. The first resulted in the pause state not being properly
updated and the second resulted in the cached version being
completely zeroed even if the primary was not.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Serapheim Dimitropoulos <serapheim.dimitro@delphix.com>
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #8010
This commit is contained in:
Tom Caputi 2018-10-23 15:17:18 -04:00 committed by Brian Behlendorf
parent 7d658d29cf
commit 8cb119e3dc

View File

@ -390,7 +390,6 @@ dsl_scan_init(dsl_pool_t *dp, uint64_t txg)
scn->scn_maxinflight_bytes = MAX(zfs_scan_vdev_limit * scn->scn_maxinflight_bytes = MAX(zfs_scan_vdev_limit *
dsl_scan_count_leaves(spa->spa_root_vdev), 1ULL << 20); dsl_scan_count_leaves(spa->spa_root_vdev), 1ULL << 20);
bcopy(&scn->scn_phys, &scn->scn_phys_cached, sizeof (scn->scn_phys));
avl_create(&scn->scn_queue, scan_ds_queue_compare, sizeof (scan_ds_t), avl_create(&scn->scn_queue, scan_ds_queue_compare, sizeof (scan_ds_t),
offsetof(scan_ds_t, sds_node)); offsetof(scan_ds_t, sds_node));
avl_create(&scn->scn_prefetch_queue, scan_prefetch_queue_compare, avl_create(&scn->scn_prefetch_queue, scan_prefetch_queue_compare,
@ -484,6 +483,8 @@ dsl_scan_init(dsl_pool_t *dp, uint64_t txg)
} }
} }
bcopy(&scn->scn_phys, &scn->scn_phys_cached, sizeof (scn->scn_phys));
/* reload the queue into the in-core state */ /* reload the queue into the in-core state */
if (scn->scn_phys.scn_queue_obj != 0) { if (scn->scn_phys.scn_queue_obj != 0) {
zap_cursor_t zc; zap_cursor_t zc;
@ -969,6 +970,7 @@ dsl_scrub_pause_resume_sync(void *arg, dmu_tx_t *tx)
/* can't pause a scrub when there is no in-progress scrub */ /* can't pause a scrub when there is no in-progress scrub */
spa->spa_scan_pass_scrub_pause = gethrestime_sec(); spa->spa_scan_pass_scrub_pause = gethrestime_sec();
scn->scn_phys.scn_flags |= DSF_SCRUB_PAUSED; scn->scn_phys.scn_flags |= DSF_SCRUB_PAUSED;
scn->scn_phys_cached.scn_flags |= DSF_SCRUB_PAUSED;
dsl_scan_sync_state(scn, tx, SYNC_CACHED); dsl_scan_sync_state(scn, tx, SYNC_CACHED);
spa_event_notify(spa, NULL, NULL, ESC_ZFS_SCRUB_PAUSED); spa_event_notify(spa, NULL, NULL, ESC_ZFS_SCRUB_PAUSED);
} else { } else {
@ -983,6 +985,7 @@ dsl_scrub_pause_resume_sync(void *arg, dmu_tx_t *tx)
gethrestime_sec() - spa->spa_scan_pass_scrub_pause; gethrestime_sec() - spa->spa_scan_pass_scrub_pause;
spa->spa_scan_pass_scrub_pause = 0; spa->spa_scan_pass_scrub_pause = 0;
scn->scn_phys.scn_flags &= ~DSF_SCRUB_PAUSED; scn->scn_phys.scn_flags &= ~DSF_SCRUB_PAUSED;
scn->scn_phys_cached.scn_flags &= ~DSF_SCRUB_PAUSED;
dsl_scan_sync_state(scn, tx, SYNC_CACHED); dsl_scan_sync_state(scn, tx, SYNC_CACHED);
} }
} }