1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (C) 2023 SUSE LLC. 4# All rights reserved. 5# 6testdir=$(readlink -f $(dirname $0)) 7rootdir=$(readlink -f $testdir/../..) 8source $rootdir/test/common/autotest_common.sh 9source $rootdir/test/lvol/common.sh 10source $rootdir/test/bdev/nbd_common.sh 11 12function test_shallow_copy_compare() { 13 # Create lvs 14 bs_malloc_name=$(rpc_cmd bdev_malloc_create 20 $MALLOC_BS) 15 lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$bs_malloc_name" lvs_test) 16 17 # Create lvol with 4 cluster 18 lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * 4)) 19 lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size" -t) 20 21 # Fill second and fourth cluster of lvol 22 nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 23 dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=1 24 dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=3 25 nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 26 27 # Create snapshots of lvol bdev 28 snapshot_uuid=$(rpc_cmd bdev_lvol_snapshot lvs_test/lvol_test lvol_snapshot) 29 30 # Fill first and third cluster of lvol 31 nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 32 dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 33 dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=2 34 nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 35 36 # Set lvol as read only to perform the copy 37 rpc_cmd bdev_lvol_set_read_only "$lvol_uuid" 38 39 # Create external bdev to make a shallow copy of lvol on 40 ext_malloc_name=$(rpc_cmd bdev_malloc_create "$lvol_size" $MALLOC_BS) 41 42 # Make a shallow copy of lvol over external bdev 43 shallow_copy=$(rpc_cmd bdev_lvol_start_shallow_copy "$lvol_uuid" "$ext_malloc_name") 44 operation_id=$(echo $shallow_copy | jq -r '.operation_id') 45 46 # Check status of operation 47 retry=0 48 while [[ $retry -lt 10 ]]; do 49 status=$(rpc_cmd bdev_lvol_check_shallow_copy $operation_id) 50 result=$(echo $status | jq -r '.state') 51 copied_clusters=$(echo $status | jq -r '.copied_clusters') 52 total_clusters=$(echo $status | jq -r '.total_clusters') 53 54 if [[ "$result" == "complete" ]]; then 55 [[ $copied_clusters == 2 ]] 56 [[ $total_clusters == 2 ]] 57 break 58 fi 59 60 retry=$((retry + 1)) 61 sleep 1 62 done 63 64 [[ $retry -lt 10 ]] 65 66 # Create nbd devices of lvol and external bdev for comparison 67 nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 68 nbd_start_disks "$DEFAULT_RPC_ADDR" "$ext_malloc_name" /dev/nbd1 69 70 # Compare lvol and external bdev in first and third cluster 71 cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd0 /dev/nbd1 72 cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd0 /dev/nbd1 "$((LVS_DEFAULT_CLUSTER_SIZE * 2))" "$((LVS_DEFAULT_CLUSTER_SIZE * 2))" 73 74 # Check that second and fourth cluster of external bdev are zero filled 75 cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd1 /dev/zero "$LVS_DEFAULT_CLUSTER_SIZE" 76 cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd1 /dev/zero "$((LVS_DEFAULT_CLUSTER_SIZE * 3))" 77 78 # Stop nbd devices 79 nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd1 80 nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 81 82 # Clean up 83 rpc_cmd bdev_malloc_delete "$ext_malloc_name" 84 rpc_cmd bdev_lvol_delete "$snapshot_uuid" 85 rpc_cmd bdev_lvol_delete "$lvol_uuid" 86 rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid" 87 rpc_cmd bdev_malloc_delete "$bs_malloc_name" 88 check_leftover_devices 89} 90 91$SPDK_BIN_DIR/spdk_tgt & 92spdk_pid=$! 93trap 'killprocess "$spdk_pid"; exit 1' SIGINT SIGTERM EXIT 94waitforlisten $spdk_pid 95modprobe nbd 96 97run_test "test_shallow_copy_compare" test_shallow_copy_compare 98 99trap - SIGINT SIGTERM EXIT 100killprocess $spdk_pid 101