summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/zfs/zio_compress.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/zfs/zio_compress.c')
-rw-r--r--usr/src/uts/common/fs/zfs/zio_compress.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/usr/src/uts/common/fs/zfs/zio_compress.c b/usr/src/uts/common/fs/zfs/zio_compress.c
index 9882806a7d..4ae2581e3b 100644
--- a/usr/src/uts/common/fs/zfs/zio_compress.c
+++ b/usr/src/uts/common/fs/zfs/zio_compress.c
@@ -144,20 +144,31 @@ zio_decompress_data_buf(enum zio_compress c, void *src, void *dst,
return (ci->ci_decompress(src, dst, s_len, d_len, ci->ci_level));
}
+void *zio_decompress_failed_buf;
+
int
zio_decompress_data(enum zio_compress c, abd_t *src, void *dst,
size_t s_len, size_t d_len)
{
void *tmp = abd_borrow_buf_copy(src, s_len);
int ret = zio_decompress_data_buf(c, tmp, dst, s_len, d_len);
- abd_return_buf(src, tmp, s_len);
/*
- * Decompression shouldn't fail, because we've already verifyied
+ * Decompression shouldn't fail, because we've already verified
* the checksum. However, for extra protection (e.g. against bitflips
* in non-ECC RAM), we handle this error (and test it).
*/
- ASSERT0(ret);
+ if (ret != 0) {
+ zio_decompress_failed_buf = kmem_alloc(s_len, KM_SLEEP);
+ bcopy(tmp, zio_decompress_failed_buf, s_len);
+ panic("decompression failed "
+ "err=%u c=%u buf=%p s_len=%u d_len=%u",
+ ret, (int)c, zio_decompress_failed_buf,
+ (int)s_len, (int)d_len);
+ }
+
+ abd_return_buf(src, tmp, s_len);
+
if (zio_decompress_fail_fraction != 0 &&
spa_get_random(zio_decompress_fail_fraction) == 0)
ret = SET_ERROR(EINVAL);