Re: [PATCH v3 2/2] btrfs/291: fix state transition logic and add size requirement

Disha Goel <[email protected]>
Newsgroups org.kernel.vger.fstests,org.kernel.vger.linux-btrfs
Message-ID <[email protected]>
On 11/05/26 8:50 pm, Zorro Lang wrote:
> On Fri, May 08, 2026 at 08:17:01PM +0530, Disha Goel wrote:
>> This patch fixes two issues in btrfs/291:
>>
>> 1. Add dynamic LOGWRITES_DEV size requirement based on SCRATCH_DEV
>>     The test creates LVM snapshots at each FUA point during replay,
>>     requiring significant space. Calculate the required size as 120%
>>     of SCRATCH_DEV size (adding 20% overhead for LVM snapshots and
>>     metadata) to ensure the test works regardless of SCRATCH_DEV size.
>>
>> 2. Fix state transition logic for verity enablement
>>     The original test assumed orphan items would always be created
>>     during verity enablement (state 0->1 transition). However, in
>>     some cases verity completes without creating orphan items,
>>     causing the test to fail with "expected to reach verity done state".
>>
>>     Fix by transitioning to state 1 when either orphan items exist
>>     OR merkle items appear, handling both verity enablement paths.
>>     Also improve state 1 validation to only check for cleared merkle
>>     items when measurement actually fails.
>>
>> The test now correctly handles verity enablement with or without
>> orphan items while maintaining crash consistency validation, and
>> works with any SCRATCH_DEV size.
>>
>> Suggested-by: Anand Jain <[email protected]>
>> Signed-off-by: Disha Goel <[email protected]>
>> ---
>> v2 -> v3:
>> - Calculate LOGWRITES_DEV size requirement dynamically based on SCRATCH_DEV
>>    size (120% of SCRATCH_DEV) instead of fixed 9GB
>> - This fixes test failures when SCRATCH_DEV > 9GB, as reported by Anand
>>
>>   tests/btrfs/291 | 19 ++++++++++++++-----
>>   1 file changed, 14 insertions(+), 5 deletions(-)
>>
>> diff --git a/tests/btrfs/291 b/tests/btrfs/291
>> index 122aeaa5..e5ea4b50 100755
>> --- a/tests/btrfs/291
>> +++ b/tests/btrfs/291
>> @@ -36,7 +36,9 @@ _cleanup()
>>   _require_scratch
>>   _require_test
>>   _require_loop
>> -_require_log_writes
>> +scratch_size=$(_get_device_size $SCRATCH_DEV)
>> +required_log_size=$((scratch_size * 120 / 100))
>> +_require_log_writes_sized $required_log_size
> 
> OK, more 20% space makes sense.
> 
>>   _require_dm_target snapshot
>>   _require_command $LVM_PROG lvm
>>   _require_scratch_verity
>> @@ -129,9 +131,14 @@ do
>>   	_udev_wait /dev/mapper/$vgname-$snapname
>>   
>>   	orphan=$(count_item $snap_dev ORPHAN)
>> -	[ $state -eq 0 ] && [ $orphan -gt 0 ] && state=1
>> -
>>   	pre_mount=$(count_merkle_items $snap_dev)
>> +
>> +	if [ $state -eq 0 ]; then
>> +		if [ $orphan -gt 0 ] || [ $pre_mount -gt 0 ]; then
> 
> Hm, this's this exception you metioned in commit log, so if we find
> merkle items, no matter where's it from, we need to deal with them
> later, so set state to 1.
> 
>> +			state=1
>> +		fi
>> +	fi
>> +
>>   	_mount $snap_dev $SCRATCH_MNT || _fail "mount failed at entry $cur"
>>   	fsverity measure $SCRATCH_MNT/fsv >>$seqres.full 2>&1
>>   	measured=$?
>> @@ -143,8 +150,10 @@ do
>>   	echo "entry: $cur, state: $state, orphan: $orphan, pre_mount: $pre_mount, post_mount: $post_mount" >> $seqres.full
>>   
>>   	if [ $state -eq 1 ]; then
>> -		[ $post_mount -eq 0 ] || \
>> -			_fail "mount failed to clear under-construction merkle items pre: $pre_mount, post: $post_mount at entry $cur";
>> +		if [ $measured -ne 0 ]; then
>> +			[ $post_mount -eq 0 ] || \
> 
> OK, fix same situation you metioned.
> 
>  From the code logic, this change is good to me.
> 
> Reviewed-by: Zorro Lang <[email protected]>
> 
> I just have one more question, this case is written in 2021, now it's 2026. It
> still fails on latest test with kernel 7.1.0-0.rc2 and btrfs-progs-6.19.1-1.fc45,
> no matter with or without this patch.
> 
> Is that expected by btrfs? Is there a known kernel commit uncovered by this case?
> 

Hi Zorro,

Thank you for reviewing and accepting the patch!

Regarding the test failure on your setup - I can confirm the test passes
cleanly on my environment with both 4K and 64K block sizes:

SECTION       -- btrfs_4k
RECREATING    -- btrfs on /dev/loop0
FSTYP         -- btrfs
PLATFORM      -- Linux/ppc64le localhost 7.1.0-rc4-00100-g8bc67e4db64a 
#6 SMP PREEMPT Thu May 21 09:02:51 CEST 2026
MKFS_OPTIONS  -- -f -s 4096 /dev/loop1
MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/loop1 
/mnt/scratch

btrfs/291    2s ...  2s
Ran: btrfs/291
Passed all 1 tests

My test environment:
Kernel: 7.1.0-rc4
btrfs-progs: v7.0
Architecture: powerpc/ppc64le

> Thanks,
> Zorro
> 
> # ./check btrfs/291
> FSTYP         -- btrfs
> PLATFORM      -- Linux/x86_64 localhost 7.1.0-0.rc2.260505ga293ec25d59dd.17.fc45.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May  5 17:39:29 UTC 2026
> MKFS_OPTIONS  -- /dev/vdd
> MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/vdd /mnt/scratch
> 
> btrfs/291          _check_btrfs_filesystem: filesystem on /dev/vdd is inconsistent
> (see /root/xfstests/results//btrfs/291.full for details)
> 
> Ran: btrfs/291
> Failures: btrfs/291
> Failed 1 of 1 tests
> 
> Thanks,
> Zorro
> 
>> +				_fail "mount failed to clear under-construction merkle items pre: $pre_mount, post: $post_mount at entry $cur";
>> +		fi
>>   	fi
>>   	if [ $state -eq 2 ]; then
>>   		[ $pre_mount -gt 0 ] || \
>> -- 
>> 2.45.1
>>

-- 
Regards,
Disha
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.