#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2026 SUSE S.A.  All Rights Reserved.
#
# FS QA Test 343
#
# A regression test to make sure a single-block write at file offset 0 won't
# incorrectly mark the inode incompressible.
#
. ./common/preamble
_begin_fstest auto quick compress

_require_scratch
_require_btrfs_command inspect-internal dump-tree

_fixed_by_kernel_commit xxxxxxxxxxxx \
	"btrfs: fix the inline compressed extent check in inode_need_compress()"

_scratch_mkfs >>$seqres.full 2>&1
_scratch_mount "-o compress,max_inline=2048"

blocksize=$(_get_file_block_size $SCRATCH_MNT)

# Create a sparse file which is 2 * blocksize, then try a small write at
# file offset 0 which should not be inlined.
# Sync so that [0, 2K) range is written, then write a larger range which
# should be able to be compressed.
$XFS_IO_PROG -f -c "truncate $((2 * $blocksize))" -c "pwrite 0 2k" -c sync \
		-c "pwrite 1m 1m" $SCRATCH_MNT/foobar >> $seqres.full
ino=$(stat -c "%i" $SCRATCH_MNT/foobar)
_scratch_unmount

# Dump the fstree into seqres.full for debug.
$BTRFS_UTIL_PROG inspect-internal dump-tree -t 5 $SCRATCH_DEV >> $seqres.full

# Check the NOCOMPRESS flag of the inode.
$BTRFS_UTIL_PROG inspect-internal dump-tree -t 5 $SCRATCH_DEV |\
grep -A 4 -e "item .* key ($ino INODE_ITEM 0)" | grep -q NOCOMPRESS
[ $? -eq 0 ] && echo "inode $ino has NOCOMPRESS flag"

# Check the file extent at fileoffset 1m.
$BTRFS_UTIL_PROG inspect-internal dump-tree -t 5 $SCRATCH_DEV |\
grep -A 4 -e "item .* key ($ino EXTENT_DATA 1048576)" | grep -q "compression 0"
[ $? -eq 0 ] && echo "inode $ino file offset 1M is not compressed"

echo "Silence is golden"
# success, all done
_exit 0
