#19336: e2fsprogs compile error
------------------------+------------------------
  Reporter:  anonymous  |      Owner:  developers
      Type:  defect     |     Status:  new
  Priority:  normal     |  Milestone:
 Component:  packages   |    Version:  Trunk
Resolution:             |   Keywords:
------------------------+------------------------

Comment (by anonymous):

 same here, ar71xx on Archlinux x86_64.
 someone says
   The code intentionally commits suicide with

   #ifndef HAVE_FALLOCATE64
   #error fallocate64 not available!
   #endif /* ! HAVE_FALLOCATE64 */


   Indeed, uclibc doesn't have fallocate64() but it *does* have
 posix_fallocate64().  Since fallocate64() is called with mode = 0, the
 behaviour of the two should be the same.  man 2 fallocate for reference.

   We could either port fallocate/fallocate64() to uclibc or make e2fsprogs
 more posix-ish.  I blame e2fsprogs.  The patch is easy enough.  Patching
 just the C file for now (eventually we need to get the build system
 checking for all the right stuff):
 Found a patch but I don't know whether it's the point.
 {{{

 From: "Anthony G. Basile" <blueness@xxxxxxxxxx>

 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

 --
 }}}

--
Ticket URL: <https://dev.openwrt.org/ticket/19336#comment:3>
OpenWrt <http://openwrt.org>
Opensource Wireless Router Technology
_______________________________________________
openwrt-tickets mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-tickets

Reply via email to