Re: [PATCH] btrfs: add test case for NODATASUM dev-replace

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Thu, Feb 23, 2023 at 01:10:49PM +0800, Qu Wenruo wrote:
> During my development on dev-replace, I made a mistake in RAID56
> dev-replace code where it can lead to NODATASUM corruption.
> Thankfully such corruption didn't reach upstream.
> 
> Inspired by such incident, here comes a new test case for btrfs
> dev-replace, the new case would:
> 
> - Populate the filesystem with nodatasum mount option
> 
> - Run fssum to record the contents
>   Since the test case only cares about data contents, here we don't
>   include metadata like uid/gid/timestamp.
> 
> - Wipe one device
> 
> - Mount the fs with the missing device
> 
> - Verify the contents is still correct
> 
> - Replace the missing device
> 
> - Verify the contents is still correct again
>   Before the verification, drop all cache to make sure the 2nd
>   verification is reading from the disks.
> 
> For current kernels, the test case should pass as expected.
> 
> Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
> ---

There's not review points from btrfs list, and this case looks good to me,
and I didn't find any problems on this case by a simple test [1]. So I'd
like to merge this btrfs specific case directly.

Reviewed-by: Zorro Lang <zlang@xxxxxxxxxx>

[1]
# ./check -s pooldev btrfs/286
SECTION       -- pooldev
FSTYP         -- btrfs
PLATFORM      -- Linux/x86_64 hp-dl380pg8-01 6.2.0-rc8-mainline+ #6 SMP PREEMPT_DYNAMIC Wed Feb 15 14:16:45 CST 2023
MKFS_OPTIONS  -- /dev/mapper/testvg-scratchdev1
MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/mapper/testvg-scratchdev1 /mnt/scratch

btrfs/286        41s
Ran: btrfs/286
Passed all 1 tests

SECTION       -- pooldev
=========================
Ran: btrfs/286
Passed all 1 tests

>  tests/btrfs/286     | 78 +++++++++++++++++++++++++++++++++++++++++++++
>  tests/btrfs/286.out |  2 ++
>  2 files changed, 80 insertions(+)
>  create mode 100755 tests/btrfs/286
>  create mode 100644 tests/btrfs/286.out
> 
> diff --git a/tests/btrfs/286 b/tests/btrfs/286
> new file mode 100755
> index 00000000..fb805256
> --- /dev/null
> +++ b/tests/btrfs/286
> @@ -0,0 +1,78 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (C) 2023 SUSE Linux Products GmbH. All Rights Reserved.
> +#
> +# FS QA Test 286
> +#
> +# Make sure btrfs dev-replace on missing device won't cause data corruption
> +# for NODATASUM data.
> +#
> +. ./common/preamble
> +_begin_fstest auto replace
> +
> +# Import common functions.
> +. ./common/filter
> +
> +# real QA test starts here
> +
> +# Modify as appropriate.
> +_supported_fs btrfs
> +_require_command "$WIPEFS_PROG" wipefs
> +_btrfs_get_profile_configs replace-missing
> +_require_fssum
> +_require_scratch_dev_pool 5
> +_scratch_dev_pool_get 4
> +_spare_dev_get
> +
> +workload()
> +{
> +	local profile=$1
> +	local victim="$(echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}')"
> +
> +	echo "=== Profile: $profile ===" >> $seqres.full
> +	rm -f $tmp.fssum
> +	_scratch_pool_mkfs "$profile" >> $seqres.full 2>&1
> +
> +	# Use nodatasum mount option, so all data won't have checksum.
> +	_scratch_mount -o nodatasum
> +
> +	$FSSTRESS_PROG -p 10 -n 200 -d $SCRATCH_MNT > /dev/null 2>&1
> +	sync
> +
> +	# Generate fssum for later verification, here we only care
> +	# about the file contents, thus we don't bother metadata at all.
> +	$FSSUM_PROG -n -d -f -w $tmp.fssum $SCRATCH_MNT
> +	_scratch_unmount
> +
> +	# Wipe devid 2
> +	$WIPEFS_PROG -a $victim >> $seqres.full 2>&1
> +
> +	# Mount the fs with the victim device missing
> +	_scratch_mount -o degraded,nodatasum
> +
> +	# Verify no data corruption first.
> +	echo "=== Verify the contents before replace ===" >> $seqres.full
> +	$FSSUM_PROG -r $tmp.fssum $SCRATCH_MNT >> $seqres.full 2>&1
> +
> +	# Replace the missing device
> +	$BTRFS_UTIL_PROG replace start -Bf 2 $SPARE_DEV $SCRATCH_MNT >> $seqres.full
> +
> +	# Drop all cache to make sure later read are all from the disks
> +	echo 3 > /proc/sys/vm/drop_caches
> +
> +	# Re-check the file contents
> +	echo "=== Verify the contents after replace ===" >> $seqres.full
> +	$FSSUM_PROG -r $tmp.fssum $SCRATCH_MNT >> $seqres.full 2>&1
> +
> +	_scratch_unmount
> +}
> +
> +for t in "${_btrfs_profile_configs[@]}"; do
> +	workload "$t"
> +done
> +
> +echo "Silence is golden"
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/btrfs/286.out b/tests/btrfs/286.out
> new file mode 100644
> index 00000000..35c48006
> --- /dev/null
> +++ b/tests/btrfs/286.out
> @@ -0,0 +1,2 @@
> +QA output created by 286
> +Silence is golden
> -- 
> 2.39.0
> 




[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux