Add support for >= 4G block sizes
[fio.git] / iolog.c
diff --git a/iolog.c b/iolog.c
index 598548d2f037ad4314254cb4b5f14f9722fb4ebf..d51e49c33cfba215c359a78d30ef3b6023e64041 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -35,7 +35,7 @@ void log_io_u(const struct thread_data *td, const struct io_u *io_u)
        if (!td->o.write_iolog_file)
                return;
 
-       fprintf(td->iolog_f, "%s %s %llu %lu\n", io_u->file->file_name,
+       fprintf(td->iolog_f, "%s %s %llu %llu\n", io_u->file->file_name,
                                                io_ddir_name(io_u->ddir),
                                                io_u->offset, io_u->buflen);
 }
@@ -161,7 +161,7 @@ int read_iolog_get(struct thread_data *td, struct io_u *io_u)
                        io_u->buflen = ipo->len;
                        io_u->file = td->files[ipo->fileno];
                        get_file(io_u->file);
-                       dprint(FD_IO, "iolog: get %llu/%lu/%s\n", io_u->offset,
+                       dprint(FD_IO, "iolog: get %llu/%llu/%s\n", io_u->offset,
                                                io_u->buflen, io_u->file->file_name);
                        if (ipo->delay)
                                iolog_delay(td, ipo->delay);
@@ -211,7 +211,7 @@ void log_io_piece(struct thread_data *td, struct io_u *io_u)
        struct fio_rb_node **p, *parent;
        struct io_piece *ipo, *__ipo;
 
-       ipo = malloc(sizeof(struct io_piece));
+       ipo = calloc(1, sizeof(struct io_piece));
        init_ipo(ipo);
        ipo->file = io_u->file;
        ipo->offset = io_u->offset;
@@ -227,11 +227,7 @@ void log_io_piece(struct thread_data *td, struct io_u *io_u)
        }
 
        /*
-        * We don't need to sort the entries if we only performed sequential
-        * writes. In this case, just reading back data in the order we wrote
-        * it out is the faster but still safe.
-        *
-        * One exception is if we don't have a random map in which case we need
+        * Only sort writes if we don't have a random map in which case we need
         * to check for duplicate blocks and drop the old one, which we rely on
         * the rb insert/lookup for handling.
         */
@@ -319,7 +315,7 @@ void unlog_io_piece(struct thread_data *td, struct io_u *io_u)
        td->io_hist_len--;
 }
 
-void trim_io_piece(struct thread_data *td, const struct io_u *io_u)
+void trim_io_piece(const struct io_u *io_u)
 {
        struct io_piece *ipo = io_u->ipo;
 
@@ -342,7 +338,7 @@ void write_iolog_close(struct thread_data *td)
  * Read version 2 iolog data. It is enhanced to include per-file logging,
  * syncs, etc.
  */
-static int read_iolog2(struct thread_data *td, FILE *f)
+static bool read_iolog2(struct thread_data *td, FILE *f)
 {
        unsigned long long offset;
        unsigned int bytes;
@@ -444,7 +440,7 @@ static int read_iolog2(struct thread_data *td, FILE *f)
                /*
                 * Make note of file
                 */
-               ipo = malloc(sizeof(*ipo));
+               ipo = calloc(1, sizeof(*ipo));
                init_ipo(ipo);
                ipo->ddir = rw;
                if (rw == DDIR_WAIT) {
@@ -478,7 +474,7 @@ static int read_iolog2(struct thread_data *td, FILE *f)
        }
 
        if (!reads && !writes && !waits)
-               return 1;
+               return false;
        else if (reads && !writes)
                td->o.td_ddir = TD_DDIR_READ;
        else if (!reads && writes)
@@ -486,22 +482,22 @@ static int read_iolog2(struct thread_data *td, FILE *f)
        else
                td->o.td_ddir = TD_DDIR_RW;
 
-       return 0;
+       return true;
 }
 
 /*
  * open iolog, check version, and call appropriate parser
  */
-static int init_iolog_read(struct thread_data *td)
+static bool init_iolog_read(struct thread_data *td)
 {
        char buffer[256], *p;
        FILE *f;
-       int ret;
+       bool ret;
 
        f = fopen(td->o.read_iolog_file, "r");
        if (!f) {
                perror("fopen read iolog");
-               return 1;
+               return false;
        }
 
        p = fgets(buffer, sizeof(buffer), f);
@@ -509,7 +505,7 @@ static int init_iolog_read(struct thread_data *td)
                td_verror(td, errno, "iolog read");
                log_err("fio: unable to read iolog\n");
                fclose(f);
-               return 1;
+               return false;
        }
 
        /*
@@ -520,7 +516,7 @@ static int init_iolog_read(struct thread_data *td)
                ret = read_iolog2(td, f);
        else {
                log_err("fio: iolog version 1 is no longer supported\n");
-               ret = 1;
+               ret = false;
        }
 
        fclose(f);
@@ -530,7 +526,7 @@ static int init_iolog_read(struct thread_data *td)
 /*
  * Set up a log for storing io patterns.
  */
-static int init_iolog_write(struct thread_data *td)
+static bool init_iolog_write(struct thread_data *td)
 {
        struct fio_file *ff;
        FILE *f;
@@ -539,7 +535,7 @@ static int init_iolog_write(struct thread_data *td)
        f = fopen(td->o.write_iolog_file, "a");
        if (!f) {
                perror("fopen write iolog");
-               return 1;
+               return false;
        }
 
        /*
@@ -554,7 +550,7 @@ static int init_iolog_write(struct thread_data *td)
         */
        if (fprintf(f, "%s\n", iolog_ver2) < 0) {
                perror("iolog init\n");
-               return 1;
+               return false;
        }
 
        /*
@@ -563,12 +559,12 @@ static int init_iolog_write(struct thread_data *td)
        for_each_file(td, ff, i)
                log_file(td, ff, FIO_LOG_ADD_FILE);
 
-       return 0;
+       return true;
 }
 
-int init_iolog(struct thread_data *td)
+bool init_iolog(struct thread_data *td)
 {
-       int ret = 0;
+       bool ret;
 
        if (td->o.read_iolog_file) {
                int need_swap;
@@ -583,8 +579,10 @@ int init_iolog(struct thread_data *td)
                        ret = init_iolog_read(td);
        } else if (td->o.write_iolog_file)
                ret = init_iolog_write(td);
+       else
+               ret = true;
 
-       if (ret)
+       if (!ret)
                td_verror(td, EINVAL, "failed initializing iolog");
 
        return ret;
@@ -621,12 +619,12 @@ void setup_log(struct io_log **log, struct log_params *p,
        }
 
        if (l->td && l->td->o.io_submit_mode != IO_MODE_OFFLOAD) {
-               struct io_logs *p;
+               struct io_logs *__p;
 
-               p = calloc(1, sizeof(*l->pending));
-               p->max_samples = DEF_LOG_ENTRIES;
-               p->log = calloc(p->max_samples, log_entry_sz(l));
-               l->pending = p;
+               __p = calloc(1, sizeof(*l->pending));
+               __p->max_samples = DEF_LOG_ENTRIES;
+               __p->log = calloc(__p->max_samples, log_entry_sz(l));
+               l->pending = __p;
        }
 
        if (l->log_offset)
@@ -739,8 +737,8 @@ static void flush_hist_samples(FILE *f, int hist_coarseness, void *samples,
                entry_before = flist_first_entry(&entry->list, struct io_u_plat_entry, list);
                io_u_plat_before = entry_before->io_u_plat;
 
-               fprintf(f, "%lu, %u, %u, ", (unsigned long) s->time,
-                                               io_sample_ddir(s), s->bs);
+               fprintf(f, "%lu, %u, %llu, ", (unsigned long) s->time,
+                                               io_sample_ddir(s), (unsigned long long) s->bs);
                for (j = 0; j < FIO_IO_U_PLAT_NR - stride; j += stride) {
                        fprintf(f, "%llu, ", (unsigned long long)
                                hist_sum(j, stride, io_u_plat, io_u_plat_before));
@@ -772,17 +770,17 @@ void flush_samples(FILE *f, void *samples, uint64_t sample_size)
                s = __get_sample(samples, log_offset, i);
 
                if (!log_offset) {
-                       fprintf(f, "%lu, %" PRId64 ", %u, %u\n",
+                       fprintf(f, "%lu, %" PRId64 ", %u, %llu\n",
                                        (unsigned long) s->time,
                                        s->data.val,
-                                       io_sample_ddir(s), s->bs);
+                                       io_sample_ddir(s), (unsigned long long) s->bs);
                } else {
                        struct io_sample_offset *so = (void *) s;
 
-                       fprintf(f, "%lu, %" PRId64 ", %u, %u, %llu\n",
+                       fprintf(f, "%lu, %" PRId64 ", %u, %llu, %llu\n",
                                        (unsigned long) s->time,
                                        s->data.val,
-                                       io_sample_ddir(s), s->bs,
+                                       io_sample_ddir(s), (unsigned long long) s->bs,
                                        (unsigned long long) so->offset);
                }
        }