mtime=$(stat --format %Y a) || fail=1
ctime=$(stat --format %Z a) || fail=1
-case $(stat --format %x a) in
- *.000000000*) sleep 2;; # worst case file system is FAT
- *) sleep .02;; # should be adequate for any system with subsecond resolution
-esac
-
-touch a || fail=1
-test "x$btime" = x$(stat --format %W a) || fail=1
-test "x$atime" != x$(stat --format %X a) || fail=1
-test "x$mtime" != x$(stat --format %Y a) || fail=1
-test "x$ctime" != x$(stat --format %Z a) || fail=1
+# Wait up to 2.17s for timestamps to change.
+# ----------------------------------------
+# iterations file system resolution e.g.
+# ----------------------------------------
+# 1 nano or micro second ext4
+# 4 1 second ext3
+# 5 2 second FAT
+# ----------------------------------------
+check_timestamps_updated()
+{
+ local delay="$1"
+ sleep $delay
+ touch a || fail=1
+
+ test "x$btime" = x$(stat --format %W a) &&
+ test "x$atime" != x$(stat --format %X a) &&
+ test "x$mtime" != x$(stat --format %Y a) &&
+ test "x$ctime" != x$(stat --format %Z a)
+}
+retry_delay_ check_timestamps_updated .07 5 || fail=1
Exit $fail