#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2025 Chao Yu.  All Rights Reserved.
#
# FS QA Test No. f2fs/010
#
# This is a regression testcase to check whether we will handle database
# inode dirty status correctly:
# 1. create a regular file, and write data into the file
# 2. start transaction on the file (via F2FS_IOC_START_ATOMIC_WRITE)
# 3. write transaction data to the file
# 4. rename the file
# 5. commit and end the transaction (via F2FS_IOC_COMMIT_ATOMIC_WRITE)
# 6. drop caches in order to call f2fs_evict_inode()
# It expects kernel panic will gone after we apply commit 03511e936916
# ("f2fs: fix inconsistent dirty state of atomic file").
#
. ./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 03511e936916 \
	"f2fs: fix inconsistent dirty state of atomic file"

_require_scratch
_require_command "$F2FS_IO_PROG" f2fs_io

_scratch_mkfs >> $seqres.full
_scratch_mount >> $seqres.full

src_db=$SCRATCH_MNT/src.db
dst_db=$SCRATCH_MNT/dst.db

# initialize database file
$XFS_IO_PROG -c "pwrite 0 4k" -c "fsync" -f $src_db >> $seqres.full

# sync filesystem to clear dirty inode
sync

# start atomic_write on src.db database file and commit transaction after 3000ms
$F2FS_IO_PROG write 1 0 0 zero atomic_commit $src_db 3000 >> $seqres.full &
atomic_write_pid=$!

# wait a moment to let atomic write starts
sleep 1

# it will dirty inode when updating i_pino
mv $src_db $dst_db

# wait for atomic_write commit completion
sleep 4

# drop caches in order to call f2fs_evict_inode()
echo 3 > /proc/sys/vm/drop_caches

wait $atomic_write_pid
unset atomic_write_pid

echo "Silence is golden"

status=0
exit
