#!/bin/bash # # Copyright (C) 2010 Davidlohr Bueso # # This file is part of util-linux. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # TS_TOPDIR="${0%/*}/../.." TS_DESC="partitions probing" PARTS=3 . $TS_TOPDIR/functions.sh ts_init "$*" ts_check_test_command "$TS_CMD_PARTX" ts_check_test_command "$TS_CMD_ADDPART" ts_check_test_command "$TS_CMD_DELPART" ts_skip_nonroot shopt -s nullglob function check_partition_count { # this function needs shopt -s nullglob local cnt_want=$1 local devname=$(basename $TS_DEVICE) local parts=(/sys/block/${devname}/${devname}*) local cnt_have=${#parts[@]} if [ $cnt_have -eq $cnt_want ]; then return 0 fi echo "error: expected $cnt_want partitions, have $cnt_have" >&2 echo "${parts[@]}" >&2 return 1 } # set global variable TS_DEVICE ts_scsi_debug_init dev_size_mb=50 ts_init_subtest "addpart" { $TS_CMD_ADDPART ${TS_DEVICE} 1 0 1 && echo OK || echo "Unable to add partition" check_partition_count 1 } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "delpart" { $TS_CMD_DELPART ${TS_DEVICE} 1 && echo OK || echo "Unable to remove partition" check_partition_count 0 } >$TS_OUTPUT 2>&1 ts_finalize_subtest ts_scsi_debug_rmmod # set global variable TS_DEVICE ts_scsi_debug_init dev_size_mb=50 num_parts=$PARTS ts_init_subtest "detect-parts" { $TS_CMD_PARTX --show $TS_DEVICE && echo OK || echo "Unable to list partitions" check_partition_count $PARTS } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "delete-all" #delete partinfo { $TS_CMD_PARTX --delete $TS_DEVICE && echo "partitions deleted" || echo "Unable to delete partitions on $TS_DEVICE" check_partition_count 0 } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "add-all" #read TS_DEVICE and restore the partinfo { $TS_CMD_PARTX --add $TS_DEVICE && echo "partitions added" || echo "Unable to add partitions for $TS_DEVICE" check_partition_count $PARTS } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "update-one" #read TS_DEVICE and update second partition { $TS_CMD_PARTX --update ${TS_DEVICE}2 && echo "partitions updated" || echo "Unable to update 2nd partition for $TS_DEVICE" check_partition_count $PARTS } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "delete-one" #remove last partition only { $TS_CMD_PARTX -d --nr -1 $TS_DEVICE && echo "last partition removed" || echo "Unable to remove a partition on $TS_DEVICE" check_partition_count $((PARTS-1)) } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "delete-non-existent" #attempt to remove it again { $TS_CMD_PARTX -d --nr $PARTS $TS_DEVICE && echo "partx failed: removed non-existing partition" || echo "partx: OK" } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "add-existing" #try adding an existing partition { $TS_CMD_PARTX -a --nr 1 $TS_DEVICE 2>/dev/null && echo "partx failed: re-added an existing partition" || echo "partx: OK" } >$TS_OUTPUT 2>&1 ts_finalize_subtest udevadm settle ts_init_subtest "change-by-range" # {-a|-d} --nr 0 should handle all partitions { $TS_CMD_PARTX -d --nr 0 $TS_DEVICE && echo "partitions deleted" || echo "Unable to delete partitions on $TS_DEVICE" check_partition_count 0 $TS_CMD_PARTX -a --nr 0 $TS_DEVICE && echo "partitions added" || echo "Failed to add $TS_DEVICE partitions" check_partition_count $PARTS } >$TS_OUTPUT 2>&1 ts_finalize_subtest ts_finalize