aboutsummaryrefslogtreecommitdiffstats
path: root/tests/zfs-tests/include/math.shlib
diff options
context:
space:
mode:
authorLOLi <[email protected]>2017-11-13 18:24:26 +0100
committerBrian Behlendorf <[email protected]>2017-11-13 09:24:26 -0800
commit99834d1950f654d08585b61a1b0b4458d3d9e100 (patch)
tree0469f2f351adefb974c5202c54a7bdc03d5e0e13 /tests/zfs-tests/include/math.shlib
parent13042a6ccdf3450a758511c4b64e800a371bb891 (diff)
Fix truncate(2) mtime and ctime handling
On Linux, ftruncate(2) always changes the file timestamps, even if the file size is not changed. However, in case of a successfull truncate(2), the timestamps are updated only if the file size changes. This translates to the VFS calling the ZFS Posix Layer "setattr" function (zpl_setattr) with ATTR_MTIME and ATTR_CTIME unconditionally set on the iattr mask only when doing a ftruncate(2), while the truncate(2) is left to the filesystem implementation to be dealt with. This behaviour is consistent with POSIX:2004/SUSv3 specifications where there's no explicit requirement for file size changes to update the timestamps only for ftruncate(2): http://pubs.opengroup.org/onlinepubs/009695399/functions/truncate.html http://pubs.opengroup.org/onlinepubs/009695399/functions/ftruncate.html This has been later updated in POSIX:2008/SUSv4 where, for both truncate(2)/ftruncate(2), there's no mention of this size change requirement: http://austingroupbugs.net/view.php?id=489 http://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html http://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html Unfortunately the Linux VFS is still calling into the ZPL without ATTR_MTIME/ATTR_CTIME set in the truncate(2) case: we fix this by explicitly updating the timestamps when detecting the ATTR_SIZE bit, which is always set in do_truncate(), on the iattr mask. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: loli10K <[email protected]> Closes #6811 Closes #6819
Diffstat (limited to 'tests/zfs-tests/include/math.shlib')
-rw-r--r--tests/zfs-tests/include/math.shlib30
1 files changed, 30 insertions, 0 deletions
diff --git a/tests/zfs-tests/include/math.shlib b/tests/zfs-tests/include/math.shlib
index 4ed11fb4b..66658cdda 100644
--- a/tests/zfs-tests/include/math.shlib
+++ b/tests/zfs-tests/include/math.shlib
@@ -66,3 +66,33 @@ function to_bytes
return 0
}
+
+#
+# Verify $a is equal to $b, otherwise raise an error specifying
+# the $type of values being compared
+#
+function verify_eq # <a> <b> <type>
+{
+ typeset a=$1
+ typeset b=$2
+ typeset type=$3
+
+ if [[ $a -ne $b ]]; then
+ log_fail "Compared $type should be equal: $a != $b"
+ fi
+}
+
+#
+# Verify $a is not equal to $b, otherwise raise an error specifying
+# the $type of values being compared
+#
+function verify_ne # <a> <b> <type>
+{
+ typeset a=$1
+ typeset b=$2
+ typeset type=$3
+
+ if [[ $a -eq $b ]]; then
+ log_fail "Compared $type should be not equal: $a == $b"
+ fi
+}