Hi Chao Yu, On Wed, 30 Apr 2025 10:47:31 +0800, Chao Yu wrote:
> This is a regression testcase to check whether we will handle database > inode dirty status correctly: > 1. make sure disk quota is enabled > 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> > --- > tests/f2fs/013 | 73 ++++++++++++++++++++++++++++++++++++++++++++++ > tests/f2fs/013.out | 2 ++ > 2 files changed, 75 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..3db8448c > --- /dev/null > +++ b/tests/f2fs/013 > @@ -0,0 +1,73 @@ > +#! /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. make sure disk quota is enabled Where is the check that disk quota is enabled? > +# 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 > + > +_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 > +_scratch_mount "-o fault_injection=1,fault_type=4194304" >> $seqres.full This requires CONFIG_F2FS_FAULT_INJECTION=y, although now I see that parse_options() just ignores them and the test still passes fine with CONFIG_F2FS_FAULT_INJECTION unset. Does it make sense to run without FAULT_TIMEOUT injection? It'd likely make sense to just _notrun if fault injection is unavailable. > +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 & > +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 > + > +newsize=`stat $dbfile -c %s` > +if [ "$newsize" != "8192" ]; then > + _fail "filesize is inconsistent:"$newsize > +fi nit: I think it'd be simpler to do: stat $dbfile -c %s ...and just put the 8192 in the golden output. > +rm $dbfile > +sync > + > +echo "Silence is golden" > + > +status=0 > +exit > diff --git a/tests/f2fs/013.out b/tests/f2fs/013.out > new file mode 100644 > index 00000000..3e66423b > --- /dev/null > +++ b/tests/f2fs/013.out > @@ -0,0 +1,2 @@ > +QA output created by 013 > +Silence is golden _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel