#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2022 Google LLC

. tests/zbd/rc
. common/scsi_debug

DESCRIPTION="test gap zone support with BTRFS"
QUICK=1

# compare 3 digits versions (e.g., 5.18.1)
ver_a_is_before_b() {
	local a1 a2 a3 b1 b2 b3

	IFS='.' read -r a1 a2 a3 <<< "$1"
	IFS='.' read -r b1 b2 b3 <<< "$2"
	(((a1 * 65536 + a2 * 256 + a3) < (b1 * 65536 + b2 * 256 + b3)))
}

# mkfs.btrfs version from 5.17 to 5.18.x fails to format zoned block devices
have_good_mkfs_btrfs() {
	local ver

	ver=$(mkfs.btrfs -V | sed 's/[^[:digit:]]*//')
	if ver_a_is_before_b "$ver" 5.17; then
		return 0
	elif ver_a_is_before_b "$ver" 5.19; then
		SKIP_REASONS+=("mkfs.btrfs ver $ver fails to format zoned block devices")
		return 1
	fi
	return 0
}

requires() {
	_have_fio
	_have_driver btrfs
	_have_module_param scsi_debug zone_cap_mb
	_have_program mkfs.btrfs && have_good_mkfs_btrfs
	_have_module scsi_debug
}

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

	local params=(
		delay=0
		dev_size_mb=1024
		sector_size=4096
		zbc=host-managed
		zone_cap_mb=3
		zone_nr_conv=0
		zone_size_mb=4
		zone_max_open=16
	)
	_init_scsi_debug "${params[@]}" || return 1

	local dev="/dev/${SCSI_DEBUG_DEVICES[0]}" fail

	mkfs.btrfs -O zoned "${dev}" >>"${FULL}" 2>&1 &&
	local mount_dir="$TMPDIR/mnt" &&
	mkdir -p "${mount_dir}" &&
	mount -t btrfs "${dev}" "${mount_dir}" &&
	local fio_args=(
		--size=1M
		--directory="${mount_dir}"
		--time_based
		--runtime=10
	) &&
	_run_fio_verify_io "${fio_args[@]}" >>"${FULL}" 2>&1 ||
	fail=true

	umount "${mount_dir}" >>"${FULL}" 2>&1

	_exit_scsi_debug

	if [ -z "$fail" ]; then
		echo "Test complete"
	else
		echo "Test failed"
		return 1
	fi
}
