]> git.proxmox.com Git - mirror_zfs.git/commitdiff
dsl_scan_scrub_cb: don't double-account non-embedded blocks
authorSteven Noonan <steven@uplinklabs.net>
Tue, 24 Jul 2018 16:33:56 +0000 (09:33 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 24 Jul 2018 16:33:56 +0000 (09:33 -0700)
We were doing count_block() twice inside this function, once
unconditionally at the beginning (intended to catch the embedded block
case) and once near the end after processing the block.

The double-accounting caused the "zpool scrub" progress statistics in
"zpool status" to climb from 0% to 200% instead of 0% to 100%, and
showed double the I/O rate it was actually seeing.

This was apparently a regression introduced in commit 00c405b4b5e8,
which was an incorrect port of this OpenZFS commit:

    https://github.com/openzfs/openzfs/commit/d8a447a7

Reviewed by: Thomas Caputi <tcaputi@datto.com>
Reviewed by: Matt Ahrens <matt@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Signed-off-by: Steven Noonan <steven@uplinklabs.net>
Closes #7720
Closes #7738

module/zfs/dsl_scan.c

index a08353c1598a92d7ac1df9c157e2eead6acafe9c..f3c869538ce1e8500dcbcdb4ba584daa839c7df0 100644 (file)
@@ -3565,11 +3565,12 @@ dsl_scan_scrub_cb(dsl_pool_t *dp,
        boolean_t needs_io = B_FALSE;
        int zio_flags = ZIO_FLAG_SCAN_THREAD | ZIO_FLAG_RAW | ZIO_FLAG_CANFAIL;
 
-       count_block(scn, dp->dp_blkstats, bp);
 
        if (phys_birth <= scn->scn_phys.scn_min_txg ||
-           phys_birth >= scn->scn_phys.scn_max_txg)
+           phys_birth >= scn->scn_phys.scn_max_txg) {
+               count_block(scn, dp->dp_blkstats, bp);
                return (0);
+       }
 
        /* Embedded BP's have phys_birth==0, so we reject them above. */
        ASSERT(!BP_IS_EMBEDDED(bp));