Merge branch 'readonly-trim' of https://github.com/vincentkfu/fio
[fio.git] / t / verify-state.c
index cb5ef31d8c36e199933fc586d94873f831b32c61..734c1e4c77fa81c791f62d4e784f060d4256c6a9 100644 (file)
@@ -19,15 +19,48 @@ static void show_s(struct thread_io_list *s, unsigned int no_s)
 {
        int i;
 
-       printf("Thread %u, %s\n", no_s, s->name);
-       printf("Completions: %lu\n", s->no_comps);
-       printf("Depth: %lu\n", s->depth);
-       printf("Number IOs: %lu\n", s->numberio);
-       printf("Index: %lu\n", s->index);
+       printf("Thread:\t\t%u\n", no_s);
+       printf("Name:\t\t%s\n", s->name);
+       printf("Completions:\t%llu\n", (unsigned long long) s->no_comps);
+       printf("Depth:\t\t%llu\n", (unsigned long long) s->depth);
+       printf("Number IOs:\t%llu\n", (unsigned long long) s->numberio);
+       printf("Index:\t\t%llu\n", (unsigned long long) s->index);
 
        printf("Completions:\n");
-       for (i = 0; i < s->no_comps; i++)
-               printf("\t%lu\n", s->offsets[i]);
+       if (!s->no_comps)
+               return;
+       for (i = s->no_comps - 1; i >= 0; i--) {
+               printf("\t(file=%2llu) %llu\n",
+                               (unsigned long long) s->comps[i].fileno,
+                               (unsigned long long) s->comps[i].offset);
+       }
+}
+
+static void show(struct thread_io_list *s, size_t size)
+{
+       int no_s;
+
+       no_s = 0;
+       do {
+               int i;
+
+               s->no_comps = le64_to_cpu(s->no_comps);
+               s->depth = le32_to_cpu(s->depth);
+               s->nofiles = le32_to_cpu(s->nofiles);
+               s->numberio = le64_to_cpu(s->numberio);
+               s->index = le64_to_cpu(s->index);
+
+               for (i = 0; i < s->no_comps; i++) {
+                       s->comps[i].fileno = le64_to_cpu(s->comps[i].fileno);
+                       s->comps[i].offset = le64_to_cpu(s->comps[i].offset);
+               }
+
+               show_s(s, no_s);
+               no_s++;
+               size -= __thread_io_list_sz(s->depth, s->nofiles);
+               s = (struct thread_io_list *)((char *) s +
+                       __thread_io_list_sz(s->depth, s->nofiles));
+       } while (size != 0);
 }
 
 static void show_verify_state(void *buf, size_t size)
@@ -35,15 +68,14 @@ static void show_verify_state(void *buf, size_t size)
        struct verify_state_hdr *hdr = buf;
        struct thread_io_list *s;
        uint32_t crc;
-       int no_s;
 
        hdr->version = le64_to_cpu(hdr->version);
        hdr->size = le64_to_cpu(hdr->size);
        hdr->crc = le64_to_cpu(hdr->crc);
 
-       printf("Version: %x, Size %u, crc %x\n", (unsigned int) hdr->version,
-                                               (unsigned int) hdr->size,
-                                               (unsigned int) hdr->crc);
+       printf("Version:\t0x%x\n", (unsigned int) hdr->version);
+       printf("Size:\t\t%u\n", (unsigned int) hdr->size);
+       printf("CRC:\t\t0x%x\n", (unsigned int) hdr->crc);
 
        size -= sizeof(*hdr);
        if (hdr->size != size) {
@@ -58,46 +90,21 @@ static void show_verify_state(void *buf, size_t size)
                return;
        }
 
-       if (hdr->version != 0x02) {
-               log_err("Can only handle version 2 headers\n");
-               return;
-       }
-
-       no_s = 0;
-       do {
-               int i;
-
-               s->no_comps = le64_to_cpu(s->no_comps);
-               s->depth = le64_to_cpu(s->depth);
-               s->numberio = le64_to_cpu(s->numberio);
-               s->index = le64_to_cpu(s->index);
-
-               for (i = 0; i < s->no_comps; i++)
-                       s->offsets[i] = le64_to_cpu(s->offsets[i]);
-
-               show_s(s, no_s);
-               no_s++;
-               size -= __thread_io_list_sz(s->depth);
-               s = (void *) s + __thread_io_list_sz(s->depth);
-       } while (size != 0);
+       if (hdr->version == 0x03)
+               show(s, size);
+       else
+               log_err("Unsupported version %d\n", (int) hdr->version);
 }
 
-int main(int argc, char *argv[])
+static int show_file(const char *file)
 {
        struct stat sb;
        void *buf;
        int ret, fd;
 
-       debug_init();
-
-       if (argc < 2) {
-               log_err("Usage: %s <state file>\n", argv[0]);
-               return 1;
-       }
-
-       fd = open(argv[1], O_RDONLY);
+       fd = open(file, O_RDONLY);
        if (fd < 0) {
-               log_err("open %s: %s\n", argv[1], strerror(errno));
+               log_err("open %s: %s\n", file, strerror(errno));
                return 1;
        }
 
@@ -112,10 +119,12 @@ int main(int argc, char *argv[])
        if (ret < 0) {
                log_err("read: %s\n", strerror(errno));
                close(fd);
+               free(buf);
                return 1;
        } else if (ret != sb.st_size) {
                log_err("Short read\n");
                close(fd);
+               free(buf);
                return 1;
        }
 
@@ -125,3 +134,24 @@ int main(int argc, char *argv[])
        free(buf);
        return 0;
 }
+
+int main(int argc, char *argv[])
+{
+       int i, ret;
+
+       debug_init();
+
+       if (argc < 2) {
+               log_err("Usage: %s <state file>\n", argv[0]);
+               return 1;
+       }
+
+       ret = 0;
+       for (i = 1; i < argc; i++) {
+               ret = show_file(argv[i]);
+               if (ret)
+                       break;
+       }
+
+       return ret;
+}