xfstests: allow override of XFS_IOC_DIOINFO
authorEric Sandeen <sandeen@redhat.com>
Mon, 20 Jan 2014 02:28:38 +0000 (13:28 +1100)
committerDave Chinner <david@fromorbit.com>
Mon, 20 Jan 2014 02:28:38 +0000 (13:28 +1100)
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>
ltp/doio.c
ltp/fsstress.c
ltp/iogen.c
src/unwritten_sync.c
tests/btrfs/022 [changed mode: 0644->0755]

index 0f778630eb3ebffbf96f72a3ae616661327a2f97..966cff1d75dc85fda695ca2f7c78ccc1fb293dab 100644 (file)
@@ -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;
index 499a573fccfcddae7c6e0285273a30df4f4ecbc2..c56f1685ca21d064cca1dba0fc7cd4d58173c381 100644 (file)
@@ -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));
index 15f340de7d26f891788f0730251ef9635e73a8a1..1eaab1f0cf8a26fa138d70c4e7f7e6d588798ebc 100644 (file)
@@ -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);
index 6cdf7e8a777ee5bf45dbb9a97ac32295a4d306d9..bf61adf07c5e8460955da6a996c83e533f7b37c3 100644 (file)
@@ -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",
old mode 100644 (file)
new mode 100755 (executable)