ZTS: Enable punch-hole tests on FreeBSD

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Ka Ho Ng <khng@FreeBSD.org>
Sponsored-by: The FreeBSD Foundation
Closes #12458
This commit is contained in:
Ka Ho Ng 2021-08-22 23:22:07 +08:00 committed by Tony Hutter
parent 74bba85423
commit ed064ed596
5 changed files with 53 additions and 8 deletions

View File

@ -603,6 +603,10 @@ tags = ['functional', 'delegate']
tests = ['exec_001_pos', 'exec_002_neg'] tests = ['exec_001_pos', 'exec_002_neg']
tags = ['functional', 'exec'] tags = ['functional', 'exec']
[tests/functional/fallocate]
tests = ['fallocate_punch-hole']
tags = ['functional', 'fallocate']
[tests/functional/features/async_destroy] [tests/functional/features/async_destroy]
tests = ['async_destroy_001_pos'] tests = ['async_destroy_001_pos']
tags = ['functional', 'features', 'async_destroy'] tags = ['functional', 'features', 'async_destroy']

View File

@ -94,7 +94,7 @@ tests = ['events_001_pos', 'events_002_pos', 'zed_rc_filter', 'zed_fd_spill']
tags = ['functional', 'events'] tags = ['functional', 'events']
[tests/functional/fallocate:Linux] [tests/functional/fallocate:Linux]
tests = ['fallocate_prealloc', 'fallocate_punch-hole'] tests = ['fallocate_prealloc']
tags = ['functional', 'fallocate'] tags = ['functional', 'fallocate']
[tests/functional/fault:Linux] [tests/functional/fault:Linux]

View File

@ -127,6 +127,13 @@ fio_reason = 'Fio v2.3 or newer required'
# #
trim_reason = 'DISKS must support discard (TRIM/UNMAP)' trim_reason = 'DISKS must support discard (TRIM/UNMAP)'
#
# Some tests on FreeBSD require the fspacectl(2) system call and the
# truncate(1) utility supporting the -d option. The system call was first
# introduced in FreeBSD version 1400032.
#
fspacectl_reason = 'fspacectl(2) and truncate -d support required'
# #
# Some tests are not applicable to a platform or need to be updated to operate # Some tests are not applicable to a platform or need to be updated to operate
# in the manor required by the platform. Any tests which are skipped for this # in the manor required by the platform. Any tests which are skipped for this
@ -225,6 +232,7 @@ maybe = {
'cli_root/zpool_trim/setup': ['SKIP', trim_reason], 'cli_root/zpool_trim/setup': ['SKIP', trim_reason],
'cli_root/zpool_upgrade/zpool_upgrade_004_pos': ['FAIL', '6141'], 'cli_root/zpool_upgrade/zpool_upgrade_004_pos': ['FAIL', '6141'],
'delegate/setup': ['SKIP', exec_reason], 'delegate/setup': ['SKIP', exec_reason],
'fallocate/fallocate_punch-hole': ['SKIP', fspacectl_reason],
'history/history_004_pos': ['FAIL', '7026'], 'history/history_004_pos': ['FAIL', '7026'],
'history/history_005_neg': ['FAIL', '6680'], 'history/history_005_neg': ['FAIL', '6680'],
'history/history_006_neg': ['FAIL', '5657'], 'history/history_006_neg': ['FAIL', '5657'],

View File

@ -27,6 +27,7 @@
# Copyright (c) 2017, Lawrence Livermore National Security LLC. # Copyright (c) 2017, Lawrence Livermore National Security LLC.
# Copyright (c) 2017, Datto Inc. All rights reserved. # Copyright (c) 2017, Datto Inc. All rights reserved.
# Copyright (c) 2017, Open-E Inc. All rights reserved. # Copyright (c) 2017, Open-E Inc. All rights reserved.
# Copyright (c) 2021, The FreeBSD Foundation.
# Use is subject to license terms. # Use is subject to license terms.
# #
@ -4218,6 +4219,25 @@ function get_arcstat # stat
esac esac
} }
function punch_hole # offset length file
{
typeset offset=$1
typeset length=$2
typeset file=$3
case $(uname) in
FreeBSD)
truncate -d -o $offset -l $length "$file"
;;
Linux)
fallocate --punch-hole --offset $offset --length $length "$file"
;;
*)
false
;;
esac
}
# #
# Wait for the specified arcstat to reach non-zero quiescence. # Wait for the specified arcstat to reach non-zero quiescence.
# If echo is 1 echo the value after reaching quiescence, otherwise # If echo is 1 echo the value after reaching quiescence, otherwise

