* [PATCH] libext2fs: have UNIX IO manager use pread64/pwrite64
@ 2014-08-08 21:01 Theodore Ts'o
2014-08-08 21:21 ` Timofey Titovets
0 siblings, 1 reply; 2+ messages in thread
From: Theodore Ts'o @ 2014-08-08 21:01 UTC (permalink / raw)
To: Ext4 Developers List; +Cc: Theodore Ts'o
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@mit.edu>
---
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
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] libext2fs: have UNIX IO manager use pread64/pwrite64
2014-08-08 21:01 [PATCH] libext2fs: have UNIX IO manager use pread64/pwrite64 Theodore Ts'o
@ 2014-08-08 21:21 ` Timofey Titovets
0 siblings, 0 replies; 2+ messages in thread
From: Timofey Titovets @ 2014-08-08 21:21 UTC (permalink / raw)
Cc: Ext4 Developers List
unsubscribe linux-ext4
2014-08-09 0:01 GMT+03:00 Theodore Ts'o <tytso@mit.edu>:
> 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@mit.edu>
> ---
> 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 syscon
f 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@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Best regards,
Timofey.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-08-08 21:21 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-08 21:01 [PATCH] libext2fs: have UNIX IO manager use pread64/pwrite64 Theodore Ts'o
2014-08-08 21:21 ` Timofey Titovets
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox