aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZorro Lang <zlang@redhat.com>2017-08-31 13:59:43 +0800
committerEryu Guan <eguan@redhat.com>2017-09-03 12:20:00 +0800
commitb669b303d02e39a62a212b87f4bd1ce259f73d10 (patch)
tree286c887251921ad185d21910d8620b83713c335c
parent41ab666990510cdadc989feb137a2c0e7e0805ed (diff)
downloadxfstests-dev-b669b303d02e39a62a212b87f4bd1ce259f73d10.tar.gz
fsstress: fallback to block size for min dio size
XFS_IOC_DIOINFO is only used for XFS, but fsstress use it to get DIO aligned size. If XFS_IOC_DIOINFO returns error, then stop doing any DIO related test (dread/dwrite/aread/awrite etc). That means we never do DIO related test on other filesystems by fsstress. The real minimal dio size is really not so important for DIO test in fsstress. The multiple of real min dio size is fine too. I think the stat.st_blksize get from stat() system call can be used to be a fake minimal dio size, if XFS_IOC_DIOINFO fails (not supported). Note that the equation about d_maxiosz is copied from kernel XFS_IOC_DIOINFO ioctl source code: case XFS_IOC_DIOINFO: { ... da.d_mem = da.d_miniosz = target->bt_logical_sectorsize; da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); ... } [eguan: update commit log add d_maxiosz reference] Signed-off-by: Zorro Lang <zlang@redhat.com> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
-rw-r--r--ltp/fsstress.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/ltp/fsstress.c b/ltp/fsstress.c
index 7ae7fdf2..24c063e3 100644
--- a/ltp/fsstress.c
+++ b/ltp/fsstress.c
@@ -1901,11 +1901,11 @@ do_aio_rw(int opno, long r, int flags)
if (xfsctl(f.path, fd, XFS_IOC_DIOINFO, &diob) < 0) {
if (v)
printf(
- "%d/%d: do_aio_rw - xfsctl(XFS_IOC_DIOINFO) %s%s failed %d\n",
+ "%d/%d: do_aio_rw - xfsctl(XFS_IOC_DIOINFO) %s%s return %d,"
+ " fallback to stat()\n",
procid, opno, f.path, st, errno);
- free_pathname(&f);
- close(fd);
- return;
+ diob.d_mem = diob.d_miniosz = stb.st_blksize;
+ diob.d_maxiosz = INT_MAX & ~(diob.d_miniosz - 1);
}
dio_env = getenv("XFS_DIO_MIN");
if (dio_env)
@@ -2352,11 +2352,11 @@ dread_f(int opno, long r)
if (xfsctl(f.path, fd, XFS_IOC_DIOINFO, &diob) < 0) {
if (v)
printf(
- "%d/%d: dread - xfsctl(XFS_IOC_DIOINFO) %s%s failed %d\n",
+ "%d/%d: dread - xfsctl(XFS_IOC_DIOINFO) %s%s return %d,"
+ " fallback to stat()\n",
procid, opno, f.path, st, errno);
- free_pathname(&f);
- close(fd);
- return;
+ diob.d_mem = diob.d_miniosz = stb.st_blksize;
+ diob.d_maxiosz = INT_MAX & ~(diob.d_miniosz - 1);
}
dio_env = getenv("XFS_DIO_MIN");
@@ -2430,11 +2430,10 @@ dwrite_f(int opno, long r)
if (xfsctl(f.path, fd, XFS_IOC_DIOINFO, &diob) < 0) {
if (v)
printf("%d/%d: dwrite - xfsctl(XFS_IOC_DIOINFO)"
- " %s%s failed %d\n",
+ " %s%s return %d, fallback to stat()\n",
procid, opno, f.path, st, errno);
- free_pathname(&f);
- close(fd);
- return;
+ diob.d_mem = diob.d_miniosz = stb.st_blksize;
+ diob.d_maxiosz = INT_MAX & ~(diob.d_miniosz - 1);
}
dio_env = getenv("XFS_DIO_MIN");