From 0ccd4b9d01f74dab6261291d8a18f6ba7ff5799e Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Mon, 5 Aug 2024 15:57:44 +0000 Subject: [PATCH] ZTS: Add a test to verify that copy_file_range obeys RLIMIT_FSIZE Signed-off-by: Mark Johnston Reviewed-by: Alexander Motin Reviewed-by: Allan Jude Reviewed-by: Tino Reichardt Reviewed-by: Tony Hutter --- tests/runfiles/common.run | 3 +- tests/test-runner/bin/zts-report.py.in | 2 + tests/zfs-tests/tests/Makefile.am | 1 + .../block_cloning_rlimit_fsize.ksh | 64 +++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100755 tests/zfs-tests/tests/functional/block_cloning/block_cloning_rlimit_fsize.ksh diff --git a/tests/runfiles/common.run b/tests/runfiles/common.run index 81ebb6a10c..326eb2a44d 100644 --- a/tests/runfiles/common.run +++ b/tests/runfiles/common.run @@ -81,7 +81,8 @@ tests = ['block_cloning_clone_mmap_cached', 'block_cloning_cross_enc_dataset', 'block_cloning_copyfilerange_fallback_same_txg', 'block_cloning_replay', 'block_cloning_replay_encrypted', - 'block_cloning_lwb_buffer_overflow', 'block_cloning_clone_mmap_write'] + 'block_cloning_lwb_buffer_overflow', 'block_cloning_clone_mmap_write', + 'block_cloning_rlimit_fsize'] tags = ['functional', 'block_cloning'] [tests/functional/bootfs] diff --git a/tests/test-runner/bin/zts-report.py.in b/tests/test-runner/bin/zts-report.py.in index aefbbb7700..1177e80e1a 100755 --- a/tests/test-runner/bin/zts-report.py.in +++ b/tests/test-runner/bin/zts-report.py.in @@ -331,6 +331,8 @@ elif sys.platform.startswith('linux'): ['SKIP', cfr_reason], 'block_cloning/block_cloning_replay_encrypted': ['SKIP', cfr_reason], + 'block_cloning/block_cloning_rlimit_fsize': + ['SKIP', cfr_reason], 'cli_root/zfs_rename/zfs_rename_002_pos': ['FAIL', known_reason], 'cli_root/zpool_reopen/zpool_reopen_003_pos': ['FAIL', known_reason], 'cp_files/cp_files_002_pos': ['SKIP', cfr_reason], diff --git a/tests/zfs-tests/tests/Makefile.am b/tests/zfs-tests/tests/Makefile.am index 8fecb6459f..9dcb097e2b 100644 --- a/tests/zfs-tests/tests/Makefile.am +++ b/tests/zfs-tests/tests/Makefile.am @@ -478,6 +478,7 @@ nobase_dist_datadir_zfs_tests_tests_SCRIPTS += \ functional/block_cloning/block_cloning_replay.ksh \ functional/block_cloning/block_cloning_replay_encrypted.ksh \ functional/block_cloning/block_cloning_lwb_buffer_overflow.ksh \ + functional/block_cloning/block_cloning_rlimit_fsize.ksh \ functional/bootfs/bootfs_001_pos.ksh \ functional/bootfs/bootfs_002_neg.ksh \ functional/bootfs/bootfs_003_pos.ksh \ diff --git a/tests/zfs-tests/tests/functional/block_cloning/block_cloning_rlimit_fsize.ksh b/tests/zfs-tests/tests/functional/block_cloning/block_cloning_rlimit_fsize.ksh new file mode 100755 index 0000000000..a8a64e5249 --- /dev/null +++ b/tests/zfs-tests/tests/functional/block_cloning/block_cloning_rlimit_fsize.ksh @@ -0,0 +1,64 @@ +#!/bin/ksh -p +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or https://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/block_cloning/block_cloning.kshlib + +# +# DESCRIPTION: +# When block cloning is used to implement copy_file_range(2), the +# RLIMIT_FSIZE limit must be respected. +# +# STRATEGY: +# 1. Create a pool. +# 2. ??? +# + +verify_runnable "global" + +VDIR=$TEST_BASE_DIR/disk-bclone +VDEV="$VDIR/a" + +function cleanup +{ + datasetexists $TESTPOOL && destroy_pool $TESTPOOL + rm -rf $VDIR +} + +log_onexit cleanup + +log_assert "Test for RLIMIT_FSIZE handling with block cloning enabled" + +log_must rm -rf $VDIR +log_must mkdir -p $VDIR +log_must truncate -s 1G $VDEV + +log_must zpool create -o feature@block_cloning=enabled $TESTPOOL $VDEV + +log_must dd if=/dev/random of=/$TESTPOOL/file1 bs=1 count=1000 + +ulimit -f 2 +log_must clonefile -f /$TESTPOOL/file1 /$TESTPOOL/file2 0 0 all +ulimit -f 1 +log_mustnot clonefile -f /$TESTPOOL/file1 /$TESTPOOL/file3 0 0 all + +log_pass "copy_file_range(2) respects RLIMIT_FSIZE"