Merge branch 'master' of ssh://axboe@router.home.kernel.dk/data/git/blktrace
[blktrace.git] / blkrawverify.c
index 238c3ab7c7c71de0da739a827bc7e801b1e9a8ef..984dbffcddf66bc191154360fc323f4f2efaadec 100644 (file)
@@ -46,7 +46,10 @@ static struct trace_info traces[] = {
        TRACE_TO_STRING( BLK_TC_ISSUE ),
        TRACE_TO_STRING( BLK_TC_COMPLETE ),
        TRACE_TO_STRING( BLK_TC_FS ),
-       TRACE_TO_STRING( BLK_TC_PC )
+       TRACE_TO_STRING( BLK_TC_PC ),
+       TRACE_TO_STRING( BLK_TC_AHEAD ),
+       TRACE_TO_STRING( BLK_TC_META ),
+       TRACE_TO_STRING( BLK_TC_DISCARD ),
 };
 #define N_TRACES (sizeof(traces) / sizeof(struct trace_info))
 
@@ -115,7 +118,7 @@ static void dump_trace(FILE *ofp, char *prefix, struct blk_io_trace *bit)
                                                           MINOR(bit->device));
 }
 
-static int process(FILE *ofp, char *file, unsigned int cpu)
+static int process(FILE **fp, char *devname, char *file, unsigned int cpu)
 {
 #      define SWAP_BITS() do {                                         \
                if (bit_save) {                                         \
@@ -138,7 +141,7 @@ static int process(FILE *ofp, char *file, unsigned int cpu)
        } while (0)
 
        size_t n;
-       FILE *ifp;
+       FILE *ifp, *ofp;
        __u32 save_device = 0, save_sequence = 0;
        __u64 save_time = 0;
        struct blk_io_trace *bit_save = NULL;
@@ -147,9 +150,33 @@ static int process(FILE *ofp, char *file, unsigned int cpu)
        unsigned int nbad = 0;
        unsigned int nbad_trace = 0, nbad_pdu = 0, nbad_cpu = 0;
        unsigned int nbad_seq = 0, nbad_dev = 0, nbad_time = 0;
+       char ofname[1024];
 
        ifp = fopen(file, "r");
+       if (!ifp)
+               return 0;
+
+       sprintf(ofname, "%s.verify.out", devname);
+
+       if (!*fp) {
+               *fp = fopen(ofname, "w");
+               if (*fp == NULL) {
+                       fprintf(stderr,"Failed to open %s (%s), skipping\n",
+                               ofname, strerror(errno));
+                       fclose(ifp);
+                       return 0;
+               }
+               fprintf(*fp, "\n---------------\n" );
+               fprintf(*fp, "Verifying %s\n", devname);
+       }
+
+       ofp = *fp;
        while ((n = fread(bit, sizeof(struct blk_io_trace), 1, ifp)) == 1) {
+               if (ferror(ifp)) {
+                       clearerr(ifp);
+                       perror("fread");
+                       break;
+               }
                if (data_is_native == -1)
                        check_data_endianness(bit->magic);
 
@@ -250,7 +277,7 @@ int main(int argc, char *argv[])
 {
        char *devname;
        struct stat st;
-       int i, cpu, nbad;
+       int i, cpu, nbad, rval = 0;
        FILE *ofp;
        char *ofname = malloc(1024);
        char *fname = malloc(1024);
@@ -264,29 +291,26 @@ int main(int argc, char *argv[])
        for (i = 1; i < argc; i++) {
                devname = argv[i];
                sprintf(ofname, "%s.verify.out", devname);
-               ofp = fopen(ofname, "w");
-               if (ofp == NULL) {
-                       fprintf(stderr,"Failed to open %s (%s), skipping %s\n",
-                               ofname, strerror(errno), devname);
-                       continue;
-               }
+               ofp = NULL;
 
-               fprintf(ofp, "\n---------------\n" );
-               fprintf(ofp, "Verifying %s\n", devname);
                printf("Verifying %s\n", devname); fflush(stdout);
                for (cpu = 0; ; cpu++) {
                        sprintf(fname, "%s.blktrace.%d", devname, cpu);
                        if (stat(fname, &st) < 0)
                                break;
                        printf("    CPU %d ", cpu); fflush(stdout);
-                       nbad = process(ofp, fname, cpu);
-                       if (nbad)
+                       nbad = process(&ofp, devname, fname, cpu);
+                       if (nbad) {
                                printf("-- %d bad", nbad);
+                               rval = 1;
+                       }
                        printf("\n");
                }
-               fclose(ofp);
-               fprintf(stdout, "Wrote output to %s\n", ofname);
+               if (ofp) {
+                       fclose(ofp);
+                       fprintf(stdout, "Wrote output to %s\n", ofname);
+               }
        }
 
-       return 0;
+       return rval;
 }