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