]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix 2 small bugs with cached dsl_scan_phys_t
authorTom Caputi <tcaputi@datto.com>
Tue, 23 Oct 2018 19:17:18 +0000 (15:17 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 24 Oct 2018 21:37:41 +0000 (14:37 -0700)
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

module/zfs/dsl_scan.c

index db3295363813dc7b3cfe2923755377026f9532a3..61d42deca6524eec7e8c1758bc2b917912eeb77a 100644 (file)
@@ -390,7 +390,6 @@ dsl_scan_init(dsl_pool_t *dp, uint64_t txg)
        scn->scn_maxinflight_bytes = MAX(zfs_scan_vdev_limit *
            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),
            offsetof(scan_ds_t, sds_node));
        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 */
        if (scn->scn_phys.scn_queue_obj != 0) {
                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 */
                spa->spa_scan_pass_scrub_pause = gethrestime_sec();
                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);
                spa_event_notify(spa, NULL, NULL, ESC_ZFS_SCRUB_PAUSED);
        } else {
@@ -983,6 +985,7 @@ dsl_scrub_pause_resume_sync(void *arg, dmu_tx_t *tx)
                            gethrestime_sec() - spa->spa_scan_pass_scrub_pause;
                        spa->spa_scan_pass_scrub_pause = 0;
                        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);
                }
        }