On Tue, May 6, 2025 at 8:17 PM Chao Yu <c...@kernel.org> wrote: > > On 5/7/25 04:25, Daeho Jeong wrote: > > On Tue, May 6, 2025 at 12:05 AM Chao Yu via Linux-f2fs-devel > > <linux-f2fs-devel@lists.sourceforge.net> wrote: > >> > >> This is a regression testcase to check whether we will handle database > >> inode dirty status correctly: > >> 1. mount f2fs image w/ timeout fault injection option > >> 2. create a regular file, and write data into the file > >> 3. start transaction on the file (via F2FS_IOC_START_ATOMIC_WRITE) > >> 4. write transaction data to the file > >> 5. commit and end the transaction (via F2FS_IOC_COMMIT_ATOMIC_WRITE) > >> 6. meanwhile loop call fsync in parallel > >> Before f098aeba04c9 ("f2fs: fix to avoid atomicity corruption of atomic > >> file"), database file may become corrupted after atomic write while > >> there is concurrent dirty inode flush in background. > >> > >> Cc: Jaegeuk Kim <jaeg...@kernel.org> > >> Cc: Daeho Jeong <daehoje...@google.com> > >> Signed-off-by: Chao Yu <c...@kernel.org> > >> --- > >> v2: > >> - fix description of test steps > >> - add missing "_require_kernel_config CONFIG_F2FS_FAULT_INJECTION" > >> - add missing "_require_command "$F2FS_IO_PROG" f2fs_io" > >> - put correct filesize in the golden output > >> tests/f2fs/013 | 71 ++++++++++++++++++++++++++++++++++++++++++++++ > >> tests/f2fs/013.out | 2 ++ > >> 2 files changed, 73 insertions(+) > >> create mode 100755 tests/f2fs/013 > >> create mode 100644 tests/f2fs/013.out > >> > >> diff --git a/tests/f2fs/013 b/tests/f2fs/013 > >> new file mode 100755 > >> index 00000000..4cf56840 > >> --- /dev/null > >> +++ b/tests/f2fs/013 > >> @@ -0,0 +1,71 @@ > >> +#! /bin/bash > >> +# SPDX-License-Identifier: GPL-2.0 > >> +# Copyright (c) 2025 Chao Yu. All Rights Reserved. > >> +# > >> +# FS QA Test No. f2fs/013 > >> +# > >> +# This is a regression testcase to check whether we will handle database > >> +# inode dirty status correctly: > >> +# 1. mount f2fs image w/ timeout fault injection option > >> +# 2. create a regular file, and write data into the file > >> +# 3. start transaction on the file (via F2FS_IOC_START_ATOMIC_WRITE) > >> +# 4. write transaction data to the file > >> +# 5. commit and end the transaction (via F2FS_IOC_COMMIT_ATOMIC_WRITE) > >> +# 6. meanwhile loop call fsync in parallel > >> +# Before f098aeba04c9 ("f2fs: fix to avoid atomicity corruption of atomic > >> +# file"), database file may become corrupted after atomic write while > >> +# there is concurrent dirty inode flush in background. > >> +# > >> +. ./common/preamble > >> +_begin_fstest auto quick > >> +_require_kernel_config CONFIG_F2FS_FAULT_INJECTION > >> +_require_command "$F2FS_IO_PROG" f2fs_io > >> + > >> +_cleanup() > >> +{ > >> + [ -n "$atomic_write_pid" ] && kill -9 $atomic_write_pid > >> + wait > >> + cd / > >> + rm -r -f $tmp.* > >> +} > >> + > >> +_fixed_by_kernel_commit f098aeba04c9 \ > >> + "f2fs: fix to avoid atomicity corruption of atomic file" > >> + > >> +_require_scratch > >> + > >> +_scratch_mkfs >> $seqres.full > >> +# note that it relis on FAULT_TIMEOUT fault injection support in f2fs > > > > relis -> relies > > Will fix. > > > > >> +_scratch_mount "-o fault_injection=1,fault_type=4194304" >> $seqres.full > >> + > >> +dbfile=$SCRATCH_MNT/file.db > >> + > >> +# initialize database file > >> +$XFS_IO_PROG -c "pwrite 0 4k" -c "fsync" -f $dbfile >> $seqres.full > >> + > >> +# sync filesystem to clear dirty inode > >> +sync > >> + > >> +# start atomic_write on src.db database file and commit transaction > >> +$F2FS_IO_PROG write 1 0 2 zero atomic_commit $dbfile >> $seqres.full & > > > > I think we might have some timing issues here like background f2fs_io > > ends earlier than foreground fsync() loop. > > What about adding a sysfs entry to control timeout, by default it's > 1 second, we can tune it to 5 second for this case?
Ah, so TIMEOUT fault will induce 1 second delay in the kernel path? Then, I am okay with that. > > Thanks, > > > > >> +atomic_write_pid=$! > >> + > >> +# call fsync to flush dirty inode of database file in parallel > >> +for ((j=0;j<1000;j++)) do > >> + $F2FS_IO_PROG fsync $dbfile >> $seqres.full > >> +done > >> + > >> +wait $atomic_write_pid > >> +unset atomic_write_pid > >> + > >> +# flush dirty data and drop cache > >> +sync > >> +echo 3 > /proc/sys/vm/drop_caches > >> + > >> +stat $dbfile -c %s > >> + > >> +rm $dbfile > >> +sync > >> + > >> +status=0 > >> +exit > >> diff --git a/tests/f2fs/013.out b/tests/f2fs/013.out > >> new file mode 100644 > >> index 00000000..d9271f75 > >> --- /dev/null > >> +++ b/tests/f2fs/013.out > >> @@ -0,0 +1,2 @@ > >> +QA output created by 013 > >> +8192 > >> -- > >> 2.49.0 > >> > >> > >> > >> _______________________________________________ > >> Linux-f2fs-devel mailing list > >> Linux-f2fs-devel@lists.sourceforge.net > >> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel > _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel