]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libext2fs: have UNIX IO manager use pread/pwrite
authorDarrick J. Wong <darrick.wong@oracle.com>
Sat, 2 Aug 2014 23:18:03 +0000 (19:18 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 2 Aug 2014 23:18:03 +0000 (19:18 -0400)
If pread/pwrite are present, have the UNIX IO manager use them for
aligned IOs (instead of the current seek -> read/write), thereby
saving us a (minor) amount of system call overhead.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
configure
configure.in
lib/config.h.in
lib/ext2fs/unix_io.c

index 1886f8f0844694b7381c496af915c1c2f308ef03..f0af1d53164302f054a257e9d2ccc237849629c9 100755 (executable)
--- a/configure
+++ b/configure
@@ -12994,7 +12994,7 @@ if test "$ac_res" != no; then :
 fi
 
 fi
-for ac_func in         __secure_getenv         backtrace       blkid_probe_get_topology        blkid_probe_enable_partitions   chflags         fadvise64       fallocate       fallocate64     fchown  fdatasync       fstat64         ftruncate64     futimes         getcwd  getdtablesize   getmntinfo      getpwuid_r      getrlimit       getrusage       jrand48         llseek  lseek64         mallinfo        mbstowcs        memalign        mempcpy         mmap    msync   nanosleep       open64  pathconf        posix_fadvise   posix_fadvise64         posix_memalign  prctl   secure_getenv   setmntent       setresgid       setresuid       snprintf        srandom         stpcpy  strcasecmp      strdup  strnlen         strptime        strtoull        sync_file_range         sysconf         usleep  utime   valloc
+for ac_func in         __secure_getenv         backtrace       blkid_probe_get_topology        blkid_probe_enable_partitions   chflags         fadvise64       fallocate       fallocate64     fchown  fdatasync       fstat64         ftruncate64     futimes         getcwd  getdtablesize   getmntinfo      getpwuid_r      getrlimit       getrusage       jrand48         llseek  lseek64         mallinfo        mbstowcs        memalign        mempcpy         mmap    msync   nanosleep       open64  pathconf        posix_fadvise   posix_fadvise64         posix_memalign  prctl   pread   pwrite  secure_getenv   setmntent       setresgid       setresuid       snprintf        srandom         stpcpy  strcasecmp      strdup  strnlen         strptime        strtoull        sync_file_range         sysconf         usleep  utime   valloc
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
index ed9f691e48da349245a52cce42a5403456f9a607..b825f3df10d7c7f01934c15d17d42c50749c9f2a 100644 (file)
@@ -1059,6 +1059,8 @@ AC_CHECK_FUNCS(m4_flatten([
        posix_fadvise64
        posix_memalign
        prctl
+       pread
+       pwrite
        secure_getenv
        setmntent
        setresgid
index be415d8ae883317a2dec07d8cdfa91de8392d4bd..34fb0cc5bb7204925f89e33304a6d0773a8a2663 100644 (file)
 /* Define to 1 if you have the `prctl' function. */
 #undef HAVE_PRCTL
 
+/* Define to 1 if you have the `pread' function. */
+#undef HAVE_PREAD
+
 /* Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE. */
 #undef HAVE_PTHREAD_MUTEX_RECURSIVE
 
 /* Define to 1 if you have the `putenv' function. */
 #undef HAVE_PUTENV
 
+/* Define to 1 if you have the `pwrite' function. */
+#undef HAVE_PWRITE
+
 /* Define to 1 if dirent has d_reclen */
 #undef HAVE_RECLEN_DIRENT
 
index e93684e86fcdf73185d3bd5393df85d104245132..0dd149014b20ea0b814681aa2ba125234a98384e 100644 (file)
@@ -130,6 +130,18 @@ static errcode_t raw_read_blk(io_channel channel,
        size = (count < 0) ? -count : count * channel->block_size;
        data->io_stats.bytes_read += size;
        location = ((ext2_loff_t) block * channel->block_size) + data->offset;
+
+#ifdef HAVE_PREAD
+       /* Try an aligned pread */
+       if ((channel->align == 0) ||
+           (IS_ALIGNED(buf, channel->align) &&
+            IS_ALIGNED(size, channel->align))) {
+               actual = pread(data->dev, buf, size, location);
+               if (actual == size)
+                       return 0;
+       }
+#endif /* HAVE_PREAD */
+
        if (ext2fs_llseek(data->dev, location, SEEK_SET) != location) {
                retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
                goto error_out;
@@ -200,6 +212,18 @@ static errcode_t raw_write_blk(io_channel channel,
        data->io_stats.bytes_written += size;
 
        location = ((ext2_loff_t) block * channel->block_size) + data->offset;
+
+#ifdef HAVE_PWRITE
+       /* Try an aligned pwrite */
+       if ((channel->align == 0) ||
+           (IS_ALIGNED(buf, channel->align) &&
+            IS_ALIGNED(size, channel->align))) {
+               actual = pwrite(data->dev, buf, size, location);
+               if (actual == size)
+                       return 0;
+       }
+#endif /* HAVE_PWRITE */
+
        if (ext2fs_llseek(data->dev, location, SEEK_SET) != location) {
                retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
                goto error_out;