iolog: regrow log out-of-line
[fio.git] / iolog.c
diff --git a/iolog.c b/iolog.c
index e2300a528e4759bb9dedaba5fc6a9fb8f4a46337..3723e0a86025afe460c11a7585e14a365f37022b 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -587,6 +587,15 @@ void setup_log(struct io_log **log, struct log_params *p,
        l->filename = strdup(filename);
        l->td = p->td;
 
+       if (l->td && l->td->o.io_submit_mode != IO_MODE_OFFLOAD) {
+               struct io_logs *p;
+
+               p = calloc(1, sizeof(*l->pending));
+               p->max_samples = l->td->o.iodepth;
+               p->log = calloc(p->max_samples, log_entry_sz(l));
+               l->pending = p;
+       }
+
        if (l->log_offset)
                l->log_ddir_mask = LOG_OFFSET_SAMPLE_BIT;
 
@@ -638,6 +647,13 @@ void free_log(struct io_log *log)
                free(cur_log->log);
        }
 
+       if (log->pending) {
+               free(log->pending->log);
+               free(log->pending);
+               log->pending = NULL;
+       }
+
+       free(log->pending);
        free(log->filename);
        sfree(log);
 }
@@ -1073,17 +1089,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;