From: Eric Sandeen Date: Wed, 10 Oct 2012 03:40:11 +0000 (+0000) Subject: xfs_io: configure tests for preadv/pwritev & sync_file_range X-Git-Tag: v3.1.9-rc1~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=197d58280343dddf1e24f1c742e1a92968649359;p=thirdparty%2Fxfsprogs-dev.git xfs_io: configure tests for preadv/pwritev & sync_file_range 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 Reviewed-by: Dave Chinner Signed-off-by: Mark Tinguely --- diff --git a/configure.in b/configure.in index 664c0e93b..b927c3200 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 04590d2f8..0a3fa1a93 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 bf46d56f2..50edf91b6 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,11 @@ ifeq ($(HAVE_FALLOCATE),yes) LCFLAGS += -DHAVE_FALLOCATE endif +# Also implies PWRITEV +ifeq ($(HAVE_PREADV),yes) +LCFLAGS += -DHAVE_PREADV -DHAVE_PWRITEV +endif + default: depend $(LTCOMMAND) include $(BUILDRULES) diff --git a/io/pread.c b/io/pread.c index 7e2ed7d64..a42baeddd 100644 --- a/io/pread.c +++ b/io/pread.c @@ -47,7 +47,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" @@ -168,8 +170,9 @@ dump_buffer( } } +#ifdef HAVE_PREADV static int -do_pread( +do_preadv( int fd, off64_t offset, ssize_t count, @@ -179,10 +182,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; @@ -204,6 +203,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( @@ -406,14 +421,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 73acbac6f..a2f0a81e3 100644 --- a/io/pwrite.c +++ b/io/pwrite.c @@ -51,24 +51,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_PWRITEV " -V N -- use vectored IO with N iovecs of blocksize each (pwritev)\n" +#endif "\n")); } +#ifdef HAVE_PWRITEV 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) { @@ -91,6 +90,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, @@ -297,7 +313,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 1e2c256b3..f489f527d 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 + ], [ + 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 + ], [ + 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) + ]) +