diff --git a/include/sys/spa.h b/include/sys/spa.h index 23c20294d1f8..2e5bb0f485e0 100644 --- a/include/sys/spa.h +++ b/include/sys/spa.h @@ -670,7 +670,6 @@ typedef struct blkptr { (u_longlong_t)DVA_GET_ASIZE(dva), \ ws); \ } \ - ASSERT3S(copies, >, 0); \ if (BP_IS_ENCRYPTED(bp)) { \ len += func(buf + len, size - len, \ "salt=%llx iv=%llx:%llx%c", \ @@ -695,7 +694,8 @@ typedef struct blkptr { BP_GET_BYTEORDER(bp) == 0 ? "BE" : "LE", \ BP_IS_GANG(bp) ? "gang" : "contiguous", \ BP_GET_DEDUP(bp) ? "dedup" : "unique", \ - copyname[copies], \ + copies >= 0 && copies <= 3 ? copyname[copies] : \ + "invalid", \ ws, \ (u_longlong_t)BP_GET_LSIZE(bp), \ (u_longlong_t)BP_GET_PSIZE(bp), \ diff --git a/module/zfs/zio.c b/module/zfs/zio.c index b071ac17ed1f..dcc74dbfc65d 100644 --- a/module/zfs/zio.c +++ b/module/zfs/zio.c @@ -1212,6 +1212,16 @@ zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp, bp, (longlong_t)BPE_GET_PSIZE(bp)); } return (errors == 0); + } else if (BP_IS_HOLE(bp)) { + /* + * Holes are allowed (expected, even) to have no DVAs, no + * checksum, and no psize. + */ + return (errors == 0); + } else if (unlikely(!DVA_IS_VALID(&bp->blk_dva[0]))) { + /* Non-hole, non-embedded BPs _must_ have at least one DVA */ + errors += zfs_blkptr_verify_log(spa, bp, blk_verify, + "blkptr at %px has no valid DVAs", bp); } if (unlikely(BP_GET_CHECKSUM(bp) >= ZIO_CHECKSUM_FUNCTIONS)) { errors += zfs_blkptr_verify_log(spa, bp, blk_verify,