From: Baruch Siach Date: Thu, 2 Jan 2014 18:05:37 +0000 (-0500) Subject: e4defrag: choose the best available posix_fadvise variant X-Git-Tag: v1.42.9.wc1~135 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=9a3938918545b831b215b2befc2454f7b1a2dd84;p=tools%2Fe2fsprogs.git e4defrag: choose the best available posix_fadvise variant Use posix_fadvise64() when available. This allows 64bit offsets on 32bit systems. [ Modified by tytso to try to use fadvise64() as well, and to remove the attempt to call the syscall directly, since because and complexities caused by required dummy arguments on some architectures, it's not worth the hair. ] Signed-off-by: Baruch Siach Signed-off-by: Theodore Ts'o --- diff --git a/configure b/configure index 6f8f1ab..5943849 100755 --- a/configure +++ b/configure @@ -11051,7 +11051,7 @@ if test "$ac_res" != no; then : fi fi -for ac_func in __secure_getenv backtrace blkid_probe_get_topology chflags fallocate fallocate64 fchown fdatasync fstat64 ftruncate64 futimes getdtablesize getmntinfo getpwuid_r getrlimit getrusage jrand48 llseek lseek64 mallinfo mbstowcs memalign mmap msync nanosleep open64 pathconf posix_fadvise posix_memalign prctl secure_getenv setmntent setresgid setresuid srandom strcasecmp strdup strnlen strptime strtoull sync_file_range sysconf usleep utime valloc +for ac_func in __secure_getenv backtrace blkid_probe_get_topology chflags fadvise64 fallocate fallocate64 fchown fdatasync fstat64 ftruncate64 futimes getdtablesize getmntinfo getpwuid_r getrlimit getrusage jrand48 llseek lseek64 mallinfo mbstowcs memalign mmap msync nanosleep open64 pathconf posix_fadvise posix_fadvise64 posix_memalign prctl secure_getenv setmntent setresgid setresuid srandom 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 b70a3f9..214d3f6 100644 --- a/configure.in +++ b/configure.in @@ -1026,6 +1026,7 @@ AC_CHECK_FUNCS(m4_flatten([ backtrace blkid_probe_get_topology chflags + fadvise64 fallocate fallocate64 fchown @@ -1050,6 +1051,7 @@ AC_CHECK_FUNCS(m4_flatten([ open64 pathconf posix_fadvise + posix_fadvise64 posix_memalign prctl secure_getenv diff --git a/lib/config.h.in b/lib/config.h.in index ef2e664..0197b56 100644 --- a/lib/config.h.in +++ b/lib/config.h.in @@ -103,6 +103,9 @@ /* Define to 1 if Ext2 ioctls present */ #undef HAVE_EXT2_IOCTLS +/* Define to 1 if you have the `fadvise64' function. */ +#undef HAVE_FADVISE64 + /* Define to 1 if you have the `fallocate' function. */ #undef HAVE_FALLOCATE @@ -287,6 +290,9 @@ /* Define to 1 if you have the `posix_fadvise' function. */ #undef HAVE_POSIX_FADVISE +/* Define to 1 if you have the `posix_fadvise64' function. */ +#undef HAVE_POSIX_FADVISE64 + /* 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 c6a5f0d..c2695e8 100644 --- a/misc/e4defrag.c +++ b/misc/e4defrag.c @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -183,29 +182,21 @@ static ext4_fsblk_t files_block_count; static struct frag_statistic_ino frag_rank[SHOW_FRAG_FILES]; -/* Local definitions of some syscalls glibc may not yet have */ - -#ifndef HAVE_POSIX_FADVISE -#warning Using locally defined posix_fadvise interface. - -#ifndef __NR_fadvise64_64 -#error Your kernel headers dont define __NR_fadvise64_64 +/* + * We prefer posix_fadvise64 when available, as it allows 64bit offset on + * 32bit systems + */ +#if defined(HAVE_POSIX_FADVISE64) +#define posix_fadvise posix_fadvise64 +#elif defined(HAVE_FADVISE64) +#define posix_fadvise fadvise64 +#elif !defined(HAVE_POSIX_FADVISE) +#error posix_fadvise not available! #endif /* - * fadvise() - Give advice about file access. - * - * @fd: defrag target file's descriptor. - * @offset: file offset. - * @len: area length. - * @advise: process flag. + * Local definitions of some syscalls glibc may not yet have */ -static int posix_fadvise(int fd, loff_t offset, size_t len, int advise) -{ - return syscall(__NR_fadvise64_64, fd, offset, len, advise); -} -#endif /* ! HAVE_FADVISE64_64 */ - #ifndef HAVE_SYNC_FILE_RANGE #warning Using locally defined sync_file_range interface.