[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] utimens.c: correct yesterday's kernel bug work-around
From: |
Jim Meyering |
Subject: |
[PATCH] utimens.c: correct yesterday's kernel bug work-around |
Date: |
Fri, 06 Jun 2008 18:26:07 +0200 |
Hi Ondřej,
Based on your description, I wrote the following.
Does it solve the problem?
>From 51aca03ab224ad1bf0a5c432403a0131001cda36 Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Fri, 6 Jun 2008 18:20:14 +0200
Subject: [PATCH] utimens.c: correct yesterday's kernel bug work-around
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
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.
Signed-off-by: Jim Meyering <address@hidden>
---
lib/utimens.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/lib/utimens.c b/lib/utimens.c
index d80445c..708de10 100644
--- a/lib/utimens.c
+++ b/lib/utimens.c
@@ -103,17 +103,17 @@ gl_futimens (int fd ATTRIBUTE_UNUSED,
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 @@ gl_futimens (int fd ATTRIBUTE_UNUSED,
#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;
}
--
1.5.6.rc1.14.gc64191
- [PATCH] utimens.c: correct yesterday's kernel bug work-around,
Jim Meyering <=