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, §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); _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs