Bug#442236: updated patch
Hi Frans
On Tue, Feb 26, 2008 at 04:53:52PM +0100, Frans Pop wrote:
> On Tuesday 26 February 2008, Guido Günther wrote:
> > attached is an updated patch against current partman-base. I attach an
> > updated version for review since it contains a template which might be
> > interesting for translators
>
> There are two (minor) issues in:
I've attached an updated patch. Thanks for the comments.
Cheers,
-- Guido
>From 40d553ebe5fd9189b110dfd70c44b42f17349d4a Mon Sep 17 00:00:00 2001
From: Guido Guenther <agx@sigxcpu.org>
Date: Tue, 26 Feb 2008 15:37:47 +0100
Subject: [PATCH] teach partman base about multipath ed devices (Closes: #442236)
also addressing Frans Pop's concerns
---
.../partman-base/debian/partman-base.templates | 8 ++++
packages/partman/partman-base/init.d/parted | 23 +++++++++++
packages/partman/partman-base/lib/base.sh | 42 +++++++++++++++++--
packages/partman/partman-base/lib/commit.sh | 9 +++-
4 files changed, 75 insertions(+), 7 deletions(-)
diff --git a/packages/partman/partman-base/debian/partman-base.templates b/packages/partman/partman-base/debian/partman-base.templates
index 5bd5e87..001301e 100644
--- a/packages/partman/partman-base/debian/partman-base.templates
+++ b/packages/partman/partman-base/debian/partman-base.templates
@@ -295,6 +295,14 @@ Type: text
# :sl3:
_Description: Serial ATA RAID %s (partition #%s)
+Template: partman/text/multipath
+Type: text
+_Description: Multipath %s (WWID %s)
+
+Template: partman/text/multipath_partition
+Type: text
+_Description: Multipath %s Partition #%s
+
Template: partman/text/lvm_lv
Type: text
# :sl3:
diff --git a/packages/partman/partman-base/init.d/parted b/packages/partman/partman-base/init.d/parted
index b10781b..388d29a 100755
--- a/packages/partman/partman-base/init.d/parted
+++ b/packages/partman/partman-base/init.d/parted
@@ -16,6 +16,25 @@ part_of_sataraid () {
return 1
}
+part_of_multipath() {
+ local mpdev
+ type multipath >/dev/null 2>&1 || return 1
+
+ if multipath_part $1; then
+ return 0
+ fi
+ # The block devices that make up the multipath:
+ # Output looks like \_ 4:0:0:1 sdc 8:32 ...
+ for mpdev in $(multipath -l | \
+ grep '_ \([0-9]\+:\)\{3\}[0-9]\+ sd[a-z]\+ [0-9]\+:[0-9]\+' | \
+ cut -f4 -d' '); do
+ if [ "$(readlink -f /dev/$mpdev)" = $1 ]; then
+ return 0
+ fi
+ done
+ return 1
+}
+
if [ ! -f /var/run/parted_server.pid ]; then
mkdir -p /var/run
parted_server
@@ -24,6 +43,10 @@ if [ ! -f /var/run/parted_server.pid ]; then
# TODO: How do we signal we couldn't start parted_server properly?
exit $RET
fi
+ # Skip devices that are part of a multipathed device
+ if part_of_multipath $partdev; then
+ continue
+ fi
rm -rf /var/lib/partman/old_devices
if [ -d $DEVICES ]; then
diff --git a/packages/partman/partman-base/lib/base.sh b/packages/partman/partman-base/lib/base.sh
index 1d973cd..d3871e8 100644
--- a/packages/partman/partman-base/lib/base.sh
+++ b/packages/partman/partman-base/lib/base.sh
@@ -496,9 +496,34 @@ memfree () {
fi
}
+# return the device mapper table type
+dm_table () {
+ type=""
+ if [ -x /sbin/dmsetup ]; then
+ type=$(/sbin/dmsetup table "$1" | head -n 1 | cut -d " " -f3)
+ fi
+ echo $type
+}
+
+# Check if a device is a partition on a multipath'ed device by checking if
+# the corresponding multipath map exists
+is_multipath_part () {
+ type multipath >/dev/null 2>&1 || return 1
+
+ type=$(dm_table $1)
+ [ "$type" = linear ] || return 1
+ name=$(dmsetup info --noheadings -c -oname "$1")
+
+ mp=${name%-part*}
+ if [ $(multipath -l $mp | wc -l) -gt 0 ]; then
+ return 0
+ fi
+ return 1
+}
+
# TODO: this should not be global
humandev () {
- local host bus target part lun idenum targtype scsinum linux
+ local host bus target part lun idenum targtype scsinum linux wwid
case "$1" in
/dev/ide/host*/bus[01]/target[01]/lun0/disc)
host=`echo $1 | sed 's,/dev/ide/host\(.*\)/bus.*/target[01]/lun0/disc,\1,'`
@@ -698,10 +723,7 @@ humandev () {
printf "$RET" ${type} ${device}
;;
/dev/mapper/*)
- type=""
- if [ -x /sbin/dmsetup ]; then
- type=$(/sbin/dmsetup table "$1" | head -n 1 | cut -d " " -f3)
- fi
+ type=$(dm_table "$1")
# First check for Serial ATA RAID devices
if type dmraid >/dev/null 2>&1; then
@@ -732,6 +754,16 @@ humandev () {
mapping=${1#/dev/mapper/}
db_metaget partman/text/dmcrypt_volume description
printf "$RET" $mapping
+ elif [ "$type" = multipath ]; then
+ device=${1#/dev/mapper/}
+ wwid=$(multipath -l ${device} | head -n 1 | sed "s/^${device} \+(\([a-f0-9]\+\)).*/\1/")
+ db_metaget partman/text/multipath description
+ printf "$RET" ${device} ${wwid}
+ elif is_multipath_part $1; then
+ part=$(echo "$1" | sed 's%.*-part\([0-9]\+\)$%\1%')
+ device=$(echo "$1" | sed 's%/dev/mapper/\(.*\)-part[0-9]\+$%\1%')
+ db_metaget partman/text/multipath_partition description
+ printf "$RET" ${device} ${part}
else
# LVM2 devices are found as /dev/mapper/<vg>-<lv>. If the vg
# or lv contains a dash, the dash is replaced by two dashes.
diff --git a/packages/partman/partman-base/lib/commit.sh b/packages/partman/partman-base/lib/commit.sh
index 6ab7ede..f5ccfe9 100644
--- a/packages/partman/partman-base/lib/commit.sh
+++ b/packages/partman/partman-base/lib/commit.sh
@@ -52,8 +52,13 @@ confirm_changes () {
filesystem=$(cat $id/visual_filesystem)
# Special case d-m devices to use a different description
if cat device | grep -q "/dev/mapper" ; then
- partdesc="partman/text/confirm_unpartitioned_item"
- else
+ type=$(dm_table $device)
+ # multipath devices are partitioned
+ if [ "$type" != multipath ] && ! is_multipath_part $device; then
+ partdesc="partman/text/confirm_unpartitioned_item"
+ fi
+ fi
+ if [ -z "$partdesc" ]; then
partdesc="partman/text/confirm_item"
db_subst $partdesc PARTITION "$num"
fi
--
1.5.4.2
Reply to: