blob: e45b6cea9f38bc3f274f78dd3a2a74407ab03942 [file]
#! /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
_require_f2fs_io_command "compress" "get_cblocks" "release_cblocks" "reserve_cblocks" "decompress"
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