commit:     19d8a784c9618926a4740c43fcc40ebb1bb5bf8b
Author:     Robin H. Johnson <robbat2 <AT> gentoo <DOT> org>
AuthorDate: Tue Jan  5 19:35:01 2016 +0000
Commit:     Robin H. Johnson <robbat2 <AT> gentoo <DOT> org>
CommitDate: Tue Jan  5 19:37:58 2016 +0000
URL:        https://gitweb.gentoo.org/proj/genkernel.git/commit/?id=19d8a784

multipath: find the needed binaries and fail visibly

While making dolvm safer per commit 7316481040, I noticed that multipath
had the same issue: /sbin/dmsetup was called, but the binary was
actually at /bin/dmsetup. Prevent this by detecting the binary location
if possible, and failing gracefully if not found.

Signed-off-by: Robin H. Johnson <robbat2 <AT> gentoo.org>

 defaults/initrd.scripts | 28 ++++++++++++++++++++++------
 gen_initramfs.sh        |  4 ++--
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/defaults/initrd.scripts b/defaults/initrd.scripts
index 94cb0cc..763468a 100644
--- a/defaults/initrd.scripts
+++ b/defaults/initrd.scripts
@@ -961,12 +961,28 @@ startVolumes() {
 
        if [ "${USE_MULTIPATH_NORMAL}" = '1' ] 
        then 
-               good_msg "Scanning for multipath devices" 
-               /sbin/multipath -v 0
-               sleep 2
-               good_msg "Activating multipath devices" 
-               /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -v" 
-               #for MULTIPATH_VOLUMES in /dev/mapper/*; do kpartx -a 
$MULTIPATH_VOLUMES; done
+               for multipath_path in /sbin/multipath /bin/multipath MISSING ; 
do
+                       [ -x "$multipath_path " ] && break
+               fi
+               for dmsetup_path in /sbin/dmsetup /bin/dmsetup MISSING ; do
+                       [ -x "$dmsetup_path " ] && break
+               fi
+               for kpartx_path in /sbin/kpartx /bin/kpartx MISSING ; do
+                       [ -x "$kpartx_path " ] && break
+               fi
+               fail=0
+               ["${multipath_path}" = "MISSING" ] && fail=1 && bad_msg 
"domultipath called, but multipath binary missing! Skipping multipath"
+               ["${dmsetup_path}" = "MISSING" ] && fail=1 && bad_msg 
"domultipath called, but dmsetup binary missing! Skipping multipath"
+               ["${kpartx_path}" = "MISSING" ] && fail=1 && bad_msg 
"domultipath called, but kpartx binary missing! Skipping multipath"
+               if [ "$fail" = "0" ]
+               then
+                       good_msg "Scanning for multipath devices"
+                       $multipath_path  -v 0
+                       sleep 2
+                       good_msg "Activating multipath devices"
+                       $dmsetup_path ls --target multipath --exec 
"$kpartx_path -a -v"
+                       #for MULTIPATH_VOLUMES in /dev/mapper/*; do 
$kpartx_path -a $MULTIPATH_VOLUMES; done
+               fi
        fi 
 
        if [ "${USE_DMRAID_NORMAL}" = '1' ]

diff --git a/gen_initramfs.sh b/gen_initramfs.sh
index 7dce2cf..4420b0b 100755
--- a/gen_initramfs.sh
+++ b/gen_initramfs.sh
@@ -374,8 +374,8 @@ append_lvm(){
                # Now move the static binaries into good places.
                mv ${TEMP}/initramfs-lvm-temp/sbin/lvm.static 
${TEMP}/initramfs-lvm-temp/sbin/lvm ||
                        gen_die 'LVM error: Could not move lvm.static to lvm!'
-               # See bug 382555
-               mv ${TEMP}/initramfs-lvm-temp/sbin/dmsetup.static 
${TEMP}/initramfs-lvm-temp/bin/dmsetup ||
+               # See bug 382555; use /sbin/dmsetup to match multipath code
+               mv ${TEMP}/initramfs-lvm-temp/sbin/dmsetup.static 
${TEMP}/initramfs-lvm-temp/sbin/dmsetup ||
                        gen_die 'LVM error: Could not move dmsetup.static to 
dmsetup!'
                # Clean up other stuff we don't need
                rm -rf 
${TEMP}/initramfs-lvm-temp/{lib*,share,man,include,sbin/dmeventd.static}

Reply via email to