15ff75ec2SDarek Stojaczyk#!/usr/bin/env bash 2*eb53c232Spaul luse# SPDX-License-Identifier: BSD-3-Clause 3*eb53c232Spaul luse# Copyright (C) 2019 Intel Corporation 4*eb53c232Spaul luse# All rights reserved. 5*eb53c232Spaul luse# 65ff75ec2SDarek Stojaczyktestdir=$(readlink -f $(dirname $0)) 75ff75ec2SDarek Stojaczykrootdir=$(readlink -f $testdir/../..) 85ff75ec2SDarek Stojaczyksource $rootdir/test/common/autotest_common.sh 95ff75ec2SDarek Stojaczyksource $rootdir/test/lvol/common.sh 109d044f25SDarek Stojaczyksource $rootdir/test/bdev/nbd_common.sh 115ff75ec2SDarek Stojaczyk 125ff75ec2SDarek Stojaczyk# resize an lvol a few times 135ff75ec2SDarek Stojaczykfunction test_resize_lvol() { 145ff75ec2SDarek Stojaczyk # create an lvol store 155ff75ec2SDarek Stojaczyk malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) 165ff75ec2SDarek Stojaczyk lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) 175ff75ec2SDarek Stojaczyk 185ff75ec2SDarek Stojaczyk # calculate lvol size 195ff75ec2SDarek Stojaczyk lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 4))) 205ff75ec2SDarek Stojaczyk lvol_size=$((lvol_size_mb * 1024 * 1024)) 215ff75ec2SDarek Stojaczyk 225ff75ec2SDarek Stojaczyk # create an lvol on top 235ff75ec2SDarek Stojaczyk lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size_mb") 245ff75ec2SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 255ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ] 265ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ] 275ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test/lvol_test" ] 285ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 295ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 305ff75ec2SDarek Stojaczyk 315ff75ec2SDarek Stojaczyk # resize the lvol to twice its original size 325ff75ec2SDarek Stojaczyk lvol_size_mb=$((lvol_size_mb * 2)) 335ff75ec2SDarek Stojaczyk lvol_size=$((lvol_size_mb * 1024 * 1024)) 345ff75ec2SDarek Stojaczyk rpc_cmd bdev_lvol_resize "$lvol_uuid" "$lvol_size_mb" 355ff75ec2SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 365ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 375ff75ec2SDarek Stojaczyk 38cf628b09SDarek Stojaczyk # resize the lvol to four times its original size, use its name instead of uuid 395ff75ec2SDarek Stojaczyk lvol_size_mb=$((lvol_size_mb * 2)) 405ff75ec2SDarek Stojaczyk lvol_size=$((lvol_size_mb * 1024 * 1024)) 41cf628b09SDarek Stojaczyk rpc_cmd bdev_lvol_resize lvs_test/lvol_test "$lvol_size_mb" 425ff75ec2SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 435ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 445ff75ec2SDarek Stojaczyk 455ff75ec2SDarek Stojaczyk # resize the lvol to 0 using lvol bdev alias 465ff75ec2SDarek Stojaczyk lvol_size_mb=0 475ff75ec2SDarek Stojaczyk lvol_size=0 485ff75ec2SDarek Stojaczyk rpc_cmd bdev_lvol_resize "lvs_test/lvol_test" "$lvol_size_mb" 495ff75ec2SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 505ff75ec2SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 515ff75ec2SDarek Stojaczyk 525ff75ec2SDarek Stojaczyk # clean up 535ff75ec2SDarek Stojaczyk rpc_cmd bdev_lvol_delete "$lvol_uuid" 545ff75ec2SDarek Stojaczyk rpc_cmd bdev_get_bdevs -b "$lvol_uuid" && false 555ff75ec2SDarek Stojaczyk rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid" 565ff75ec2SDarek Stojaczyk rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false 575ff75ec2SDarek Stojaczyk rpc_cmd bdev_malloc_delete "$malloc_name" 585ff75ec2SDarek Stojaczyk} 595ff75ec2SDarek Stojaczyk 604c945d23SDarek Stojaczyk# negative test for resizing a logical volume 614c945d23SDarek Stojaczyk# call bdev_lvol_resize with logical volume which does not exist in configuration 624c945d23SDarek Stojaczyk# call bdev_lvol_resize with size argument bigger than size of base bdev 634c945d23SDarek Stojaczykfunction test_resize_lvol_negative() { 644c945d23SDarek Stojaczyk # create an lvol store 654c945d23SDarek Stojaczyk malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) 664c945d23SDarek Stojaczyk lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) 674c945d23SDarek Stojaczyk 684c945d23SDarek Stojaczyk # create an lvol on top 694c945d23SDarek Stojaczyk lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$LVS_DEFAULT_CAPACITY_MB") 704c945d23SDarek Stojaczyk 714c945d23SDarek Stojaczyk # try to resize another, inexistent lvol 724c945d23SDarek Stojaczyk dummy_uuid="00000000-0000-0000-0000-000000000000" 734c945d23SDarek Stojaczyk rpc_cmd bdev_lvol_resize "$dummy_uuid" 0 && false 744c945d23SDarek Stojaczyk # just make sure the size of the real lvol did not change 754c945d23SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 764c945d23SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((LVS_DEFAULT_CAPACITY / MALLOC_BS))" ] 774c945d23SDarek Stojaczyk 784c945d23SDarek Stojaczyk # try to resize an lvol to a size bigger than lvs 794c945d23SDarek Stojaczyk rpc_cmd bdev_lvol_resize "$lvol_uuid" "$MALLOC_SIZE_MB" && false 804c945d23SDarek Stojaczyk # just make sure the size of the real lvol did not change 814c945d23SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 824c945d23SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((LVS_DEFAULT_CAPACITY / MALLOC_BS))" ] 834c945d23SDarek Stojaczyk 844c945d23SDarek Stojaczyk # clean up 854c945d23SDarek Stojaczyk rpc_cmd bdev_lvol_delete "$lvol_uuid" 864c945d23SDarek Stojaczyk rpc_cmd bdev_get_bdevs -b "$lvol_uuid" && false 874c945d23SDarek Stojaczyk rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid" 884c945d23SDarek Stojaczyk rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false 894c945d23SDarek Stojaczyk rpc_cmd bdev_malloc_delete "$malloc_name" 904c945d23SDarek Stojaczyk} 914c945d23SDarek Stojaczyk 929d044f25SDarek Stojaczyk# resize an lvol a few times 939d044f25SDarek Stojaczykfunction test_resize_lvol_with_io_traffic() { 949d044f25SDarek Stojaczyk # create an lvol store 959d044f25SDarek Stojaczyk malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) 969d044f25SDarek Stojaczyk lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) 979d044f25SDarek Stojaczyk 989d044f25SDarek Stojaczyk # calculate lvol size 999d044f25SDarek Stojaczyk lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 2))) 1009d044f25SDarek Stojaczyk lvol_size=$((lvol_size_mb * 1024 * 1024)) 1019d044f25SDarek Stojaczyk 1029d044f25SDarek Stojaczyk # create an lvol on top 1039d044f25SDarek Stojaczyk lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size_mb") 1049d044f25SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 1059d044f25SDarek Stojaczyk [ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ] 1069d044f25SDarek Stojaczyk [ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ] 1079d044f25SDarek Stojaczyk [ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test/lvol_test" ] 1089d044f25SDarek Stojaczyk [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 1099d044f25SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 1109d044f25SDarek Stojaczyk 1119d044f25SDarek Stojaczyk # prepare to do some I/O 1129d044f25SDarek Stojaczyk trap 'nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0; exit 1' SIGINT SIGTERM EXIT 1139d044f25SDarek Stojaczyk nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 1149d044f25SDarek Stojaczyk 1159d044f25SDarek Stojaczyk # write to the entire lvol 1169d044f25SDarek Stojaczyk count=$((lvol_size / LVS_DEFAULT_CLUSTER_SIZE)) 1179d044f25SDarek Stojaczyk dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=$count 1189d044f25SDarek Stojaczyk 1199d044f25SDarek Stojaczyk # writing beyond lvol size should fail 1209d044f25SDarek Stojaczyk offset=$((lvol_size / LVS_DEFAULT_CLUSTER_SIZE + 1)) 1219d044f25SDarek Stojaczyk dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=$offset count=1 && false 1229d044f25SDarek Stojaczyk 1239d044f25SDarek Stojaczyk # resize the lvol to twice its original size 1249d044f25SDarek Stojaczyk lvol_size_mb=$((lvol_size_mb * 2)) 1259d044f25SDarek Stojaczyk lvol_size=$((lvol_size_mb * 1024 * 1024)) 1269d044f25SDarek Stojaczyk rpc_cmd bdev_lvol_resize "$lvol_uuid" "$lvol_size_mb" 1279d044f25SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 1289d044f25SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 1299d044f25SDarek Stojaczyk 1309d044f25SDarek Stojaczyk # writing beyond the original lvol size should now succeed, we need 1319d044f25SDarek Stojaczyk # to restart NBD though as it may still use the old, cached size 1329d044f25SDarek Stojaczyk nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 1339d044f25SDarek Stojaczyk nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 1349d044f25SDarek Stojaczyk dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=$offset count=1 1359d044f25SDarek Stojaczyk 1369d044f25SDarek Stojaczyk # lvol can't be downsized if they have any open descriptors, so close them now 1379d044f25SDarek Stojaczyk trap - SIGINT SIGTERM EXIT 1389d044f25SDarek Stojaczyk nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 1399d044f25SDarek Stojaczyk 1409d044f25SDarek Stojaczyk # resize lvol down to a single cluster 1419d044f25SDarek Stojaczyk rpc_cmd bdev_lvol_resize "$lvol_uuid" "$LVS_DEFAULT_CLUSTER_SIZE_MB" 1429d044f25SDarek Stojaczyk lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 1439d044f25SDarek Stojaczyk [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((LVS_DEFAULT_CLUSTER_SIZE / MALLOC_BS))" ] 1449d044f25SDarek Stojaczyk 1459d044f25SDarek Stojaczyk # make sure we can't write beyond the first cluster 1469d044f25SDarek Stojaczyk trap 'nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0; exit 1' SIGINT SIGTERM EXIT 1479d044f25SDarek Stojaczyk nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 1489d044f25SDarek Stojaczyk dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=1 count=1 && false 1499d044f25SDarek Stojaczyk 1509d044f25SDarek Stojaczyk # clean up 1519d044f25SDarek Stojaczyk trap - SIGINT SIGTERM EXIT 1529d044f25SDarek Stojaczyk nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 1539d044f25SDarek Stojaczyk rpc_cmd bdev_lvol_delete "$lvol_uuid" 1549d044f25SDarek Stojaczyk rpc_cmd bdev_get_bdevs -b "$lvol_uuid" && false 1559d044f25SDarek Stojaczyk rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid" 1569d044f25SDarek Stojaczyk rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false 1579d044f25SDarek Stojaczyk rpc_cmd bdev_malloc_delete "$malloc_name" 1589d044f25SDarek Stojaczyk} 1599d044f25SDarek Stojaczyk 16012ded5afSMichal Berger# Positive test for destroying a logical_volume after resizing. 16112ded5afSMichal Berger# Call bdev_lvol_delete_lvstore with correct logical_volumes name. 16212ded5afSMichal Bergerfunction test_destroy_after_bdev_lvol_resize_positive() { 16312ded5afSMichal Berger local malloc_dev 16412ded5afSMichal Berger local lvstore_name=lvs_test lvstore_uuid 16512ded5afSMichal Berger local lbd_name=lbd_test bdev_uuid bdev_size 16612ded5afSMichal Berger 16712ded5afSMichal Berger malloc_dev=$(rpc_cmd bdev_malloc_create 256 "$MALLOC_BS") 16812ded5afSMichal Berger lvstore_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_dev" "$lvstore_name") 16912ded5afSMichal Berger 17012ded5afSMichal Berger get_lvs_jq bdev_lvol_get_lvstores -u "$lvstore_uuid" 17112ded5afSMichal Berger [[ ${jq_out["uuid"]} == "$lvstore_uuid" ]] 17212ded5afSMichal Berger [[ ${jq_out["name"]} == "$lvstore_name" ]] 17312ded5afSMichal Berger 17412ded5afSMichal Berger bdev_size=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 4))) 17512ded5afSMichal Berger bdev_uuid=$(rpc_cmd bdev_lvol_create -u "$lvstore_uuid" "$lbd_name" "$bdev_size") 17612ded5afSMichal Berger 17712ded5afSMichal Berger # start resizing in the following fashion: 17812ded5afSMichal Berger # - size is equal to one quarter of size malloc bdev plus 4 MB 17912ded5afSMichal Berger # - size is equal half of size malloc bdev 18012ded5afSMichal Berger # - size is equal to three quarters of size malloc bdev 18112ded5afSMichal Berger # - size is equal to size if malloc bdev minus 4 MB 18212ded5afSMichal Berger # - size is equal 0 MiB 18312ded5afSMichal Berger local resize 18412ded5afSMichal Berger for resize in \ 18512ded5afSMichal Berger "$bdev_size" \ 18612ded5afSMichal Berger $((bdev_size + 4)) \ 18712ded5afSMichal Berger $((bdev_size * 2)) \ 18812ded5afSMichal Berger $((bdev_size * 3)) \ 18912ded5afSMichal Berger $((bdev_size * 4 - 4)) \ 19012ded5afSMichal Berger 0; do 19112ded5afSMichal Berger resize=$(round_down $((resize / 4))) 19212ded5afSMichal Berger rpc_cmd bdev_lvol_resize "$bdev_uuid" "$resize" 19312ded5afSMichal Berger 19412ded5afSMichal Berger get_bdev_jq bdev_get_bdevs -b "$bdev_uuid" 19512ded5afSMichal Berger [[ ${jq_out["name"]} == "$bdev_uuid" ]] 19612ded5afSMichal Berger [[ ${jq_out["name"]} == "${jq_out["uuid"]}" ]] 19712ded5afSMichal Berger ((jq_out["block_size"] == MALLOC_BS)) 19812ded5afSMichal Berger ((jq_out["num_blocks"] * jq_out["block_size"] == resize * 1024 ** 2)) 19912ded5afSMichal Berger done 20012ded5afSMichal Berger 20112ded5afSMichal Berger # cleanup 20212ded5afSMichal Berger rpc_cmd bdev_lvol_delete "$bdev_uuid" 20312ded5afSMichal Berger rpc_cmd bdev_lvol_delete_lvstore -u "$lvstore_uuid" 20412ded5afSMichal Berger rpc_cmd bdev_get_bdevs -b "$bdev_uuid" && false 20512ded5afSMichal Berger rpc_cmd bdev_lvol_get_lvstores -u "$lvstore_uuid" && false 20612ded5afSMichal Berger rpc_cmd bdev_malloc_delete "$malloc_dev" 20712ded5afSMichal Berger check_leftover_devices 20812ded5afSMichal Berger} 20912ded5afSMichal Berger 2109d044f25SDarek Stojaczykmodprobe nbd 2116b9b448eSBen Walker$SPDK_BIN_DIR/spdk_tgt & 2125ff75ec2SDarek Stojaczykspdk_pid=$! 2135ff75ec2SDarek Stojaczyktrap 'killprocess "$spdk_pid"; exit 1' SIGINT SIGTERM EXIT 2145ff75ec2SDarek Stojaczykwaitforlisten $spdk_pid 2155ff75ec2SDarek Stojaczyk 2165ff75ec2SDarek Stojaczykrun_test "test_resize_lvol" test_resize_lvol 2174c945d23SDarek Stojaczykrun_test "test_resize_lvol_negative" test_resize_lvol_negative 2189d044f25SDarek Stojaczykrun_test "test_resize_lvol_with_io_traffic" test_resize_lvol_with_io_traffic 21912ded5afSMichal Bergerrun_test "test_destroy_after_bdev_lvol_resize_positive" test_destroy_after_bdev_lvol_resize_positive 2205ff75ec2SDarek Stojaczyk 2215ff75ec2SDarek Stojaczyktrap - SIGINT SIGTERM EXIT 2225ff75ec2SDarek Stojaczykkillprocess $spdk_pid 223