From b17e7e4ead6ee5982a2c44f26ada09f01df91331 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 4 Jun 2008 19:32:50 +0200 Subject: [PATCH] utimens.c: work around a probable Linux kernel bug * lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT]: Work around what appears to be a kernel bug that causes utimensat to return 280 instead of 0, indicating success. --- ChangeLog | 8 ++++++++ lib/utimens.c | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/ChangeLog b/ChangeLog index 6c165cd11..c3f7d4131 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-06-05 Jim Meyering + Paul Eggert + + utimens.c: work around a probable Linux kernel bug + * lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT]: Work around what + appears to be a kernel bug that causes utimensat to return 280 + instead of 0, indicating success. + 2008-06-04 Bruno Haible * lib/copy-acl.c (qcopy_acl): Call qset_acl, not set_acl. Fixes diff --git a/lib/utimens.c b/lib/utimens.c index 134310b1c..d80445cbc 100644 --- a/lib/utimens.c +++ b/lib/utimens.c @@ -103,6 +103,18 @@ gl_futimens (int fd ATTRIBUTE_UNUSED, if (fd < 0) { int result = utimensat (AT_FDCWD, file, timespec, 0); +#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. + FIXME: remove in 2010 or whenever the offending kernels + are no longer in common use. */ + if (0 < result) + result = 0; +#endif + if (result == 0 || errno != ENOSYS) return result; } -- 2.11.0