xref: /aosp_15_r20/external/ublksrv/tests/common/qcow2_common (revision 94c4a1e103eb1715230460aab379dff275992c20)
1# SPDX-License-Identifier: GPL-2.0
2#!/bin/bash
3
4export QCOW2_IMG_SZ=2G
5
6_create_qcow2_null_image() {
7	local type=$1
8	local size=$2
9	local my_file=`mktemp -p ${UBLK_TMP_DIR}  ublk_${type}_${size}_XXXXX.qcow2`
10	qemu-img create -f qcow2 $my_file $size  > /dev/null 2>&1
11	echo $my_file
12}
13
14_qcow2_image_alloc_data() {
15	local my_dev=`__create_nbd_dev "$1"`
16	local my_size=`blockdev --getsz $my_dev`
17	local my_count=`expr ${my_size} / 2048`
18
19	dd if=/dev/zero of=$my_dev bs=1M count=${my_count} oflag=direct > /dev/null 2>&1
20	__remove_nbd_dev $my_dev
21}
22
23_create_qcow2_image() {
24	local type=$1
25	local size=$2
26
27	local file=`_create_qcow2_null_image $type $size`
28	if [ "$type" == "data" ]; then
29		local nbd_params="-c /dev/nbd11 -n --aio=native $file"
30		_qcow2_image_alloc_data "$nbd_params"
31	fi
32	echo $file
33}
34
35_check_qcow2_image() {
36	local my_file=$1
37	qemu-img check -r leaks $my_file > ${UBLK_TMP} 2>&1
38	[ $? -ne 0 ] && echo "qcow2 image $my_file is broken" && cat ${UBLK_TMP} && exit
39}
40
41_remove_qcow2_image() {
42	local file=$1
43
44	if [ -f "$file" ]; then
45		_check_qcow2_image $file
46		rm -f $file
47	fi
48}
49
50
51__remove_nbd_dev() {
52	local DEV=$1
53	sync $DEV
54	qemu-nbd -d $DEV  > /dev/null 2>&1
55	udevadm settle
56}
57
58__create_nbd_dev() {
59	local nbd_params="$1"
60	local DEV=`echo ${nbd_params} | awk '{ for(i=1; i<=NF; ++i) if (substr($i, 1, 8) == "/dev/nbd") printf $i}'`
61	modprobe nbd > /dev/null 2>&1
62	qemu-nbd -d $DEV > /dev/null 2>&1
63	eval qemu-nbd ${nbd_params} > /dev/null 2>&1
64	echo "$DEV"
65	udevadm settle
66}
67
68__run_nbd_dev_perf()
69{
70	local JOBS=$1
71	local DEV=`__create_nbd_dev "${T_TYPE_PARAMS}"`
72
73	echo -e "\t$T_TYPE $T_TYPE_PARAMS, fio($DEV, libaio, dio, io jobs $JOB)..."
74	__run_dev_perf_no_create "nbd" $JOBS $DEV
75
76	__remove_nbd_dev $DEV
77}
78