fsx: add support for recording operations to a file
authorAmir Goldstein <amir73il@gmail.com>
Thu, 7 Sep 2017 07:26:36 +0000 (10:26 +0300)
committerEryu Guan <eguan@redhat.com>
Fri, 8 Sep 2017 03:42:15 +0000 (11:42 +0800)
Usually, fsx dumps an .fsxops file on failure with same basename
as work file and possibly under dirctory specified by -P dirpath.

The --record-ops[=opsfile] flag can be use to dump ops file also
on success and to optionally specify the ops file name.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
ltp/fsx.c

index 4e733f9..67d76dc 100644 (file)
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -180,6 +180,7 @@ int aio_rw(int rw, int fd, char *buf, unsigned len, unsigned offset);
 #endif
 
 const char *replayops = NULL;
+const char *recordops = NULL;
 FILE * fsxlogf = NULL;
 FILE * replayopsf = NULL;
 char opsfile[1024];
@@ -1676,6 +1677,8 @@ usage(void)
        -W: mapped write operations DISabled\n\
         -R: read() system calls only (mapped reads disabled)\n\
         -Z: O_DIRECT (use -R, -W, -r and -w too)\n\
+       --replay-ops opsfile: replay ops from recorded .fsxops file\n\
+       --record-ops[=opsfile]: dump ops file also on success. optionally specify ops file name\n\
        fname: this filename is REQUIRED (no default)\n");
        exit(90);
 }
@@ -1844,6 +1847,7 @@ __test_fallocate(int mode, const char *mode_str)
 
 static struct option longopts[] = {
        {"replay-ops", required_argument, 0, 256},
+       {"record-ops", optional_argument, 0, 255},
        { }
 };
 
@@ -2034,6 +2038,11 @@ main(int argc, char **argv)
                case 'Z':
                        o_direct = O_DIRECT;
                        break;
+               case 255:  /* --record-ops */
+                       if (optarg)
+                               strncpy(opsfile, optarg, sizeof(opsfile));
+                       recordops = opsfile;
+                       break;
                case 256:  /* --replay-ops */
                        replayops = optarg;
                        break;
@@ -2113,8 +2122,10 @@ main(int argc, char **argv)
                prterr(logfile);
                exit(93);
        }
-       strncat(opsfile, dirpath ? bname : fname, 256);
-       strcat(opsfile, ".fsxops");
+       if (!*opsfile) {
+               strncat(opsfile, dirpath ? bname : fname, 256);
+               strcat(opsfile, ".fsxops");
+       }
        unlink(opsfile);
 
        if (replayops) {
@@ -2195,6 +2206,8 @@ main(int argc, char **argv)
                report_failure(99);
        }
        prt("All %lu operations completed A-OK!\n", testcalls);
+       if (recordops)
+               logdump();
 
        exit(0);
        return 0;