The {logical,physical}_block_size may actually differ (physical can be bigger than logical) so always use the smallest available unit - the hw_sector_size is an actual alias to logical_block_size and it's also clearly indicating what unit sgdisk is working with. In case the physical_block_size differs, the resulted partitions may have different size than expected. For instance, under nvme with 512/4096 layout, the partitions were ending up 128MB in size instead of 1GB causing the dmsetup to fail (as it expects to join partitions 1GB in size each). Signed-off-by: Michal Berger <michal.berger@intel.com> Change-Id: Ib6d3afd3471af2c2e9a5ced17004dd9c565708c8 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16551 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
82 lines
1.8 KiB
Bash
82 lines
1.8 KiB
Bash
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright (C) 2020 Intel Corporation
|
|
# All rights reserved.
|
|
#
|
|
|
|
source "$rootdir/test/common/autotest_common.sh"
|
|
|
|
setup() {
|
|
if [[ $1 == output ]]; then
|
|
"$rootdir/scripts/setup.sh" "${@:2}"
|
|
else
|
|
"$rootdir/scripts/setup.sh" "$@" &> /dev/null
|
|
fi
|
|
}
|
|
|
|
get_meminfo() {
|
|
local get=$1
|
|
local node=$2
|
|
local var val
|
|
local mem_f mem
|
|
|
|
mem_f=/proc/meminfo
|
|
if [[ -e /sys/devices/system/node/node$node/meminfo ]]; then
|
|
mem_f=/sys/devices/system/node/node$node/meminfo
|
|
elif [[ -n $node ]]; then
|
|
return 1
|
|
fi
|
|
mapfile -t mem < "$mem_f"
|
|
mem=("${mem[@]#Node +([0-9]) }")
|
|
|
|
while IFS=": " read -r var val _; do
|
|
[[ $var == "$get" ]] || continue
|
|
echo "$val" && return 0
|
|
done < <(printf '%s\n' "${mem[@]}")
|
|
return 1
|
|
}
|
|
|
|
partition_drive() {
|
|
local disk=$1
|
|
local part_no=${2:-2}
|
|
local size=${3:-1073741824} # default 1G
|
|
|
|
local part part_start=0 part_end=0
|
|
local parts=()
|
|
|
|
for ((part = 1; part <= part_no; part++)); do
|
|
parts+=("${disk}p$part")
|
|
done
|
|
|
|
# Convert size to sectors for more precise partitioning
|
|
((size /= $(< "/sys/class/block/$disk/queue/hw_sector_size")))
|
|
|
|
"$rootdir/scripts/sync_dev_uevents.sh" block/partition "${parts[@]}" &
|
|
|
|
# Avoid parted since it generates to much noise over netlink
|
|
sgdisk "/dev/$disk" --zap-all || :
|
|
for ((part = 1; part <= part_no; part++)); do
|
|
((part_start = part_start == 0 ? 2048 : part_end + 1))
|
|
((part_end = part_start + size - 1))
|
|
sgdisk "/dev/$disk" --new="$part:$part_start:$part_end"
|
|
done
|
|
wait "$!"
|
|
}
|
|
|
|
mkfs() {
|
|
local dev=$1 mount=$2 size=$3
|
|
|
|
mkdir -p "$mount"
|
|
|
|
[[ -e $dev ]]
|
|
mkfs.ext4 -qF "$dev" $size
|
|
mount "$dev" "$mount"
|
|
}
|
|
|
|
sec_size_to_bytes() {
|
|
local dev=$1
|
|
|
|
[[ -e /sys/block/$dev ]] || return 1
|
|
# /size is always represented in 512B blocks
|
|
echo $(($(< "/sys/block/$dev/size") * 512))
|
|
}
|