From: Jens Axboe Date: Thu, 19 May 2016 21:49:57 +0000 (-0600) Subject: iolog: fix duplicate handling of compression end X-Git-Tag: fio-2.10~6 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=6fa3ad511a61666b492ed8126330db9f876359bc iolog: fix duplicate handling of compression end Also handle an error return from deflate() with Z_FINISH. Signed-off-by: Jens Axboe --- diff --git a/iolog.c b/iolog.c index e2300a52..aec0881e 100644 --- a/iolog.c +++ b/iolog.c @@ -1073,17 +1073,26 @@ static int gz_work(struct iolog_flush_data *data) stream.avail_out = GZ_CHUNK - c->len; ret = deflate(&stream, Z_FINISH); - if (ret == Z_STREAM_END) { - total -= c->len; - c->len = GZ_CHUNK - stream.avail_out; - total += c->len; - dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq, c->len); - } else { - total -= c->len; - c->len = GZ_CHUNK - stream.avail_out; - total += c->len; - dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq, c->len); + if (ret < 0) { + /* + * Z_BUF_ERROR is special, it just means we need more + * output space. We'll handle that below. Treat any other + * error as fatal. + */ + if (ret != Z_BUF_ERROR) { + log_err("fio: deflate log (%d)\n", ret); + flist_del(&c->list); + free_chunk(c); + goto err; + } + } + + total -= c->len; + c->len = GZ_CHUNK - stream.avail_out; + total += c->len; + dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq, c->len); + if (ret != Z_STREAM_END) { do { c = get_new_chunk(seq); stream.avail_out = GZ_CHUNK;