From 6eef5cdc945a963fcd36adbda61bda498db1a597 Mon Sep 17 00:00:00 2001 From: shuppy Date: Wed, 7 Jan 2026 01:33:03 +0800 Subject: [PATCH] ZTS: add regression test for #17180 In #17180, we fixed an interesting bug that i believe i hit in one of my pools, but as far as i can tell, there was no test for it. this patch adds a regression test for #17180, minimised from my attempts to reproduce the bug in a way that resembled the history of my pool. Reviewed-by: Alexander Motin Reviewed-by: Brian Behlendorf Reviewed-by: Adam Moss Signed-off-by: delan azabani Closes #18109 --- tests/runfiles/common.run | 3 +- tests/zfs-tests/tests/Makefile.am | 1 + .../block_cloning_after_device_removal.ksh | 61 +++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100755 tests/zfs-tests/tests/functional/block_cloning/block_cloning_after_device_removal.ksh diff --git a/tests/runfiles/common.run b/tests/runfiles/common.run index d0b35933c..90b8c0a31 100644 --- a/tests/runfiles/common.run +++ b/tests/runfiles/common.run @@ -82,7 +82,8 @@ tests = ['block_cloning_clone_mmap_cached', '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_rlimit_fsize', 'block_cloning_large_offset'] + 'block_cloning_rlimit_fsize', 'block_cloning_large_offset', + 'block_cloning_after_device_removal'] tags = ['functional', 'block_cloning'] [tests/functional/bootfs] diff --git a/tests/zfs-tests/tests/Makefile.am b/tests/zfs-tests/tests/Makefile.am index 5c486754d..ba1c9c4ee 100644 --- a/tests/zfs-tests/tests/Makefile.am +++ b/tests/zfs-tests/tests/Makefile.am @@ -491,6 +491,7 @@ nobase_dist_datadir_zfs_tests_tests_SCRIPTS += \ functional/block_cloning/block_cloning_lwb_buffer_overflow.ksh \ functional/block_cloning/block_cloning_rlimit_fsize.ksh \ functional/block_cloning/block_cloning_large_offset.ksh \ + functional/block_cloning/block_cloning_after_device_removal.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_after_device_removal.ksh b/tests/zfs-tests/tests/functional/block_cloning/block_cloning_after_device_removal.ksh new file mode 100755 index 000000000..b407d4c54 --- /dev/null +++ b/tests/zfs-tests/tests/functional/block_cloning/block_cloning_after_device_removal.ksh @@ -0,0 +1,61 @@ +#!/bin/ksh -p +# SPDX-License-Identifier: CDDL-1.0 +# +# 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: +# Verify that when modifying and freeing cloned blocks after a top-level +# vdev removal, there is no panic. This is a regression test for #17180. +# + +verify_runnable "global" + +export VDIR=$TEST_BASE_DIR/disk-bclone +export VDEV="$VDIR/0 $VDIR/1" +log_must rm -rf $VDIR +log_must mkdir -p $VDIR +log_must truncate -s $MINVDEVSIZE $VDEV + +claim="No panic when destroying dataset with cloned blocks after top-level vdev removal" + +log_assert $claim + +function cleanup +{ + datasetexists $TESTPOOL && destroy_pool $TESTPOOL + rm -rf $TESTDIR $VDIR +} + +log_onexit cleanup + +log_must zpool create -o feature@block_cloning=enabled $TESTPOOL $VDEV +log_must dd if=/dev/urandom of=/$TESTPOOL/file bs=16M count=2 +log_must zpool remove -w $TESTPOOL $VDIR/1 +log_must zfs create $TESTPOOL/$TESTFS +log_must clonefile -f /$TESTPOOL/file /$TESTPOOL/$TESTFS/file +log_must dd if=/dev/urandom of=/$TESTPOOL/file bs=16M count=2 +log_must zfs destroy -r $TESTPOOL/$TESTFS + +log_pass $claim