On Wed, Mar 12, 2025 at 03:23:09PM +0800, Chao Yu wrote: > This is a regression test to check whether fsck can handle corrupted > nlinks correctly, it uses inject.f2fs to inject nlinks w/ wrong value, > and expects fsck.f2fs can detect such corruption and do the repair. > > Cc: Jaegeuk Kim <jaeg...@kernel.org> > Signed-off-by: Chao Yu <c...@kernel.org> > --- > v4: > - remove unnecessary "_require_command fsck.f2fs" > - clean up _fixed_by_git_commit line > - fix to clean all tmp files in _cleanup > tests/f2fs/009 | 147 +++++++++++++++++++++++++++++++++++++++++++++ > tests/f2fs/009.out | 2 + > 2 files changed, 149 insertions(+) > create mode 100755 tests/f2fs/009 > create mode 100644 tests/f2fs/009.out > > diff --git a/tests/f2fs/009 b/tests/f2fs/009 > new file mode 100755 > index 00000000..9120d8a5 > --- /dev/null > +++ b/tests/f2fs/009 > @@ -0,0 +1,147 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (c) 2025 Chao Yu. All Rights Reserved. > +# > +# FS QA Test No. f2fs/009 > +# > +# This is a regression test to check whether fsck can handle corrupted > +# nlinks correctly, it uses inject.f2fs to inject nlinks w/ wrong value, > +# and expects fsck.f2fs can detect such corruption and do the repair. > +# > +. ./common/preamble > +_begin_fstest auto quick > + > +if [ ! -x "$(type -P socket)" ]; then > + _notrun "Couldn't find socket" > +fi > + > +_require_scratch > +_require_command "$F2FS_INJECT_PROG" inject.f2fs > + > +_fixed_by_git_commit f2fs-tools 958cd6e \ > + "fsck.f2fs: support to repair corrupted i_links" > + > +filename=$SCRATCH_MNT/foo > +hardlink=$SCRATCH_MNT/bar > + > +_cleanup() > +{ > + if [ -n "$pid" ]; then > + kill $pid &> /dev/null > + wait > + fi > + cd / > + rm -r -f $tmp.* > +} > + > +for ((i=0;i<14;i++)) do > + echo "round: " $i >> $seqres.full > + > + _scratch_mkfs >> $seqres.full > + _scratch_mount > + > + if [ $i == 0 ]; then > + touch $filename > + ino=`stat -c '%i' $filename` > + nlink=0 > + elif [ $i == 1 ]; then .....
Ok, it works, but it's a bit nasty. You want to run the same injection and checking on all types of inodes, so factor that out like so: inject_and_check() { local nlink=$1 local ino=`stat -c '%i' $filename` echo "ino:"$ino >> $seqres.full echo "nlink:"$nlink >> $seqres.full _scratch_unmount $F2FS_INJECT_PROG --node --mb i_links --nid $ino --val $nlink $SCRATCH_DEV \ >> $seqres.full || _fail "fail to inject" _check_scratch_fs >> $seqres.full 2>&1 && _fail "can't find corruption" _repair_scratch_fs >> $seqres.full _check_scratch_fs >> $seqres.full 2>&1 || _fail "fsck can't fix corruption" _scratch_mount _scratch_unmount _scratch_mkfs >> $seqres.full _scratch_mount } And now most of the test cases become this: _scratch_mkfs >> $seqres.full _scratch_mount touch $filename inject_and_check 0 mkdir $filename inject_and_check 1 mknod $filename c 9 0 inject_and_check 0 mknod $filename b 8 0 inject_and_check 0 ..... The whacky cases with socket and orphan inodes can be handled by factoring inject_and_check so there's a second function that takes both ino and nlink as parameters. This gets rid of all the unnecessary if/elif logic and looping, leaving only the test code that does the work behind. -Dave. -- Dave Chinner da...@fromorbit.com _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel