tags 603319 pending thanks Hello,
On pirmadienis 06 Gruodis 2010 20:59:52 Modestas Vainius wrote: > Like previously [2], feel free to do a maintainer upload or I will NMU in > two weeks from now. Two weeks is almost up. I have just uploaded dmraid 1.0.0.rc16-4.1 NMU to DELAYED/2-day. NMU diff is attached. You may also pull my NMU changes directly from my git repository. $ git pull git://git.debian.org/users/modax/dmraid.git master:master -- Modestas Vainius <[email protected]>
diff -u dmraid-1.0.0.rc16/debian/dmraid-activate dmraid-1.0.0.rc16/debian/dmraid-activate
--- dmraid-1.0.0.rc16/debian/dmraid-activate
+++ dmraid-1.0.0.rc16/debian/dmraid-activate
@@ -116,13 +116,18 @@
fi
}
-ddf1_virtual_drive_guids()
+ddf1_virtual_drive_names()
{
- ddf1_awk_script=$(cat <<'EOF'
+ ddf1_awk_script="$(cat <<'EOF'
BEGIN {
section = ""
disk_ref = ""
guid_i = 0
+
+ # Heximal to decimal conversion array
+ for (i = 0; i <= 9; i++) hex2dec[i] = i
+ hex2dec["a"] = 10; hex2dec["b"] = 11; hex2dec["c"] = 12
+ hex2dec["e"] = 13; hex2dec["d"] = 14; hex2dec["f"] = 15;
}
function section_begins(name)
@@ -132,6 +137,42 @@
drive_map = 0
}
+function extract_vd_guid(line, g)
+{
+ g = substr(line, match(line,/\[[0-9a-f ]+\]$/)+1, RLENGTH-2)
+ gsub(/ /, "", g)
+ # IF LSI, do timestamp substitution to get persistent name, see
+ # 19_ddf1_lsi_persistent_name.patch
+ if (g ~ /^4c5349/)
+ g = substr(g, 1, 32) "47114711" substr(g, 41)
+ return g
+}
+
+function extract_vd_name(line, hex, n, max, i, d1, d2, sed)
+{
+ n = tolower(substr(line, match(line,/\[[0-9a-f ]+\]$/)+1, RLENGTH-2))
+ max = split(n, hex, / /)
+
+ if (max <= 0 || hex[0] == "00") return ""
+
+ # Convert name from hex to string (16 bytes)
+ n = ""
+ for (i = 1; i <= max; i++) {
+ d1 = hex2dec[substr(hex[i], 1, 1)]
+ d2 = hex2dec[substr(hex[i], 2, 1)]
+ if ((d1 + d2) == 0) break
+ n = n sprintf("%c", d1 * 16 + d2)
+ }
+ # Shell-escape single quotes in the name
+ gsub(/'/,"'\\''", n)
+ # Finally strip non-graph chars from the end of the string
+ # mawk does not support character classes. Use sed.
+ sed = "echo '" n "' | sed 's/[^[:graph:]]\+$//'"
+ sed | getline n
+ close(sed)
+ return n
+}
+
{
if (!/^0x/ && / at /) {
# Section begins
@@ -140,31 +181,45 @@
disk_ref = $3
sub(/^0x/, "", disk_ref)
} else if (disk_ref) {
- if (section == "Virtual Drive Config Record" && /^0x008 guid:/) {
- vd_guid = substr($0, match($0,/\[[0-9a-f ]+\]$/)+1, RLENGTH-2)
- gsub(/ /, "", vd_guid)
- # IF LSI, do timestamp substitution to get persistent name, see
- # 19_ddf1_lsi_persistent_name.patch
- if (vd_guid ~ /^4c5349/)
- vd_guid = substr(vd_guid, 1, 32) "47114711" substr(vd_guid, 41)
- } else if (drive_map) {
- # 0: 4BCBB980 @ 0
- if ($2 == disk_ref) {
- guids[guid_i] = vd_guid
- guid_i++
+ # We need to parse 'Virtual Drive' sections in order to extract VD
+ # names
+ if (section == "Virtual Drive") {
+ if (/^0x000 guid:/) {
+ vd_guid = extract_vd_guid($0)
+ } else if (/^0x030 name:/) {
+ vd_name = extract_vd_name($0)
+ if (vd_name)
+ vd_names[vd_guid] = vd_name
+ }
+ } else if (section == "Virtual Drive Config Record") {
+ if (/^0x008 guid:/) {
+ vd_guid = extract_vd_guid($0)
+ } else if (drive_map) {
+ # 0: 4BCBB980 @ 0
+ if ($2 == disk_ref) {
+ guids[guid_i] = vd_guid
+ guid_i++
+ }
+ } else if (vd_guid) {
+ drive_map = /^Drive map:/
}
- } else if (vd_guid) {
- drive_map = /^Drive map:/
}
}
}
END {
- # Print discovered virtual drive GUIDs which belong to this physical drive
- for (guid in guids)
- print guids[guid]
+ # Print discovered virtual drive names (or GUIDs) which belong to this
+ # physical drive
+ for (guid_i in guids) {
+ guid = guids[guid_i]
+ if (guid in vd_names) {
+ print vd_names[guid]
+ } else {
+ print guid
+ }
+ }
}
EOF
-)
+)"
dmraid -i -n "$1" | awk "$ddf1_awk_script"
}
@@ -193,6 +248,9 @@
exit 0
fi
+newline="
+"
+
case "$Raid_Name" in
isw_*)
# We need a special case for isw arrays, since it is possible to have several
@@ -208,13 +266,20 @@
;;
.ddf1_disks)
# Dummy name for the main DDF1 group. Needs special handling to
- # find RAID subsets for this physical drive
- Ddf1_guids=`ddf1_virtual_drive_guids "/dev/$Node_Name"`
+ # find RAID subsets (name or GUID) for this physical drive
+ Ddf1_names=`ddf1_virtual_drive_names "/dev/$Node_Name"`
- for ddf1_guid in $Ddf1_guids
+ # Returned names might contain space characters. Therefore
+ # split fields at new line. Use $IFS to avoid forking a new shell
+ save_IFS="$IFS"
+ IFS="$newline"
+ for ddf1_name in $Ddf1_names
do
- activate_array "ddf1_${ddf1_guid}"
+ IFS="$save_IFS"
+ activate_array "ddf1_${ddf1_name}"
+ IFS="$newline"
done
+ IFS="$save_IFS"
break
;;
*)
diff -u dmraid-1.0.0.rc16/debian/changelog dmraid-1.0.0.rc16/debian/changelog
--- dmraid-1.0.0.rc16/debian/changelog
+++ dmraid-1.0.0.rc16/debian/changelog
@@ -1,3 +1,11 @@
+dmraid (1.0.0.rc16-4.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * dmraid-active: properly handle the case when DDF1 virtual drive has a name.
+ (Closes: #603319)
+
+ -- Modestas Vainius <[email protected]> Sat, 18 Dec 2010 22:26:41 +0200
+
dmraid (1.0.0.rc16-4) unstable; urgency=low
[ Modestas Vainius ]
signature.asc
Description: This is a digitally signed message part.

