mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
xfstests: allow override of XFS_IOC_DIOINFO
This change allows xfstests runs to simulate apps which don't bother to call XFS_IOC_DIOINFO, and simply issue DIO in sizes and alignments of its own choosing. So i.e.: # export XFS_DIO_MIN=512 prior to an xfstests run, and these test binaries should issue 512-aligned DIOs instead of whatever XFS_IOC_DIOINFO says (i.e. instead of maybe 4k). (This is in preparation for allowing 512 IOs on "advanced format" 512/4k disks, when xfs has an internal 4k sector size). Signed-off-by: Eric Sandeen <sandeen@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
committed by
Dave Chinner
parent
94d3f77819
commit
6571cea7eb
+12
@@ -1471,6 +1471,7 @@ fmt_ioreq(struct io_req *ioreq, struct syscall_info *sy, int fd)
|
||||
(io->r_uflags & F_WORD_ALIGNED) ? "aligned" : "unaligned");
|
||||
|
||||
if(io->r_oflags & O_DIRECT) {
|
||||
char *dio_env;
|
||||
struct dioattr finfo;
|
||||
|
||||
if(xfsctl(io->r_file, fd, XFS_IOC_DIOINFO, &finfo) == -1) {
|
||||
@@ -1481,6 +1482,10 @@ fmt_ioreq(struct io_req *ioreq, struct syscall_info *sy, int fd)
|
||||
finfo.d_maxiosz = 1;
|
||||
}
|
||||
|
||||
dio_env = getenv("XFS_DIO_MIN");
|
||||
if (dio_env)
|
||||
finfo.d_mem = finfo.d_miniosz = atoi(dio_env);
|
||||
|
||||
cp += sprintf(cp, " DIRECT I/O: offset %% %d = %d length %% %d = %d\n",
|
||||
finfo.d_miniosz,
|
||||
io->r_offset % finfo.d_miniosz,
|
||||
@@ -2774,11 +2779,18 @@ int oflags;
|
||||
free_slot->c_rtc = Reqno;
|
||||
|
||||
if (oflags & O_DIRECT) {
|
||||
char *dio_env;
|
||||
|
||||
if (xfsctl(file, fd, XFS_IOC_DIOINFO, &finfo) == -1) {
|
||||
finfo.d_mem = 1;
|
||||
finfo.d_miniosz = 1;
|
||||
finfo.d_maxiosz = 1;
|
||||
}
|
||||
|
||||
dio_env = getenv("XFS_DIO_MIN");
|
||||
if (dio_env)
|
||||
finfo.d_mem = finfo.d_miniosz = atoi(dio_env);
|
||||
|
||||
} else {
|
||||
finfo.d_mem = 1;
|
||||
finfo.d_miniosz = 1;
|
||||
|
||||
@@ -1930,6 +1930,7 @@ dread_f(int opno, long r)
|
||||
struct stat64 stb;
|
||||
int v;
|
||||
char st[1024];
|
||||
char *dio_env;
|
||||
|
||||
init_pathname(&f);
|
||||
if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
|
||||
@@ -1974,6 +1975,11 @@ dread_f(int opno, long r)
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
dio_env = getenv("XFS_DIO_MIN");
|
||||
if (dio_env)
|
||||
diob.d_mem = diob.d_miniosz = atoi(dio_env);
|
||||
|
||||
align = (__int64_t)diob.d_miniosz;
|
||||
lr = ((__int64_t)random() << 32) + random();
|
||||
off = (off64_t)(lr % stb.st_size);
|
||||
@@ -2010,6 +2016,7 @@ dwrite_f(int opno, long r)
|
||||
struct stat64 stb;
|
||||
int v;
|
||||
char st[1024];
|
||||
char *dio_env;
|
||||
|
||||
init_pathname(&f);
|
||||
if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
|
||||
@@ -2046,6 +2053,11 @@ dwrite_f(int opno, long r)
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
dio_env = getenv("XFS_DIO_MIN");
|
||||
if (dio_env)
|
||||
diob.d_mem = diob.d_miniosz = atoi(dio_env);
|
||||
|
||||
align = (__int64_t)diob.d_miniosz;
|
||||
lr = ((__int64_t)random() << 32) + random();
|
||||
off = (off64_t)(lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE));
|
||||
|
||||
+10
@@ -781,6 +781,7 @@ struct file_info *rec;
|
||||
|
||||
rec->f_riou = BSIZE;
|
||||
if( (fd = open(rec->f_path, O_RDWR|O_DIRECT, 0)) != -1 ) {
|
||||
char *dio_env;
|
||||
#ifdef XFS_IOC_DIOINFO
|
||||
if(xfsctl(rec->f_path, fd, XFS_IOC_DIOINFO, &finfo) != -1) {
|
||||
#else
|
||||
@@ -790,6 +791,10 @@ struct file_info *rec;
|
||||
bozo!
|
||||
#endif
|
||||
#endif
|
||||
dio_env = getenv("XFS_DIO_MIN");
|
||||
if (dio_env)
|
||||
finfo.d_mem = finfo.d_miniosz = atoi(dio_env);
|
||||
|
||||
rec->f_riou = finfo.d_miniosz;
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
@@ -1001,6 +1006,7 @@ bozo!
|
||||
if(Owrite == 2) {
|
||||
close(fd);
|
||||
if( (fd = open(path, O_CREAT|O_RDWR|O_DIRECT, 0)) != -1 ) {
|
||||
char *dio_env;
|
||||
#ifdef XFS_IOC_DIOINFO
|
||||
if(xfsctl(path, fd, XFS_IOC_DIOINFO, &finfo) == -1) {
|
||||
#else
|
||||
@@ -1018,6 +1024,10 @@ bozo!
|
||||
/*fprintf(stderr, "%s: miniosz=%d\n",
|
||||
path, finfo.d_miniosz);*/
|
||||
}
|
||||
|
||||
dio_env = getenv("XFS_DIO_MIN");
|
||||
if (dio_env)
|
||||
finfo.d_mem = finfo.d_miniosz = atoi(dio_env);
|
||||
} else {
|
||||
fprintf(stderr, "iogen%s: Error %s (%d) opening file %s with flags O_CREAT|O_RDWR|O_DIRECT\n",
|
||||
TagName, SYSERR, errno, path);
|
||||
|
||||
@@ -27,6 +27,7 @@ main(int argc, char *argv[])
|
||||
off_t offset;
|
||||
char *file;
|
||||
int loops;
|
||||
char *dio_env;
|
||||
|
||||
if(argc != 3) {
|
||||
fprintf(stderr, "%s <loops> <file>\n", argv[0]);
|
||||
@@ -53,6 +54,10 @@ main(int argc, char *argv[])
|
||||
exit(1);
|
||||
}
|
||||
|
||||
dio_env = getenv("XFS_DIO_MIN");
|
||||
if (dio_env)
|
||||
dio.d_mem = dio.d_miniosz = atoi(dio_env);
|
||||
|
||||
if ((dio.d_miniosz > IO_SIZE) || (dio.d_maxiosz < IO_SIZE)) {
|
||||
fprintf(stderr, "Test won't work - iosize out of range"
|
||||
" (dio.d_miniosz=%d, dio.d_maxiosz=%d)\n",
|
||||
|
||||
Regular → Executable
Reference in New Issue
Block a user