#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2024 Oppo.  All Rights Reserved.
#
# FS QA Test No. f2fs/006
#
# This is a regression test to check whether f2fs handles dirty
# data correctly when checkpoint is disabled, if lfs mode is on,
# it will trigger OPU for all overwritten data, this will cost
# free segments, so f2fs must account overwritten data as OPU
# data when calculating free space, otherwise, it may run out
# of free segments in f2fs' allocation function. If kernel config
# CONFIG_F2FS_CHECK_FS is on, it will cause system panic, otherwise,
# dd may encounter I/O error.
#
. ./common/preamble
_begin_fstest auto quick

_fixed_by_kernel_commit 1acd73edbbfe \
	"f2fs: fix to account dirty data in __get_secs_required()"

_require_scratch
_scratch_mkfs_sized $((1024*1024*100)) >> $seqres.full

# use mode=lfs to let f2fs always triggers OPU
_scratch_mount -o mode=lfs,checkpoint=disable:10%,noinline_dentry >> $seqres.full

testfile=$SCRATCH_MNT/testfile

dd if=/dev/zero of=$testfile bs=1M count=50 2>/dev/null

# The 2nd dd might run out of space, and trigger a kernel warning or
# hang on unfixed kernel
dd if=/dev/zero of=$testfile bs=1M count=50 conv=notrunc conv=fsync >>$seqres.full 2>&1
dd if=/dev/zero of=$testfile bs=1M count=50 conv=notrunc conv=fsync >>$seqres.full 2>&1

_scratch_remount checkpoint=enable

echo "Silence is golden"

status=0
exit