View File

@ -22,13 +22,14 @@
# #
# Copyright (c) 2020 by Lawrence Livermore National Security, LLC. # Copyright (c) 2020 by Lawrence Livermore National Security, LLC.
# Copyright (c) 2021 by The FreeBSD Foundation.
# #
. $STF_SUITE/include/libtest.shlib . $STF_SUITE/include/libtest.shlib
# #
# DESCRIPTION: # DESCRIPTION:
# Test `fallocate --punch-hole` # Test hole-punching functionality
# #
# STRATEGY: # STRATEGY:
# 1. Create a dense file # 1. Create a dense file
@ -37,6 +38,20 @@
verify_runnable "global" verify_runnable "global"
#
# Prior to __FreeBSD_version 1400032 there are no mechanism to punch hole in a
# file on FreeBSD. truncate -d support is required to call fspacectl(2) on
# behalf of the script.
#
if is_freebsd; then
if [[ $(uname -K) -lt 1400032 ]]; then
log_unsupported "Requires fspacectl(2) support on FreeBSD"
fi
if truncate -d 2>&1 | grep "illegal option" > /dev/null; then
log_unsupported "Requires truncate(1) -d support on FreeBSD"
fi
fi
FILE=$TESTDIR/$TESTFILE0 FILE=$TESTDIR/$TESTFILE0
BLKSZ=$(get_prop recordsize $TESTPOOL) BLKSZ=$(get_prop recordsize $TESTPOOL)
@ -74,23 +89,21 @@ log_must file_write -o create -f $FILE -b $BLKSZ -c 8
log_must check_disk_size $((131072 * 8)) log_must check_disk_size $((131072 * 8))
# Punch a hole for the first full block. # Punch a hole for the first full block.
log_must fallocate --punch-hole --offset 0 --length $BLKSZ $FILE log_must punch_hole 0 $BLKSZ $FILE
log_must check_disk_size $((131072 * 7)) log_must check_disk_size $((131072 * 7))
# Partially punch a hole in the second block. # Partially punch a hole in the second block.
log_must fallocate --punch-hole --offset $BLKSZ --length $((BLKSZ / 2)) $FILE log_must punch_hole $BLKSZ $((BLKSZ / 2)) $FILE
log_must check_disk_size $((131072 * 7)) log_must check_disk_size $((131072 * 7))
# Punch a hole which overlaps the third and forth block. # Punch a hole which overlaps the third and forth block.
log_must fallocate --punch-hole --offset $(((BLKSZ * 2) + (BLKSZ / 2))) \ log_must punch_hole $(((BLKSZ * 2) + (BLKSZ / 2))) $((BLKSZ)) $FILE
--length $((BLKSZ)) $FILE
log_must check_disk_size $((131072 * 7)) log_must check_disk_size $((131072 * 7))
# Punch a hole from the fifth block past the end of file. The apparent # Punch a hole from the fifth block past the end of file. The apparent
# file size should not change since --keep-size is implied. # file size should not change since --keep-size is implied.
apparent_size=$(stat_size $FILE) apparent_size=$(stat_size $FILE)
log_must fallocate --punch-hole --offset $((BLKSZ * 4)) \ log_must punch_hole $((BLKSZ * 4)) $((BLKSZ * 10)) $FILE
--length $((BLKSZ * 10)) $FILE
log_must check_disk_size $((131072 * 4)) log_must check_disk_size $((131072 * 4))
log_must check_apparent_size $apparent_size log_must check_apparent_size $apparent_size