From 9add19b37d814918822e3a95bbc4d50a50942749 Mon Sep 17 00:00:00 2001 From: wli5 Date: Wed, 8 Nov 2017 06:51:30 +0800 Subject: [PATCH] Bug fix in qat_compress.c when compressed size is < 4KB When the 128KB block is compressed to less than 4KB, the pointer to the Footer is not in the end of the compressed buffer, that's because the Header offset was added twice for this case. So there is a gap between the Footer and the compressed buffer. 1. Always compute the Footer pointer address from the start of the last page. 2. Remove the un-used workaroud code which has been verified fixed with the latest driver and this fix. Reviewed-by: Brian Behlendorf Reviewed-by: George Melikov Signed-off-by: Weigang Li Closes #6827 --- module/zfs/qat_compress.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/zfs/qat_compress.c b/module/zfs/qat_compress.c index ea56f144c1..4d17d7ac9a 100644 --- a/module/zfs/qat_compress.c +++ b/module/zfs/qat_compress.c @@ -493,7 +493,10 @@ qat_compress(qat_compress_dir_t dir, char *src, int src_len, + ZLIB_FOOT_SZ > PAGE_SIZE) goto fail; - flat_buf_dst->pData += (compressed_sz + hdr_sz) % PAGE_SIZE; + /* jump to the end of the buffer and append footer */ + flat_buf_dst->pData = + (char *)((unsigned long)flat_buf_dst->pData & PAGE_MASK) + + ((compressed_sz + hdr_sz) % PAGE_SIZE); flat_buf_dst->dataLenInBytes = ZLIB_FOOT_SZ; dc_results.produced = 0; @@ -505,9 +508,6 @@ qat_compress(qat_compress_dir_t dir, char *src, int src_len, *c_len = compressed_sz + dc_results.produced + hdr_sz; - if (*c_len < PAGE_SIZE) - *c_len = 8 * PAGE_SIZE; - QAT_STAT_INCR(comp_total_out_bytes, *c_len); ret = 0;