Re: [PATCH] libext2fs: have UNIX IO manager use pread64/pwrite64

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



unsubscribe linux-ext4

2014-08-09 0:01 GMT+03:00 Theodore Ts'o <tytso@xxxxxxx>:
> Commit baa3544609da3c ("libext2fs: have UNIX IO manager use
> pread/pwrite) causes a breakage on 32-bit systems where off_t is
> 32-bits for file systems larger than 4GB.  Fix this by using
> pread64/pwrite64 if possible, and if pread64/pwrite64 is not present,
> using pread/pwrite only if the size of off_t is at least as big as
> ext2_loff_t.
>
> Signed-off-by: Theodore Ts'o <tytso@xxxxxxx>
> ---
>  configure            |  2 +-
>  configure.in         |  2 ++
>  lib/config.h.in      |  6 ++++++
>  lib/ext2fs/unix_io.c | 24 ++++++++++++++++++++++--
>  4 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/configure b/configure
> index f0af1d5..b9ce43d 100755
> --- 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   pread   pwrite  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  pread64         pwrite64        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"
> diff --git a/configure.in b/configure.in
> index b825f3d..2e59fde 100644
> --- a/configure.in
> +++ b/configure.in
> @@ -1061,6 +1061,8 @@ AC_CHECK_FUNCS(m4_flatten([
>         prctl
>         pread
>         pwrite
> +       pread64
> +       pwrite64
>         secure_getenv
>         setmntent
>         setresgid
> diff --git a/lib/config.h.in b/lib/config.h.in
> index 34fb0cc..50cf312 100644
> --- a/lib/config.h.in
> +++ b/lib/config.h.in
> @@ -328,6 +328,9 @@
>  /* Define to 1 if you have the `pread' function. */
>  #undef HAVE_PREAD
>
> +/* Define to 1 if you have the `pread64' function. */
> +#undef HAVE_PREAD64
> +
>  /* Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE. */
>  #undef HAVE_PTHREAD_MUTEX_RECURSIVE
>
> @@ -340,6 +343,9 @@
>  /* Define to 1 if you have the `pwrite' function. */
>  #undef HAVE_PWRITE
>
> +/* Define to 1 if you have the `pwrite64' function. */
> +#undef HAVE_PWRITE64
> +
>  /* Define to 1 if dirent has d_reclen */
>  #undef HAVE_RECLEN_DIRENT
>
> diff --git a/lib/ext2fs/unix_io.c b/lib/ext2fs/unix_io.c
> index 0dd1490..eb39b28 100644
> --- a/lib/ext2fs/unix_io.c
> +++ b/lib/ext2fs/unix_io.c
> @@ -131,11 +131,21 @@ static errcode_t raw_read_blk(io_channel channel,
>         data->io_stats.bytes_read += size;
>         location = ((ext2_loff_t) block * channel->block_size) + data->offset;
>
> -#ifdef HAVE_PREAD
> +#ifdef HAVE_PREAD64
>         /* Try an aligned pread */
>         if ((channel->align == 0) ||
>             (IS_ALIGNED(buf, channel->align) &&
>              IS_ALIGNED(size, channel->align))) {
> +               actual = pread64(data->dev, buf, size, location);
> +               if (actual == size)
> +                       return 0;
> +       }
> +#elif HAVE_PREAD
> +       /* Try an aligned pread */
> +       if ((sizeof(off_t) >= sizeof(ext2_loff_t)) &&
> +           ((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;
> @@ -213,11 +223,21 @@ static errcode_t raw_write_blk(io_channel channel,
>
>         location = ((ext2_loff_t) block * channel->block_size) + data->offset;
>
> -#ifdef HAVE_PWRITE
> +#ifdef HAVE_PWRITE64
>         /* Try an aligned pwrite */
>         if ((channel->align == 0) ||
>             (IS_ALIGNED(buf, channel->align) &&
>              IS_ALIGNED(size, channel->align))) {
> +               actual = pwrite64(data->dev, buf, size, location);
> +               if (actual == size)
> +                       return 0;
> +       }
> +#elif HAVE_PWRITE
> +       /* Try an aligned pwrite */
> +       if ((sizeof(off_t) >= sizeof(ext2_loff_t)) &&
> +           ((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;
> --
> 2.0.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Best regards,
Timofey.
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux