FS/XFS testing framework
 help / color / mirror / Atom feed
From: Zorro Lang <zlang@kernel.org>
To: Chao Yu <chao@kernel.org>
Cc: fstests@vger.kernel.org, jaegeuk@kernel.org,
	 linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [PATCH] f2fs/025: test to do sanity check section type correctly in f2fs GC
Date: Tue, 16 Jun 2026 04:05:00 +0800	[thread overview]
Message-ID: <ajBZEtrLmRZt0AA1@zlang-mailbox> (raw)
In-Reply-To: <b32998c0-17e3-4b81-a474-4a408aa7fa32@kernel.org>

On Mon, Jun 15, 2026 at 04:22:34PM +0800, Chao Yu wrote:
> On 6/15/26 01:16, Zorro Lang wrote:
> > On Fri, Jun 12, 2026 at 12:58:02AM +0000, Chao Yu wrote:
> >> Without commit 520760b9f915 ("f2fs: optimize representative type determination
> >> in GC"), f2fs GC will report inconsistent segment type in large section issue,
> >> and then it will force to shutdown filesystem.
> >>
> >> [  768.190903] F2FS-fs (loop51): Inconsistent segment (3) type [1, 0] in SIT and SSA
> >>
> >> The reason is f2fs kernel will assume all segment type inside large section is
> >> the same, during GC it loads type from one segment and compare it to other
> >> segments' type, however due to recovery flow, the chosen segment may has zero
> >> valid blocks w/ different segment type, since the segment is invalid(free) one,
> >> it will never be migrated, so that we should not treat such state as abnormal
> >> condition.
> >>
> >> This testcase is created to simulate above condition to see whether f2fs kernel
> >> module can handle it correctly
> >>
> >> Signed-off-by: Chao Yu <chao@kernel.org>
> >> ---
> >> v2:
> >> - clear MKFS_OPTIONS and MOUNT_OPTIONS to guarantee block allocation is as expected.
> > 
> > Hi Chao,
> > 
> > Sorry, I just noticed your reply to my review on the previous patch version.
> > Due to some unexpected shake-ups recently, I’ve been bogged down with setting
> > up and modifying various new system environments, and I accidentally marked
> > some unread emails as read.
> 
> No worries. :)
> 
> > 
> > The patch looks good to me, with just a few picky review points below:
> 
> Thanks Zorro for taking a look.
> 
> > 
> >>  tests/f2fs/025     | 92 ++++++++++++++++++++++++++++++++++++++++++++++
> >>  tests/f2fs/025.out |  2 +
> >>  2 files changed, 94 insertions(+)
> >>  create mode 100644 tests/f2fs/025
> >>  create mode 100644 tests/f2fs/025.out
> >>
> >> diff --git a/tests/f2fs/025 b/tests/f2fs/025
> >> new file mode 100644
> >> index 000000000..397e5439a
> >> --- /dev/null
> >> +++ b/tests/f2fs/025
> >> @@ -0,0 +1,92 @@
> >> +#! /bin/bash
> >> +# SPDX-License-Identifier: GPL-2.0
> >> +# Copyright (c) 2026 Chao Yu <chao@kernel.org>
> >> +#
> >> +# FS QA Test No. f2fs/025
> >> +#
> >> +# Check whether f2fs will encounter cp_error (Inconsistent segment type)
> >> +# when doing sanity check on type of segments inside large section during
> >> +# garbage collection.
> >> +#
> >> +. ./common/preamble
> >> +_begin_fstest auto quick
> >> +
> >> +_fixed_by_kernel_commit 520760b9f915 \
> >> +	"f2fs: optimize representative type determination in GC"
> >> +
> >> +. ./common/filter
> >> +
> >> +_cleanup()
> >> +{
> >> +	cd /
> >> +	rm -r -f $tmp.*
> >> +}
> > 
> > This _cleanup() function is same as default. It can be removed.
> 
> Will remove.
> 
> > 
> >> +
> >> +_require_scratch
> >> +_require_xfs_io_command "pwrite"
> >> +_require_xfs_io_command "truncate"
> >> +_require_command "$F2FS_IO_PROG" f2fs_io
> >> +_require_check_dmesg
> >> +
> >> +# Clear options to avoid interference from external configurations
> >> +export MKFS_OPTIONS=""
> >> +export MOUNT_OPTIONS=""
> >> +
> >> +# Format with 96MB size and 2 segments per section
> >> +_scratch_mkfs_sized $((96 * 1024 * 1024)) "" "-s 2" >> $seqres.full 2>&1
> >> +
> >> +# Mount with mode=lfs
> >> +_scratch_mount -o mode=lfs >> $seqres.full 2>&1
> >                               ^^^^^^^^^^^^^^^^^^^^
> > It's helpless, due to if _scratch_mount fails, it exit() directly.
> 
> Right, will fix.
> 
> > 
> >> +
> >> +# Create files to fill whole filesystem, then segment type will be changed to node type
> >> +for ((i=0;i<5120;i++)) do
> >> +	touch $SCRATCH_MNT/$i >> $seqres.full 2>&1
> >> +done
> >> +sync
> >> +
> >> +# Remove all files to create free(empty) node segments
> >> +rm -f $SCRATCH_MNT/*
> >> +sync
> >> +
> >> +# Allocate free space so that we have chance to reuse free(empty) node segments
> >> +$XFS_IO_PROG -f -c "pwrite -b 4k 0 1928k" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +sync
> >> +
> >> +$XFS_IO_PROG -c "truncate 0" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -d -c "pwrite -b 4k 0 16M" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -c "truncate 0" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -d -c "pwrite -b 4k 0 16M" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -c "truncate 0" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +sync
> >> +
> >> +$XFS_IO_PROG -d -c "pwrite -b 4k 0 8M" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -c "truncate 0" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -d -c "pwrite -b 4k 0 32K" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -c "truncate 0" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +$XFS_IO_PROG -d -c "pwrite -b 4k 0 2M" -c "fsync" $SCRATCH_MNT/file >> $seqres.full 2>&1
> >> +
> >> +# Shutdown the filesystem without checkpoint
> >> +$F2FS_IO_PROG shutdown 2 $SCRATCH_MNT >> $seqres.full 2>&1
> > 
> > I'm wondering if we can have f2fs supporting in common _scratch_shutdown
> > helper :)
> 
> I think we can change f2fs testcase to use _scratch_shutdown because the definition of
> nologflush shutdown interface is the same as xfs':
> 
> /*
>  * should be same as XFS_IOC_GOINGDOWN.
>  * Flags for going down operation used by FS_IOC_GOINGDOWN
>  */
> #define F2FS_IOC_SHUTDOWN	_IOR('X', 125, __u32)	/* Shutdown */
> #define F2FS_GOING_DOWN_NOSYNC		0x2	/* going down */
> 
> #define XFS_IOC_GOINGDOWN	     _IOR ('X', 125, uint32_t)
> #define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH		0x2	/* don't flush log nor data */
> 
> > 
> >> +
> >> +_scratch_unmount >> $seqres.full 2>&1
> >                     ^^^^^^^^^^^^^^^^^^^^
> > 
> > If unmount fails, how about let it output the errors, to break the golden image?
> 
> Yes, it's better.
> 
> > 
> >> +
> >> +_scratch_mount -o mode=lfs >> $seqres.full 2>&1
> >                               ^^^^^^^^^^^^^^^^^^^^
> >                               helpless
> 
> Will fix.
> 
> > 
> >> +
> >> +# Run urgent_gc mode to trigger garbage collection
> >> +dev_name=$(_short_dev $SCRATCH_DEV)
> >> +if [ -f /sys/fs/f2fs/$dev_name/gc_urgent ]; then
> >> +	echo 1 > /sys/fs/f2fs/$dev_name/gc_urgent
> >> +fi
> > 
> > Hmm... what if there's not /sys/fs/f2fs/$dev_name/gc_urgent? Does it
> > affect the test result?
> > 
> > If it does, this's a necessary requirement for this test, we shouldn't
> > ignore it and keep running. Does $F2FS_IO_PROG provide a command to
> > make a force GC? Or we need to check this file and _notrun if it's
> > not existed.
> 
> Ah, right, that's good point!
> 
> We can use "$F2FS_IO_PROG gc_urgent <dev_name> run 5" instead, it will do below commands:

