diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-02-08 20:59:43 -0900 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-02-09 01:22:18 -0900 |
commit | 76f503997af6cb7125158afa871e9579d1b2681e (patch) | |
tree | e7f83d1d29c8bbb217367d8bb0446df94c367813 | |
parent | 2bce7cdba425b3649084f873c8581366c6d43961 (diff) |
bcache: compression fixes
-rw-r--r-- | drivers/md/bcache/compress.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/drivers/md/bcache/compress.c b/drivers/md/bcache/compress.c index f7bfd57f9578..528208307ed9 100644 --- a/drivers/md/bcache/compress.c +++ b/drivers/md/bcache/compress.c @@ -273,28 +273,23 @@ static int __bio_compress(struct cache_set *c, *src_len = src->bi_iter.bi_size; workspace = mempool_alloc(&c->lz4_workspace_pool, GFP_NOIO); -retry_compress: - ret = lz4_compress(src_data, *src_len, - dst_data, dst_len, - workspace); - /* - * On error, the compressed data was bigger than dst_len, and - * -ret is the amount of data we were able to compress - round - * down to nearest block and try again: - */ - if (ret && round_down(-ret, block_bytes(c)) > *dst_len) { - BUG_ON(ret > 0); - /* not supposed to happen */ - if (WARN_ON(-ret >= *src_len)) - goto err; + while (*src_len > block_bytes(c) && + (ret = lz4_compress(src_data, *src_len, + dst_data, dst_len, + workspace))) { + /* + * On error, the compressed data was bigger than + * dst_len, and -ret is the amount of data we were able + * to compress - round down to nearest block and try + * again: + */ + BUG_ON(ret > 0); + BUG_ON(-ret >= *src_len); *src_len = round_down(-ret, block_bytes(c)); - if (!*src_len) - goto err; - - goto retry_compress; } + mempool_free(workspace, &c->lz4_workspace_pool); if (ret) @@ -354,6 +349,10 @@ zlib_err: } BUG_ON(!*dst_len); + BUG_ON(*dst_len > dst->bi_iter.bi_size); + + BUG_ON(*src_len & (block_bytes(c) - 1)); + BUG_ON(*src_len > src->bi_iter.bi_size); /* Didn't get smaller: */ if (round_up(*dst_len, block_bytes(c)) >= *src_len) { |