mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
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 <amir73il@gmail.com> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
This commit is contained in:
committed by
Eryu Guan
parent
bd918dff01
commit
3f742550df
@@ -180,6 +180,7 @@ int aio_rw(int rw, int fd, char *buf, unsigned len, unsigned offset);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *replayops = NULL;
|
const char *replayops = NULL;
|
||||||
|
const char *recordops = NULL;
|
||||||
FILE * fsxlogf = NULL;
|
FILE * fsxlogf = NULL;
|
||||||
FILE * replayopsf = NULL;
|
FILE * replayopsf = NULL;
|
||||||
char opsfile[1024];
|
char opsfile[1024];
|
||||||
@@ -1676,6 +1677,8 @@ usage(void)
|
|||||||
-W: mapped write operations DISabled\n\
|
-W: mapped write operations DISabled\n\
|
||||||
-R: read() system calls only (mapped reads disabled)\n\
|
-R: read() system calls only (mapped reads disabled)\n\
|
||||||
-Z: O_DIRECT (use -R, -W, -r and -w too)\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");
|
fname: this filename is REQUIRED (no default)\n");
|
||||||
exit(90);
|
exit(90);
|
||||||
}
|
}
|
||||||
@@ -1844,6 +1847,7 @@ __test_fallocate(int mode, const char *mode_str)
|
|||||||
|
|
||||||
static struct option longopts[] = {
|
static struct option longopts[] = {
|
||||||
{"replay-ops", required_argument, 0, 256},
|
{"replay-ops", required_argument, 0, 256},
|
||||||
|
{"record-ops", optional_argument, 0, 255},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2034,6 +2038,11 @@ main(int argc, char **argv)
|
|||||||
case 'Z':
|
case 'Z':
|
||||||
o_direct = O_DIRECT;
|
o_direct = O_DIRECT;
|
||||||
break;
|
break;
|
||||||
|
case 255: /* --record-ops */
|
||||||
|
if (optarg)
|
||||||
|
strncpy(opsfile, optarg, sizeof(opsfile));
|
||||||
|
recordops = opsfile;
|
||||||
|
break;
|
||||||
case 256: /* --replay-ops */
|
case 256: /* --replay-ops */
|
||||||
replayops = optarg;
|
replayops = optarg;
|
||||||
break;
|
break;
|
||||||
@@ -2113,8 +2122,10 @@ main(int argc, char **argv)
|
|||||||
prterr(logfile);
|
prterr(logfile);
|
||||||
exit(93);
|
exit(93);
|
||||||
}
|
}
|
||||||
strncat(opsfile, dirpath ? bname : fname, 256);
|
if (!*opsfile) {
|
||||||
strcat(opsfile, ".fsxops");
|
strncat(opsfile, dirpath ? bname : fname, 256);
|
||||||
|
strcat(opsfile, ".fsxops");
|
||||||
|
}
|
||||||
unlink(opsfile);
|
unlink(opsfile);
|
||||||
|
|
||||||
if (replayops) {
|
if (replayops) {
|
||||||
@@ -2195,6 +2206,8 @@ main(int argc, char **argv)
|
|||||||
report_failure(99);
|
report_failure(99);
|
||||||
}
|
}
|
||||||
prt("All %lu operations completed A-OK!\n", testcalls);
|
prt("All %lu operations completed A-OK!\n", testcalls);
|
||||||
|
if (recordops)
|
||||||
|
logdump();
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user