changeset 10186:bef6a09c05f1

utimens.c: correct kernel bug work-around Ondřej Vašík found that the invalid return value of 280 indicates failure, not success, and the kernel bug we're trying to work around affects not just the utimensat call, but also the fallback futimens call. * lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT]: Simulate failure, not success. [HAVE_FUTIMENS]: Use the same work-around, here.
author Jim Meyering <meyering@redhat.com>
date Fri, 06 Jun 2008 18:20:14 +0200
parents 22b6b32738ea
children c38e882d5502
files ChangeLog lib/utimens.c
diffstat 2 files changed, 21 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-06-09  Jim Meyering  <meyering@redhat.com>
+	and Ondřej Vašík  <ovasik@redhat.com>
+
+	utimens.c: correct kernel bug work-around
+	Ondřej Vašík found that the invalid return value of 280 indicates
+	failure, not success, and the kernel bug we're trying to work
+	around affects not just the utimensat call, but also the fallback
+	futimens call.
+	* lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT]: Simulate failure,
+	not success.
+	[HAVE_FUTIMENS]: Use the same work-around, here.
+
 2008-06-08  Bruno Haible  <bruno@clisp.org>
 
 	* lib/acl-internal.h: Add me as co-author.
--- a/lib/utimens.c
+++ b/lib/utimens.c
@@ -103,17 +103,17 @@
   if (fd < 0)
     {
       int result = utimensat (AT_FDCWD, file, timespec, 0);
-#ifdef __linux__
+# ifdef __linux__
       /* Work around what might be a kernel bug:
          http://bugzilla.redhat.com/442352
          http://bugzilla.redhat.com/449910
          It appears that utimensat can mistakenly return 280 rather
-         than 0 to indicate success.
+         than -1 upon failure.
          FIXME: remove in 2010 or whenever the offending kernels
          are no longer in common use.  */
       if (0 < result)
-        result = 0;
-#endif
+        errno = ENOSYS;
+# endif
 
       if (result == 0 || errno != ENOSYS)
         return result;
@@ -122,6 +122,11 @@
 #if HAVE_FUTIMENS
   {
     int result = futimens (fd, timespec);
+# ifdef __linux__
+    /* Work around the same bug as above.  */
+    if (0 < result)
+      errno = ENOSYS;
+# endif
     if (result == 0 || errno != ENOSYS)
       return result;
   }