| #! /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 |