]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/dsl_scan.c
Fix issue with scanning dedup blocks as scan ends
[mirror_zfs.git] / module / zfs / dsl_scan.c
index aff99f275efd9f59f5522002726347aa4c690a42..db3295363813dc7b3cfe2923755377026f9532a3 100644 (file)
@@ -2386,6 +2386,20 @@ dsl_scan_ddt_entry(dsl_scan_t *scn, enum zio_checksum checksum,
        if (!dsl_scan_is_running(scn))
                return;
 
+       /*
+        * This function is special because it is the only thing
+        * that can add scan_io_t's to the vdev scan queues from
+        * outside dsl_scan_sync(). For the most part this is ok
+        * as long as it is called from within syncing context.
+        * However, dsl_scan_sync() expects that no new sio's will
+        * be added between when all the work for a scan is done
+        * and the next txg when the scan is actually marked as
+        * completed. This check ensures we do not issue new sio's
+        * during this period.
+        */
+       if (scn->scn_done_txg != 0)
+               return;
+
        for (p = 0; p < DDT_PHYS_TYPES; p++, ddp++) {
                if (ddp->ddp_phys_birth == 0 ||
                    ddp->ddp_phys_birth > scn->scn_phys.scn_max_txg)
@@ -3468,6 +3482,8 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx)
                            (longlong_t)tx->tx_txg);
                }
        } else if (scn->scn_is_sorted && scn->scn_bytes_pending != 0) {
+               ASSERT(scn->scn_clearing);
+
                /* need to issue scrubbing IOs from per-vdev queues */
                scn->scn_zio_root = zio_root(dp->dp_spa, NULL,
                    NULL, ZIO_FLAG_CANFAIL);