commit 45d27cef8a83d9cb10fc8d74d8001369af6f6a0d
parent 8e300faa6cb881bbd3031a2badf488d4985133b7
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date: Wed, 22 Nov 2017 22:02:00 +0100
Compare md array components by raw device numbers
Diffstat:
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/zsh-functions/confz_fs_init b/zsh-functions/confz_fs_init
@@ -4,8 +4,10 @@
# confz functions for dealing with filesystem and mounting
#
-# smartctl -i /dev/sda | while IFS=':' read foo bar; do P '***' ${${foo:l}// /_} ${bar/# #}; done
+# load the zstat builtin and keep stat external
+zmodload -F zsh/stat b:zstat
+# helper for finding disk drives by their metadata
fs_smartctl_probe() {
(($+smartctl_probed)) && (($smartctl_probed)) && return 0
local dev item val rest
@@ -323,7 +325,7 @@ confz_swapon_check() {
# set up /dev/md* device
confz_mdraid_check() {
local line level out seen_level seen_header devices all_empty
- local -a seen_devices devices
+ local -a seen_devices devices device_numbers
local -A level_map
checkvars md_device raid_devices level
@@ -355,6 +357,11 @@ confz_mdraid_check() {
)
level=${level_map[${vars[level]}]}
+ for device in $devices; do
+ [[ -b $device ]] || die "$0: not a block device: ${(qqq)device}"
+ device_numbers+=( zstat +rdev $device ) || die "$0: could not stat ${(qqq)device}"
+ done
+
if [[ -b $vars[md_device] ]]; then
out=$( mdadm --detail $vars[md_device] ) || \
die "$0: mdadm --detail ${(qqq)vars[md_device]} returned $?"
@@ -368,7 +375,7 @@ confz_mdraid_check() {
seen_header=1;;
esac
else
- seen_devices+=( ${${=line}[-1]} )
+ seen_devices+=( $(( ${${=line}[2]} << 8 + ${${=line}[3]} )) )
fi
done <<<$out
@@ -376,9 +383,9 @@ confz_mdraid_check() {
die "$0: raid level mismatch." \
"expected: ${(q)level} got: ${(q)seen_level}"
- [[ ${(o)vars[raid_devices]} == ${(o)seen_devices} ]] || \
+ [[ ${(o)devices} == ${(o)seen_devices} ]] || \
die $0$': raid device mismatch\nexpected:' \
- ${(oqqq)vars[raid_devices]}$'\ngot:' \
+ ${(oqqq)devices}$'\ngot:' \
${(oqqq)seen_devices}
return 0