#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2017 Omar Sandoval
#
# Tests the LO_FLAGS_BLOCKSIZE flag for LOOP_{GET,SET}_STATUS, introduced in
# commit f2c6df7dbf9a ("loop: support 4k physical blocksize"). Also a
# regression test for patches "loop: fix hang if LOOP_SET_STATUS gets invalid
# blocksize or encrypt type", "loop: use queue limit instead of private
# lo_logical_blocksize", and "loop: always return block size in
# LOOP_GET_STATUS".

. tests/loop/rc

DESCRIPTION="try various loop device block sizes"
QUICK=1

requires() {
	_have_program xfs_io && _have_src_program loblksize && _have_loop_set_block_size
}

test() {
	local loop_dev
	echo "Running ${TEST_NAME}"

	truncate -s 1M "$TMPDIR/file"
	if ! loop_dev="$(losetup -f --show "$TMPDIR/file")"; then
		return 1
	fi

	local sysfs="/sys/block/${loop_dev#/dev/}"
	for blksize in "" 4096 2048 1234 1024 512; do
		if [[ -z $blksize ]]; then
			echo "Checking default block size"
		else
			echo "Setting block size to $blksize"
			if src/loblksize "$loop_dev" "$blksize"; then
				xfs_io -f -d -c "pwrite 0 $blksize" "$loop_dev" >/dev/null
				dd if="$loop_dev" bs="$blksize" count=1 iflag=direct status=none | sha256sum
			fi
		fi
		cat "$sysfs/queue/logical_block_size"
	done

	sync
	losetup -d "$loop_dev"

	echo "Test complete"
}
