x86_64: fix invoking sysupgrade on PARTUUID mounted system
authorJo-Philipp Wich <jow@openwrt.org>
Sun, 19 Oct 2014 20:28:43 +0000 (20:28 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sun, 19 Oct 2014 20:28:43 +0000 (20:28 +0000)
Fix sysupgrade to determine the correct boot block device to use if
/proc/cmdline contains a PARTUUID root.

Change the preinit move_config() hook to use the UUID scanning code
from sysupgrade in order to avoid code duplication.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
SVN-Revision: 42968

target/linux/x86_64/base-files/lib/preinit/79_move_config
target/linux/x86_64/base-files/lib/upgrade/platform.sh

index 0b9b49fee3235e53143e29cd5c212c9988f9cb76..cdcf683a22eaef142351f59654b3ebd1a5df40b5 100644 (file)
@@ -2,40 +2,10 @@
 # Copyright (C) 2012-2014 OpenWrt.org
 
 move_config() {
-       local cmdline uuid disk dev
+       . /lib/upgrade/platform.sh
 
-       if read cmdline < /proc/cmdline; then
-               case "$cmdline" in
-                       *block2mtd=*)
-                               disk="${cmdline##*block2mtd=}"
-                               disk="${disk%%,*}"
-                       ;;
-                       *root=*)
-                               disk="${cmdline##*root=}"
-                               disk="${disk%% *}"
-                       ;;
-               esac
-
-               case "$disk" in
-                       PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
-                               uuid="${cmdline#PARTUUID=}"
-                               uuid="${uuid%-02}"
-                               for disk in /dev/[hsv]d[a-z]; do
-                                       set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
-                                       if [ "$4$3$2$1" = "$uuid" ]; then
-                                               dev="${disk}1"
-                                               break
-                                       fi
-                               done
-                       ;;
-                       /dev/*)
-                               dev="${disk%[0-9]}1"
-                       ;;
-               esac
-       fi
-
-       if [ -n "$dev" ]; then
-               mount -t ext4 -o rw,noatime "$dev" /mnt
+       if platform_export_bootpart; then
+               mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
                mv -f /mnt/sysupgrade.tgz /
                umount /mnt
        fi
index a2dd20a8810902661f54623fb6a55d7b4e6e07ff..73ab5ef0794c942495d18865fa2c2498b84e63e6 100644 (file)
@@ -1,16 +1,38 @@
-x86_get_rootfs() {
-       local rootfsdev
-       local rootfstype
-       
-       rootfstype="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "rootfstype") { print $2 }' < /proc/cmdline)"
-       case "$rootfstype" in
-               squashfs|jffs2)
-                       rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "block2mtd.block2mtd") { print substr($2,1,index($2, ",")-1) }' < /proc/cmdline)";;
-               ext4)
-                       rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "root") { print $2 }' < /proc/cmdline)";;
-       esac
-               
-       echo "$rootfstype:$rootfsdev"
+platform_export_bootpart() {
+       local cmdline uuid disk
+
+       if read cmdline < /proc/cmdline; then
+               case "$cmdline" in
+                       *block2mtd=*)
+                               disk="${cmdline##*block2mtd=}"
+                               disk="${disk%%,*}"
+                       ;;
+                       *root=*)
+                               disk="${cmdline##*root=}"
+                               disk="${disk%% *}"
+                       ;;
+               esac
+
+               case "$disk" in
+                       PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
+                               uuid="${disk#PARTUUID=}"
+                               uuid="${uuid%-02}"
+                               for disk in /dev/[hsv]d[a-z]; do
+                                       set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
+                                       if [ "$4$3$2$1" = "$uuid" ]; then
+                                               export BOOTPART="${disk}1"
+                                               return 0
+                                       fi
+                               done
+                       ;;
+                       /dev/*)
+                               export BOOTPART="${disk%[0-9]}1"
+                               return 0
+                       ;;
+               esac
+       fi
+
+       return 1
 }
 
 platform_check_image() {
@@ -26,19 +48,19 @@ platform_check_image() {
 }
 
 platform_copy_config() {
-       local rootfs="$(x86_get_rootfs)"
-       local rootfsdev="${rootfs##*:}"
-       
-       mount -t ext4 -o rw,noatime "${rootfsdev%[0-9]}1" /mnt
-       cp -af "$CONF_TAR" /mnt/
-       umount /mnt
+       if [ -b "$BOOTPART" ]; then
+               mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
+               cp -af "$CONF_TAR" /mnt/
+               umount /mnt
+       fi
 }
 
 platform_do_upgrade() {
-       local rootfs="$(x86_get_rootfs)"
-       local rootfsdev="${rootfs##*:}"
+       platform_export_bootpart
 
-       sync
-       [ -b ${rootfsdev%[0-9]} ] && get_image "$@" | dd of=${rootfsdev%[0-9]} bs=4096 conv=fsync
-       sleep 1
+       if [ -b "${BOOTPART%[0-9]}" ]; then
+               sync
+               get_image "$@" | dd of="${BOOTPART%[0-9]}" bs=4096 conv=fsync
+               sleep 1
+       fi
 }