test-stat-time: port to buggy NFS clients
authorEric Blake <ebb9@byu.net>
Sat, 10 Oct 2009 03:09:38 +0000 (21:09 -0600)
committerEric Blake <ebb9@byu.net>
Sat, 10 Oct 2009 03:45:24 +0000 (21:45 -0600)
On darwin, the NFS client reports mtime with st_sec==INT_MAX and
st_nsec monotonically increasing per transaction until the next
sync(); but sync() is expensive, so it is easier to just skip
this part of the test if mtime is nowhere near ctime.

* tests/test-stat-time.c (main) [W32]: Reduce ifdefs.
(test_ctime): Also skip test if mtime and ctime are skewed.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
tests/test-stat-time.c

index 61e6168..90c436b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2009-10-09  Eric Blake  <ebb9@byu.net>
 
+       test-stat-time: port to buggy NFS clients
+       * tests/test-stat-time.c (main) [W32]: Reduce ifdefs.
+       (test_ctime): Also skip test if mtime and ctime are skewed.
+
        maint: prefer 'file system' over 'filesystem'
        * doc/posix-functions/fstatat.texi (fstatat): Likewise.
        * doc/posix-functions/lstat.texi (lstat): Likewise.
index 77b99a4..3759024 100644 (file)
@@ -186,10 +186,21 @@ test_mtime (const struct stat *statinfo, struct timespec *modtimes)
     }
 }
 
-#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+/* Skip the ctime tests on native Windows platforms, because their
+   st_ctime is either the same as st_mtime (plus or minus an offset)
+   or set to the file _creation_ time, and is not influenced by rename
+   or chmod.  */
+# define test_ctime ((void) 0)
+#else
 static void
 test_ctime (const struct stat *statinfo)
 {
+  /* On some buggy NFS clients, mtime and ctime are disproportionately
+     skewed from one another.  Skip this test in that case.  */
+  if (statinfo[0].st_mtime != statinfo[0].st_ctime)
+    return;
+
   /* mtime(stamp2) < ctime(renamed) */
   ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime
           || (statinfo[2].st_mtime == statinfo[1].st_ctime
@@ -246,12 +257,7 @@ main ()
   cleanup (0);
   prepare_test (statinfo, modtimes);
   test_mtime (statinfo, modtimes);
-  /* Skip the ctime tests on native Windows platforms, because there st_ctime
-     is either the same as st_mtime (plus or minus an offset) or set to the
-     file _creation_ time, and is not influenced by rename or chmod.  */
-#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
   test_ctime (statinfo);
-#endif
   test_birthtime (statinfo, modtimes, birthtimes);
 
   cleanup (0);