aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwli5 <[email protected]>2017-11-08 06:51:30 +0800
committerBrian Behlendorf <[email protected]>2017-11-07 14:51:30 -0800
commita3df7fa79d7db857f67a38ced033764bd684ca71 (patch)
tree781c131bfbb413063b2886d0838ea060c5bf2aab
parent681957fe2efc6a15b9675387075514957cbcd821 (diff)
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 <[email protected]> Reviewed-by: George Melikov <[email protected]> Signed-off-by: Weigang Li <[email protected]> Closes #6827
-rw-r--r--module/zfs/qat_compress.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/module/zfs/qat_compress.c b/module/zfs/qat_compress.c
index ea56f144c..4d17d7ac9 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;