[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1406830068-6485-1-git-send-email-basile@opensource.dyc.edu>
Date: Thu, 31 Jul 2014 14:07:48 -0400
From: basile@...nsource.dyc.edu
To: linux-ext4@...r.kernel.org
Cc: "Anthony G. Basile" <blueness@...too.org>
Subject: [PATCH] misc/e4defrag.c: use posix_fallocate64() if fallocate64() is unavailable
From: "Anthony G. Basile" <blueness@...too.org>
Commit 58229aaf removed the broken fallback syscall for fallocate64() on systems
where the latter is unavailable. However, it did not provide a substitute,
so the build fails on uClibc which does not have fallocate64(), but does have
posix_fallocate64(). Since fallocate64() is called with mode=0, we can make use
of posix_fallocate64() on such systems.
See `man 2 fallocate` and `man 3 posix_fallocate`.
---
configure | 2 +-
configure.in | 1 +
lib/config.h.in | 3 +++
misc/e4defrag.c | 10 +++++++---
4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/configure b/configure
index 6c503aa..9853bc0 100755
--- a/configure
+++ b/configure
@@ -13071,7 +13071,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 llistxattr 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 llistxattr llseek lseek64 mallinfo mbstowcs memalign mempcpy mmap msync nanosleep open64 pathconf posix_fadvise posix_fadvise64 posix_fallocate64 posix_memalign prctl 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 67e5453..48fa099 100644
--- a/configure.in
+++ b/configure.in
@@ -1113,6 +1113,7 @@ AC_CHECK_FUNCS(m4_flatten([
pathconf
posix_fadvise
posix_fadvise64
+ posix_fallocate64
posix_memalign
prctl
secure_getenv
diff --git a/lib/config.h.in b/lib/config.h.in
index 12a609a..3d6796d 100644
--- a/lib/config.h.in
+++ b/lib/config.h.in
@@ -331,6 +331,9 @@
/* Define to 1 if you have the `posix_fadvise64' function. */
#undef HAVE_POSIX_FADVISE64
+/* Define to 1 if you have the `posix_fallocate64' function. */
+#undef HAVE_POSIX_FALLOCATE64
+
/* Define to 1 if you have the `posix_memalign' function. */
#undef HAVE_POSIX_MEMALIGN
diff --git a/misc/e4defrag.c b/misc/e4defrag.c
index d0eac60..ba16a76 100644
--- a/misc/e4defrag.c
+++ b/misc/e4defrag.c
@@ -197,9 +197,9 @@ static struct frag_statistic_ino frag_rank[SHOW_FRAG_FILES];
#error sync_file_range not available!
#endif /* ! HAVE_SYNC_FILE_RANGE */
-#ifndef HAVE_FALLOCATE64
-#error fallocate64 not available!
-#endif /* ! HAVE_FALLOCATE64 */
+#if !defined(HAVE_FALLOCATE64) && !defined(HAVE_POSIX_FALLOCATE64)
+#error neither fallocate64 nor posix_fallocate64 available!
+#endif /* ! HAVE_FALLOCATE64 && ! HAVE_POSIX_FALLOCATE64 */
/*
* get_mount_point() - Get device's mount point.
@@ -1554,7 +1554,11 @@ static int file_defrag(const char *file, const struct stat64 *buf,
/* Allocate space for donor inode */
orig_group_tmp = orig_group_head;
do {
+#ifdef HAVE_FALLOCATE64
ret = fallocate64(donor_fd, 0,
+#else /* HAVE_POSIX_FALLOCATE64 */
+ ret = posix_fallocate64(donor_fd,
+#endif
(loff_t)orig_group_tmp->start->data.logical * block_size,
(loff_t)orig_group_tmp->len * block_size);
if (ret < 0) {
--
1.8.5.5
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists