]> granicus.if.org Git - zfs/commitdiff
OpenZFS 9454 - ::zfs_blkstats should count embedded blocks
authorMatthew Ahrens <mahrens@delphix.com>
Mon, 4 Dec 2017 19:29:40 +0000 (11:29 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 10 Jul 2018 17:41:38 +0000 (10:41 -0700)
When we do a scrub or resilver, ZFS counts the different types of blocks,
which can be printed by the ::zfs_blkstats mdb dcmd. However, it fails to
count embedded blocks.

Porting notes:
* Commit d4a72f23 moved count_blocks under a BP_IS_EMBEDDED conditional
  as part of the sequential resilver functionality.  Since phys_birth
  would be zero that case should never happen as described above.  This
  is confirmed by the code coverage analysis.  Remove the conditional
  to realign that aspect of this function with OpenZFS.

Authored by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: George Melikov <mail@gmelikov.ru>
Reviewed by: Tom Caputi <tcaputi@datto.com>
Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
Approved by: Robert Mustacchi <rm@joyent.com>

OpenZFS-issue: https://www.illumos.org/issues/9454
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/d8a447a7
Closes #7697

module/zfs/dsl_scan.c

index 986dccdea738083e890491d677bf850637faf8db..a08353c1598a92d7ac1df9c157e2eead6acafe9c 100644 (file)
@@ -3565,14 +3565,14 @@ 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)
                return (0);
 
-       if (BP_IS_EMBEDDED(bp)) {
-               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));
 
        ASSERT(DSL_SCAN_IS_SCRUB_RESILVER(scn));
        if (scn->scn_phys.scn_func == POOL_SCAN_SCRUB) {