Ronan MELENNEC <[EMAIL PROTECTED]> writes: > --- gzip-1.3.6/lib/utimens.c.orig 2006-09-14 00:38:14.000000000 +0200 > +++ gzip-1.3.6/lib/utimens.c 2006-12-05 10:25:35.000000000 +0100 > @@ -93,6 +93,12 @@ > else > t = NULL; > > + /* > + * TO BE REVIEWED (usefulness and portability) > + */ > + if (fd >= 0) > + /* helps work around NFS buffering issues */ > + fsync (fd); > > if (fd < 0) > {
Yes, this should work. But it hurts performance on all hosts, simply to avoid a problem on a few buggy hosts. I installed the following change instead, into gnulib. You should be able to use it by configuring with 'configure CFLAGS='-g -O2 -DHAVE_BUGGY_NFS_TIME_STAMPS', or something like that. I can't see an easy way to autoconfigure it, since an executable might be built on (say) a non-buggy Linux 2.4 host and then executed on a buggy Linux 2.6.19 host. 2006-12-05 Paul Eggert <[EMAIL PROTECTED]> * lib/utimens.c (futimens) [HAVE_BUGGY_NFS_TIME_STAMPS]: Add a workaround for this case. It is not autoconfigured now; offhand it's hard to see how to autoconfigure it. --- lib/utimens.c 13 Sep 2006 22:38:14 -0000 1.11 +++ lib/utimens.c 5 Dec 2006 18:13:50 -0000 1.13 @@ -76,6 +76,23 @@ int futimens (int fd ATTRIBUTE_UNUSED, char const *file, struct timespec const timespec[2]) { + /* Some Linux-based NFS clients are buggy, and mishandle time stamps + of files in NFS file systems in some cases. We have no + configure-time test for this, but please see + <http://bugs.gentoo.org/show_bug.cgi?id=132673> for references to + some of the problems with Linux 2.6.16. If this affects you, + compile with -DHAVE_BUGGY_NFS_TIME_STAMPS; this is reported to + help in some cases, albeit at a cost in performance. But you + really should upgrade your kernel to a fixed version, since the + problem affects many applications. */ + +#if HAVE_BUGGY_NFS_TIME_STAMPS + if (fd < 0) + sync (); + else + fsync (fd); +#endif + /* There's currently no interface to set file timestamps with nanosecond resolution, so do the best we can, discarding any fractional part of the timestamp. */