#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2024 Oppo.  All Rights Reserved.
#
# FS QA Test No. f2fs/007
#
# This is a regression test to check whether compressed metadata
# can become inconsistent after file compression, reservation
# releasement, and decompression.
#
. ./common/preamble
_begin_fstest auto quick rw compress

_fixed_by_kernel_commit 26413ce18e85 \
        "f2fs: compress: fix inconsistent update of i_blocks in release_compress_blocks and reserve_compress_blocks"

_require_scratch
testfile_prefix=$SCRATCH_MNT/testfile
fio_config=$tmp.fio

cat >$fio_config <<EOF
[write_compressed_data_30]
name=mytest
ioengine=psync
rw=write
direct=0
bs=1M
filesize=1M
numjobs=1
filename=${testfile_prefix}30
buffer_compress_percentage=30

[write_compressed_data_60]
name=mytest
ioengine=psync
rw=write
direct=0
bs=1M
filesize=1M
numjobs=1
filename=${testfile_prefix}60
buffer_compress_percentage=60

[write_compressed_data_90]
name=mytest
ioengine=psync
rw=write
direct=0
bs=1M
filesize=1M
numjobs=1
filename=${testfile_prefix}90
buffer_compress_percentage=90
EOF

_require_fio $fio_config
_scratch_mkfs "-f -O extra_attr,compression" >> $seqres.full || _fail "mkfs failed"
_scratch_mount "-o compress_mode=user,compress_extension=*" >> $seqres.full

echo -e "Run fio to initialize file w/ specified compress ratio" >> $seqres.full
cat $fio_config >> $seqres.full
$FIO_PROG $fio_config >> $seqres.full
_scratch_unmount

# force to repair if filesystem is corrupted
export FSCK_OPTIONS="-f $FSCK_OPTIONS"

for i in 30 60 90; do
	testfile=$testfile_prefix$i

	_scratch_mount "-o compress_mode=user" >> $seqres.full
	$F2FS_IO_PROG compress $testfile >> $seqres.full
	cblocks=`$F2FS_IO_PROG get_cblocks $testfile`
	echo "compression ratio is: "$cblocks" / 256"

	_scratch_unmount

	# 1. check after compression
	echo "check fs after compress"
	_check_scratch_fs

	_scratch_mount >> $seqres.full
	$F2FS_IO_PROG release_cblocks $testfile >> $seqres.full
	_scratch_unmount

	# 2. check after releasement
	echo "check fs after release_cblocks"
	_check_scratch_fs

	_scratch_mount >> $seqres.full
	$F2FS_IO_PROG reserve_cblocks $testfile >> $seqres.full
	_scratch_unmount

	# 3. check after rservation
	echo "check fs after reserve_cblocks"
	_check_scratch_fs

	_scratch_mount "-o compress_mode=user" >> $seqres.full
	$F2FS_IO_PROG decompress $testfile >> $seqres.full
	_scratch_unmount

	# 4. check after decompression
	echo "check fs after decompress"
	_check_scratch_fs
done

status=0
exit
