#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2018 Sagi Grimberg
#
# Test NVMe out of range access on a file backend. Regression test for commit
# 9c891c139894 ("nvmet: check fileio LBA range access boundaries").

. tests/nvme/rc

DESCRIPTION="unit test NVMe-oF out of range access on a file backend"
QUICK=1

requires() {
	_nvme_requires
	_have_loop
	_require_nvme_trtype_is_fabrics
}

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

	_setup_nvmet

	local port
	local nvmedev
	local file_path="$TMPDIR/img"
	local subsys_name="blktests-subsystem-1"

	truncate -s "${nvme_img_size}" "${file_path}"

	_create_nvmet_subsystem "${subsys_name}" "${file_path}" \
		 "91fdba0d-f87b-4c25-b80f-db7be1418b9e"
	port="$(_create_nvmet_port "${nvme_trtype}")"
	_add_nvmet_subsys_to_port "${port}" "${subsys_name}"

	_nvme_connect_subsys "${nvme_trtype}" "${subsys_name}"

	nvmedev=$(_find_nvme_dev "${subsys_name}")
	cat "/sys/block/${nvmedev}n1/uuid"
	cat "/sys/block/${nvmedev}n1/wwid"

	local sectors
	local bs
	sectors="$(blockdev --getsz "/dev/${nvmedev}n1")"
	bs="$(blockdev --getbsz "/dev/${nvmedev}n1")"

	nvme read "/dev/${nvmedev}n1" -s "$sectors" -c 0 -z "$bs" &>"$FULL" \
		&& echo "ERROR: nvme read for out of range LBA was not rejected"

	_nvme_disconnect_subsys "${subsys_name}"

	_remove_nvmet_subsystem_from_port "${port}" "${subsys_name}"
	_remove_nvmet_subsystem "${subsys_name}"
	_remove_nvmet_port "${port}"

	rm "${file_path}"

	echo "Test complete"
}
