diff options
author | LOLi <[email protected]> | 2017-11-13 18:24:26 +0100 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-11-13 09:24:26 -0800 |
commit | 99834d1950f654d08585b61a1b0b4458d3d9e100 (patch) | |
tree | 0469f2f351adefb974c5202c54a7bdc03d5e0e13 /tests/zfs-tests/include/math.shlib | |
parent | 13042a6ccdf3450a758511c4b64e800a371bb891 (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.shlib | 30 |
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 +} |