]> granicus.if.org Git - zfs/commitdiff
Remove wrong ASSERT in annotate_ecksum
authorChunwei Chen <david.chen@osnexus.com>
Fri, 22 Jan 2016 20:23:55 +0000 (12:23 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 17 Feb 2016 18:43:02 +0000 (10:43 -0800)
When using large blocks like 1M, there will be more than UINT16_MAX qwords in
one block, so this ASSERT would go off. Also, it is possible for the histogram
to overflow. We cap them to UINT16_MAX to prevent this.

Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4257

module/zfs/zfs_fm.c

index 7e9c473d3ea462011b3cc40462e9e12f9ac00303..c7b7180009c83b990a9dcbb09290bddd8a0c2e46 100644 (file)
@@ -457,7 +457,8 @@ update_histogram(uint64_t value_arg, uint16_t *hist, uint32_t *count)
        /* We store the bits in big-endian (largest-first) order */
        for (i = 0; i < 64; i++) {
                if (value & (1ull << i)) {
-                       hist[63 - i]++;
+                       if (hist[63 - i] < UINT16_MAX)
+                               hist[63 - i]++;
                        ++bits;
                }
        }
@@ -615,7 +616,6 @@ annotate_ecksum(nvlist_t *ereport, zio_bad_cksum_t *info,
        if (badbuf == NULL || goodbuf == NULL)
                return (eip);
 
-       ASSERT3U(nui64s, <=, UINT16_MAX);
        ASSERT3U(size, ==, nui64s * sizeof (uint64_t));
        ASSERT3U(size, <=, SPA_MAXBLOCKSIZE);
        ASSERT3U(size, <=, UINT32_MAX);