From 3f742550dfed84f669903dbe330717ebaf104c27 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Thu, 7 Sep 2017 10:26:36 +0300 Subject: [PATCH] fsx: add support for recording operations to a file 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 Reviewed-by: Eryu Guan Signed-off-by: Eryu Guan --- ltp/fsx.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 4e733f9f..67d76dcb 100644 --- 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; -- 2.30.2