Great, I just hope the *gc_urgent* isn't a new feature which needs something likes:
`_require_f2fs_io gc_urgent` (there's not _require_f2fs_io:)

> 1. echo 1 > /sys/fs/f2fs/$dev_name/gc_urgent
> 2. sleep 5 seconds
> 3. echo 0 > /sys/fs/f2fs/$dev_name/gc_urgent

It also depends on the /sys/fs/f2fs/$dev_name/gc_urgent too. So we have to face
the same question:
  If this file doesn't exist, should this test case _notrun?

Thanks,
Zorro

> 
> > 
> >> +
> >> +# Wait background GC thread to wake up to run and potentially encounter the inconsistency
> >> +sleep 5
> > 
> > Does this sleep try to wait above "echo 1 > /sys/fs/f2fs/$dev_name/gc_urgent"?
> > If so, it makes more sense to move it into the "if-then" logic.
> > 
> >> +
> >> +_scratch_unmount >> $seqres.full 2>&1
> >                     ^^^^^^^^^^^^^^^^^^^^
> > Same as above.
> 
> Will fix.
> 
> > 
> >> +
> >> +# Check whether the dmesg has the warning indicating the bug
> >> +_check_dmesg_for "F2FS-fs \($dev_name\): Inconsistent segment" && \
> >> +	_fail "F2FS-fs ($dev_name): Inconsistent segment type detected in dmesg!"
> >> +
> >> +echo "Silence is golden"
> >> +status=0
> >> +exit
> > 
> > We've replaced "status=0;exit;" with "_exit 0".
> 
> Will fix.
> 
> Thanks,
> 
> > 
> > Thanks,
> > Zorro
> > 
> >> diff --git a/tests/f2fs/025.out b/tests/f2fs/025.out
> >> new file mode 100644
> >> index 000000000..3d70951ef
> >> --- /dev/null
> >> +++ b/tests/f2fs/025.out
> >> @@ -0,0 +1,2 @@
> >> +QA output created by 025
> >> +Silence is golden
> >> -- 
> >> 2.49.0
> >>
> 
> 

  reply	other threads:[~2026-06-15 20:05 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-12  0:58 [PATCH] f2fs/025: test to do sanity check section type correctly in f2fs GC Chao Yu
2026-06-14 17:16 ` Zorro Lang
2026-06-15  8:22   ` Chao Yu
2026-06-15 20:05     ` Zorro Lang [this message]
2026-06-16  3:33       ` Chao Yu
2026-06-16  5:47         ` Zorro Lang
2026-06-16  6:56           ` Chao Yu
  -- strict thread matches above, loose matches on Subject: below --
2026-05-18 10:12 Chao Yu
2026-05-20 12:28 ` Zorro Lang
2026-05-21  0:26   ` Chao Yu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ajBZEtrLmRZt0AA1@zlang-mailbox \
    --to=zlang@kernel.org \
    --cc=chao@kernel.org \
    --cc=fstests@vger.kernel.org \
    --cc=jaegeuk@kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox