xfs
[Top] [All Lists]

[PATCH V2] xfstests: get fsstress DIO working on non-xfs filesystems

To: xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH V2] xfstests: get fsstress DIO working on non-xfs filesystems
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Wed, 09 Oct 2013 21:56:28 -0500
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <4B54C8AB.6080607@xxxxxxxxxxx>
References: <4B54C8AB.6080607@xxxxxxxxxxx>
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8
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@xxxxxxxxxxx>
---

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, &sectorsize) < 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);


<Prev in Thread] Current Thread [Next in Thread>