xfs
[Top] [All Lists]

[PATCH 2/2] xfs_io: configure tests for preadv/pwritev & sync_file_range

To: xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH 2/2] xfs_io: configure tests for preadv/pwritev & sync_file_range
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Tue, 09 Oct 2012 17:08:26 -0500
In-reply-to: <50749EE2.6070408@xxxxxxxxxx>
References: <50749EE2.6070408@xxxxxxxxxx>
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1
On older systems we may not have preadv/pwritev and/or
sync_file_range.

Add the configure magic, and stub out the code
where needed.

(sync_file_range just needed a better test; preadv/pwritev
took a little more rearranging)

And fix a couple typos ("numberic") while we're at it.

Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
---

diff --git a/configure.in b/configure.in
index 664c0e9..b927c32 100644
--- a/configure.in
+++ b/configure.in
@@ -108,6 +108,8 @@ AC_HAVE_GETMNTENT
 AC_HAVE_GETMNTINFO
 AC_HAVE_FALLOCATE
 AC_HAVE_FIEMAP
+AC_HAVE_PREADV
+AC_HAVE_SYNC_FILE_RANGE
 AC_HAVE_BLKID_TOPO($enable_blkid)
 
 AC_TYPE_PSINT
diff --git a/include/builddefs.in b/include/builddefs.in
index 81ebfcd..4a0e910 100644
--- a/include/builddefs.in
+++ b/include/builddefs.in
@@ -101,6 +101,8 @@ HAVE_GETMNTENT = @have_getmntent@
 HAVE_GETMNTINFO = @have_getmntinfo@
 HAVE_FALLOCATE = @have_fallocate@
 HAVE_FIEMAP = @have_fiemap@
+HAVE_PREADV = @have_preadv@
+HAVE_SYNC_FILE_RANGE = @have_sync_file_range@
 
 GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall 
 #         -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl
diff --git a/io/Makefile b/io/Makefile
index bf46d56..23cd90b 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -58,7 +58,7 @@ CFILES += inject.c resblks.c
 LCFLAGS += -DHAVE_INJECT -DHAVE_RESBLKS
 endif
 
-ifeq ($(PKG_PLATFORM),linux)
+ifeq ($(HAVE_SYNC_FILE_RANGE),yes)
 CFILES += sync_file_range.c
 LCFLAGS += -DHAVE_SYNC_FILE_RANGE
 endif
@@ -75,6 +75,10 @@ ifeq ($(HAVE_FALLOCATE),yes)
 LCFLAGS += -DHAVE_FALLOCATE
 endif
 
+ifeq ($(HAVE_PREADV),yes)
+LCFLAGS += -DHAVE_PREADV
+endif
+
 default: depend $(LTCOMMAND)
 
 include $(BUILDRULES)
diff --git a/io/pread.c b/io/pread.c
index 9fad373..9d3720e 100644
--- a/io/pread.c
+++ b/io/pread.c
@@ -48,7 +48,9 @@ pread_help(void)
 " -R   -- read at random offsets in the range of bytes\n"
 " -Z N -- zeed the random number generator (used when reading randomly)\n"
 "         (heh, zorry, the -s/-S arguments were already in use in pwrite)\n"
+#ifdef HAVE_PREADV
 " -V N -- use vectored IO with N iovecs of blocksize each (preadv)\n"
+#endif
 "\n"
 " When in \"random\" mode, the number of read operations will equal the\n"
 " number required to do a complete forward/backward scan of the range.\n"
@@ -169,8 +171,9 @@ dump_buffer(
        }
 }
 
+#ifdef HAVE_PREADV
 static int
