+2017-12-02  Vladimir Kondratyev  <vladimir@kondratyev.su>
+           Cary Coutant  <ccoutant@gmail.com>
+
+       PR gold/22540
+       * output.cc (gold_fallocate): Trivial return for len == 0.
+       Add fallback options when posix_fallocate and fallocate return
+       not-supported errors.
+
 2017-12-01  Cary Coutant  <ccoutant@gmail.com>
 
        PR gold/21090
 
 static int
 gold_fallocate(int o, off_t offset, off_t len)
 {
+  if (len <= 0)
+    return 0;
+
 #ifdef HAVE_POSIX_FALLOCATE
   if (parameters->options().posix_fallocate())
-    return ::posix_fallocate(o, offset, len);
+    {
+      int err = ::posix_fallocate(o, offset, len);
+      if (err != EINVAL && err != ENOSYS && err != EOPNOTSUPP)
+       return err;
+    }
 #endif // defined(HAVE_POSIX_FALLOCATE)
+
 #ifdef HAVE_FALLOCATE
-  if (::fallocate(o, 0, offset, len) == 0)
-    return 0;
+  {
+    int err = ::fallocate(o, 0, offset, len);
+    if (err != EINVAL && err != ENOSYS && err != EOPNOTSUPP)
+      return err;
+  }
 #endif // defined(HAVE_FALLOCATE)
+
   if (::ftruncate(o, offset + len) < 0)
     return errno;
   return 0;