[PATCH V2] xfstests: get fsstress DIO working on non-xfs filesystems
Eric Sandeen
sandeen at sandeen.net
Wed Oct 9 21:56:28 CDT 2013
Pretty sure all DIO IO fails in fsstress today since XFS_IOC_DIOINFO
fails. If so, rather than just bailing out on the op, assign
some sane default DIO parameters, getting min IO size from
sector size if possible.
Signed-off-by: Eric Sandeen <sandeen at sandeen.net>
---
V2: factor out get_alignment, use BLKSSZGET for min DIO size
rather than guessing at 512.
diff --git a/ltp/fsstress.c b/ltp/fsstress.c
index 5d5611f..af06059 100644
--- a/ltp/fsstress.c
+++ b/ltp/fsstress.c
@@ -550,6 +550,27 @@ int main(int argc, char **argv)
return 0;
}
+/*
+ * Get alignment via XFS_IOC_DIOINFO, else fall back to
+ * best guess from BLKSSZGET, else return -1.
+ */
+static int
+get_alignment(pathname_t *f, int fd, struct dioattr *dio)
+{
+ if (xfsctl(f->path, fd, XFS_IOC_DIOINFO, dio) < 0) {
+ int sectorsize;
+
+ if (ioctl(fd, BLKSSZGET, §orsize) < 0)
+ return -1;
+
+ dio->d_maxiosz = -1U;
+ dio->d_miniosz = sectorsize;
+ dio->d_mem = sectorsize;
+ }
+
+ return 0;
+}
+
void
add_to_flist(int ft, int id, int parent)
{
@@ -1965,10 +1986,10 @@ dread_f(int opno, long r)
close(fd);
return;
}
- if (xfsctl(f.path, fd, XFS_IOC_DIOINFO, &diob) < 0) {
+ if (get_alignment(&f, fd, &diob) < 0) {
if (v)
printf(
- "%d/%d: dread - xfsctl(XFS_IOC_DIOINFO) %s%s failed %d\n",
+ "%d/%d: dread - get_alignment %s%s failed %d\n",
procid, opno, f.path, st, errno);
free_pathname(&f);
close(fd);
@@ -2037,9 +2058,9 @@ dwrite_f(int opno, long r)
return;
}
inode_info(st, sizeof(st), &stb, v);
- if (xfsctl(f.path, fd, XFS_IOC_DIOINFO, &diob) < 0) {
+ if (get_alignment(&f, fd, &diob) < 0) {
if (v)
- printf("%d/%d: dwrite - xfsctl(XFS_IOC_DIOINFO)"
+ printf("%d/%d: dwrite - get_alignment"
" %s%s failed %d\n",
procid, opno, f.path, st, errno);
free_pathname(&f);
More information about the xfs
mailing list