Bug #9914
closedposix_fadvise() does not work correctly with _LARGE_FILES on 32-bit AIX
Description
test_advise in test/ruby/test_io.rb fails on AIX.
[  1/170] TestIO#test_advise = 0.01 s
  1) Error:
TestIO#test_advise:
Errno::EINVAL: Invalid argument - /tmp/test_io20140606-7733390-1xgpc07
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2437:in `advise'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2437:in `block (4 levels) in test_advise'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2436:in `open'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2436:in `block (3 levels) in test_advise'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2435:in `each'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2435:in `block (2 levels) in test_advise'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2434:in `each'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2434:in `block in test_advise'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:1442:in `make_tempfile'
    /ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/ruby/test_io.rb:2432:in `test_advise'
It is very strange, but the current AIX does not seem to support a 32-bit call to posix_fadvise() when _LARGE_FILES is defined.
http://www-01.ibm.com/support/docview.wss?uid=isg1IV56170
Until it is supported, we need this ugly patch to not call posix_fadvise()....
--- io.c        (revision 46310)
+++ io.c        (working copy)
@@ -8586,7 +8586,10 @@
     off = NIL_P(offset) ? 0 : NUM2OFFT(offset);
     l   = NIL_P(len)    ? 0 : NUM2OFFT(len);
 
-#ifdef HAVE_POSIX_FADVISE
+    /* AIX currently does not support a 32-bit call to posix_fadvise()
+     * if _LARGE_FILES is defined.
+     */
+#if defined(HAVE_POSIX_FADVISE) && !(defined(_AIX) && defined(_LARGE_FILES) && !defined(_ARCH_PPC64))
     return do_io_advise(fptr, advice, off, l);
 #else
     ((void)off, (void)l);      /* Ignore all hint */
FYI, detailed explanation follows:
The 2nd and 3rd arguemnts to posix_fadvise() are the off_t type. If _LARGE_FILES is defined, off_t is defined as long long int on the caller side. This means the 2nd and 3rd arguments are passed using two registers each on a 32-bit environment. However, the callee side does not support _LARGE_FILES, so off_t is assumed to be long int, which is passed using one register. As a result, the callee side can not receive a correct value for the 4th argument, int advice, throwing EINVAL.
        
           Updated by kanemoto (Yutaka Kanemoto) over 11 years ago
          Updated by kanemoto (Yutaka Kanemoto) over 11 years ago
          
          
        
        
      
      - Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r46382.
io.c (rb_io_advise): AIX currently does not support a 32-bit call to
posix_fadvise() if _LARGE_FILES is defined. Patch by Rei Odaira.
[ruby-core:62968] [Bug #9914]
        
           Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago
          Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED
        
           Updated by nagachika (Tomoyuki Chikanaga) about 11 years ago
          Updated by nagachika (Tomoyuki Chikanaga) about 11 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE
Backported into ruby_2_1 branch at r47139.
        
           Updated by usa (Usaku NAKAMURA) about 11 years ago
          Updated by usa (Usaku NAKAMURA) about 11 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: REQUIRED, 2.1: DONE to 2.0.0: DONE, 2.1: DONE
backported into ruby_2_0_0 at r47367.
        
           Updated by ReiOdaira (Rei Odaira) about 11 years ago
          Updated by ReiOdaira (Rei Odaira) about 11 years ago
          
          
        
        
      
      I am not familiar with autoconf, but shoundn't this be ac_cv_func_posix_fadvise, not ac_cv_posix_fadvise?
--- configure.in        (revision 47818)
+++ configure.in        (working copy)
@@ -1207,7 +1207,7 @@
        [
            # AIX currently does not support a 32-bit call to posix_fadvise()
            # if _LARGE_FILES is defined.
-           ac_cv_posix_fadvise=no
+           ac_cv_func_posix_fadvise=no
        ])
     ])
        
           Updated by nobu (Nobuyoshi Nakada) about 11 years ago
          Updated by nobu (Nobuyoshi Nakada) about 11 years ago
          
          
        
        
      
      Exactly.
Please fix it.
        
           Updated by nagachika (Tomoyuki Chikanaga) about 11 years ago
          Updated by nagachika (Tomoyuki Chikanaga) about 11 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: DONE, 2.1: DONE to 2.0.0: REQUIRED, 2.1: REQUIRED
        
           Updated by usa (Usaku NAKAMURA) about 11 years ago
          Updated by usa (Usaku NAKAMURA) about 11 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: DONE, 2.1: REQUIRED
Backported into ruby_2_0_0 at r47933.
        
           Updated by nagachika (Tomoyuki Chikanaga) about 11 years ago
          Updated by nagachika (Tomoyuki Chikanaga) about 11 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: DONE, 2.1: REQUIRED to 2.0.0: DONE, 2.1: DONE
Backported r47819 into ruby_2_1 at r47945.