PaulHowarth/Blog/2012-04-07

Saturday 7th April 2012

Fedora Project

  • Updated perl-Digest-MD5-File to 0.08 in F-15, F-16, F-17, Rawhide, EPEL-5 and EPEL-6:

  • Updated perl-IO-AIO to 4.14 in F-17 and Rawhide:

    • Fix stat structure usage on windows, which caused bogus stat results

    • (libeio) make readahead emulation behave more like actual readahead by never failing

    • New request aio_seek

    • New request aio_fiemap

    • Auto-generate the #ifdef/#define 0 blocks for symbols we export

  • Updated perl-IO-Socket-SSL to 1.64 in Rawhide:

    • Ignore die from within eval to make tests more stable on Win32 (CPAN RT#76147)

    • Clarify some behaviour regarding hostname verification

Local Packages

  • Updated perl-IO-AIO to 4.14 as per the Fedora version; this went without problems except on EL-5, where it failed to compile:

  • gcc -c   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic   -DVERSION=\"4.14\" -DXS_VERSION=\"4.14\" -fPIC "-I/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE"   AIO.c
    In file included from AIO.xs:9:
    schmorp.h: In function 's_epipe_signal':
    schmorp.h:450: warning: ignoring return value of 'write', declared with attribute warn_unused_result
    schmorp.h: In function 's_epipe_drain':
    schmorp.h:463: warning: ignoring return value of 'read', declared with attribute warn_unused_result
    In file included from AIO.xs:27:
    /usr/include/linux/fiemap.h: At top level:
    /usr/include/linux/fiemap.h:15: error: expected specifier-qualifier-list before '__u64'
    /usr/include/linux/fiemap.h:26: error: expected specifier-qualifier-list before '__u64'
  • The problem there was that EL-5's <linux/fiemap.h> header file uses the __u64 type without pulling in <linux/types.h> to define it, so I tweaked the configure script to check for <linux/types.h> and used it:

  • diff -up IO-AIO-4.14/AIO.xs.orig IO-AIO-4.14/AIO.xs
    --- IO-AIO-4.14/AIO.xs.orig     2012-04-07 01:49:49.000000000 +0100
    +++ IO-AIO-4.14/AIO.xs  2012-04-07 21:17:08.055812147 +0100
    @@ -22,6 +22,7 @@
     #endif
    
     #if __linux__
    +# include <linux/types.h>
     # include <linux/fs.h>
     # ifdef FS_IOC_FIEMAP
     #  include <linux/fiemap.h>
    diff -up IO-AIO-4.14/configure.ac.orig IO-AIO-4.14/configure.ac
    --- IO-AIO-4.14/configure.ac.orig       2012-04-06 10:57:56.000000000 +0100
    +++ IO-AIO-4.14/configure.ac    2012-04-07 21:17:08.066812142 +0100
    @@ -5,7 +5,12 @@ AC_CONFIG_HEADERS([libeio/config.h])
    
     AC_PROG_CC
    
    -AC_CHECK_HEADERS([linux/fs.h linux/fiemap.h])
    +AC_CHECK_HEADERS([linux/fs.h linux/types.h])
    +AC_CHECK_HEADERS([linux/fiemap.h], [], [],
    +[#ifdef HAVE_LINUX_TYPES_H
    +#include <linux/types.h>
    +#endif
    +])
    
     m4_include([libeio/libeio.m4])
  • I sent that fix upstream and it (or something like it) will be included in subsequent releases.
  • However, it still didn't build:
  • gcc -c   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic   -DVERSION=\"4.14\" -DXS_VERSION=\"4.14\" -fPIC "-I/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE"   AIO.c
    In file included from AIO.xs:9:
    schmorp.h: In function 's_epipe_signal':
    schmorp.h:450: warning: ignoring return value of 'write', declared with attribute warn_unused_result
    schmorp.h: In function 's_epipe_drain':
    schmorp.h:463: warning: ignoring return value of 'read', declared with attribute warn_unused_result
    In file included from AIO.xs:127:
    libeio/eio.c: In function 'etp_start_thread':
    libeio/eio.c:577: warning: left-hand operand of comma expression has no effect
    In file included from AIO.xs:127:
    libeio/eio.c:1078:19: error: #if with no expression
  • This one was somewhat more difficult to track down. The line with the error was:
  • #if HAVE_FALLOCATE
  • Looking though the code, it was clear that the HAVE_FALLOCATE macro was either defined to 1 or left undefined, neither of which should have caused the error; this bit of code had also not changed from the previous version, which did compile OK. It turned out that this file now #includes <linux/fs.h>, and in RHEL-5, that includes these lines of code:

  • /* public flags for file_system_type */
    #define FS_REQUIRES_DEV 1 
    #define FS_BINARY_MOUNTDATA 2
    #define HAVE_FALLOCATE
    #define FS_HAS_FALLOCATE 4    /* Safe to check for ->fallocate */
    #define FS_HAS_FIEMAP  8      /* Safe to check for ->fiemap */
    #define FS_HAS_FREEZE 16      /* Safe to check for ->freeze_fs etc */
    #define FS_HAS_TRYTOFREE 32   /* Safe to check for ->bdev_try_to_free... */
    #define FS_HAS_GETRESV 64     /* Safe to check for ->get_reserved_space */
    #define FS_HAS_IODONE2 128    /* dio->io_done is type dio_iodone2_t */
    #define FS_REVAL_DOT    16384   /* Check the paths ".", ".." for staleness */
    #define FS_RENAME_DOES_D_MOVE   32768   /* FS will handle d_move()
                                             * during rename() internally.
                                             */
  • So there was the empty definition of HAVE_FALLOCATE that was causing the problem, and I wasn't the first person to come across this issue. I patched the IO::AIO code to use the symbol HAVE_LINUX_FALLOCATE instead of HAVE_FALLOCATE and that fixed the problem:

  • diff -up IO-AIO-4.14/libeio/eio.c.orig IO-AIO-4.14/libeio/eio.c
    --- IO-AIO-4.14/libeio/eio.c.orig       2012-04-02 18:53:19.000000000 +0100
    +++ IO-AIO-4.14/libeio/eio.c    2012-04-07 21:17:08.076812137 +0100
    @@ -1075,7 +1075,7 @@ eio__sync_file_range (int fd, off_t offs
     static int
     eio__fallocate (int fd, int mode, off_t offset, size_t len)
     {
    -#if HAVE_FALLOCATE
    +#if HAVE_LINUX_FALLOCATE
       return fallocate (fd, mode, offset, len);
     #else
       errno = ENOSYS;
    diff -up IO-AIO-4.14/libeio/libeio.m4.orig IO-AIO-4.14/libeio/libeio.m4
    --- IO-AIO-4.14/libeio/libeio.m4.orig   2011-07-24 06:46:26.000000000 +0100
    +++ IO-AIO-4.14/libeio/libeio.m4        2012-04-07 21:17:54.640785066 +0100
    @@ -136,7 +136,7 @@ int main (void)
        return 0;
     }
     ],ac_cv_fallocate=yes,ac_cv_fallocate=no)])
    -test $ac_cv_fallocate = yes && AC_DEFINE(HAVE_FALLOCATE, 1, fallocate(2) is available)
    +test $ac_cv_fallocate = yes && AC_DEFINE(HAVE_LINUX_FALLOCATE, 1, fallocate(2) is available)
    
     AC_CACHE_CHECK(for sys_syncfs, ac_cv_sys_syncfs, [AC_LINK_IFELSE([
     #include <unistd.h>
  • I sent that fix upstream too but Marc insists that that's a Red Hat bug that needs fixing; I can try raising a bug on that but I don't hold out much hope of it getting fixed, and certainly not any time soon, so it seems I'll be carrying this patch for a while.
  • Updated perl-IO-Socket-SSL to 1.64 as per the Fedora version

  • Rebuilt sendmail for libdb 5.3 in Rawhide


Recent