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