-do_pread(
+do_preadv(
        int             fd,
        off64_t         offset,
        ssize_t         count,
@@ -180,10 +183,6 @@ do_pread(
        ssize_t         oldlen = 0;
        ssize_t         bytes = 0;
 
-
-       if (!vectors)
-               return pread64(fd, buffer, min(count, buffer_size), offset);
-
        /* trim the iovec if necessary */
        if (count < buffersize) {
                size_t  len = 0;
@@ -205,6 +204,22 @@ do_pread(
 
        return bytes;
 }
+#else
+#define do_preadv(fd, offset, count, buffer_size) (0)
+#endif
+
+static int
+do_pread(
+       int             fd,
+       off64_t         offset,
+       ssize_t         count,
+       ssize_t         buffer_size)
+{
+       if (!vectors)
+               return pread64(fd, buffer, min(count, buffer_size), offset);
+
+       return do_preadv(fd, offset, count, buffer_size);
+}
 
 static int
 read_random(
@@ -407,14 +422,16 @@ pread_f(
                case 'v':
                        vflag = 1;
                        break;
+#ifdef HAVE_PREADV
                case 'V':
                        vectors = strtoul(optarg, &sp, 0);
                        if (!sp || sp == optarg) {
-                               printf(_("non-numberic vector count == %s\n"),
+                               printf(_("non-numeric vector count == %s\n"),
                                        optarg);
                                return 0;
                        }
                        break;
+#endif
                case 'Z':
                        zeed = strtoul(optarg, &sp, 0);
                        if (!sp || sp == optarg) {
diff --git a/io/pwrite.c b/io/pwrite.c
index 848b990..22a3827 100644
--- a/io/pwrite.c
+++ b/io/pwrite.c
@@ -52,24 +52,23 @@ pwrite_help(void)
 " -R   -- write at random offsets in the specified range of bytes\n"
 " -Z N -- zeed the random number generator (used when writing randomly)\n"
 "         (heh, zorry, the -s/-S arguments were already in use in pwrite)\n"
+#ifdef HAVE_PREADV
 " -V N -- use vectored IO with N iovecs of blocksize each (pwritev)\n"
+#endif
 "\n"));
 }
 
+#ifdef HAVE_PREADV
 static int
-do_pwrite(
+do_pwritev(
        int             fd,
        off64_t         offset,
        ssize_t         count,
        ssize_t         buffer_size)
 {
-       int             vecs = 0;
-       ssize_t         oldlen = 0;
-       ssize_t         bytes = 0;
-
-
-       if (!vectors)
-               return pwrite64(fd, buffer, min(count, buffer_size), offset);
+       int vecs = 0;
+       ssize_t oldlen = 0;
+       ssize_t bytes = 0;
 
        /* trim the iovec if necessary */
        if (count < buffersize) {
@@ -92,6 +91,23 @@ do_pwrite(
 
        return bytes;
 }
+#else
+#define do_pwritev(fd, offset, count, buffer_size) (0)
+#endif
+
+static int
+do_pwrite(
+       int             fd,
+       off64_t         offset,
+       ssize_t         count,
+       ssize_t         buffer_size)
+{
+       if (!vectors)
+               return pwrite64(fd, buffer, min(count, buffer_size), offset);
+
+       return do_pwritev(fd, offset, count, buffer_size);
+}
+
 static int
 write_random(
        off64_t         offset,
@@ -298,7 +314,7 @@ pwrite_f(
                case 'V':
                        vectors = strtoul(optarg, &sp, 0);
                        if (!sp || sp == optarg) {
-                               printf(_("non-numberic vector count == %s\n"),
+                               printf(_("non-numeric vector count == %s\n"),
                                        optarg);
                                return 0;
                        }
diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4
index 1e2c256..f489f52 100644
--- a/m4/package_libcdev.m4
+++ b/m4/package_libcdev.m4
@@ -135,3 +135,38 @@ AC_DEFUN([AC_HAVE_FIEMAP],
        AC_MSG_RESULT(no))
     AC_SUBST(have_fiemap)
   ])
+
+#
+# Check if we have a preadv libc call (Linux)
+#
+AC_DEFUN([AC_HAVE_PREADV],
+  [ AC_MSG_CHECKING([for preadv])
+    AC_TRY_LINK([
+#define _FILE_OFFSET_BITS 64
+#define _BSD_SOURCE
+#include <sys/uio.h>
+    ], [
+         preadv(0, 0, 0, 0);
+    ], have_preadv=yes
+       AC_MSG_RESULT(yes),
+       AC_MSG_RESULT(no))
+    AC_SUBST(have_preadv)
+  ])
+
+#
+# Check if we have a sync_file_range libc call (Linux)
+#
+AC_DEFUN([AC_HAVE_SYNC_FILE_RANGE],
+  [ AC_MSG_CHECKING([for sync_file_range])
+    AC_TRY_LINK([
+#define _GNU_SOURCE
+#define _FILE_OFFSET_BITS 64
+#include <fcntl.h>
+    ], [
+         sync_file_range(0, 0, 0, 0);
+    ], have_sync_file_range=yes
+       AC_MSG_RESULT(yes),
+       AC_MSG_RESULT(no))
+    AC_SUBST(have_sync_file_range)
+  ])
+


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