aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Maciej Nowak <tomek_n@o2.pl>2019-03-28 18:07:09 +0100
committerHauke Mehrtens <hauke@hauke-m.de>2019-04-06 16:31:10 +0200
commit2e5a0b81ec29a897fde5ca30b0dc95fd28b9d4fb (patch)
treeebbe1bb79a6e3aafa178df77f6588c2edad2aaea
parent4e8345ff68f56e10167c2b7c9109d844c77053bd (diff)
downloadupstream-2e5a0b81ec29a897fde5ca30b0dc95fd28b9d4fb.tar.gz
upstream-2e5a0b81ec29a897fde5ca30b0dc95fd28b9d4fb.tar.bz2
upstream-2e5a0b81ec29a897fde5ca30b0dc95fd28b9d4fb.zip
mvebu: sysupgrade: sdcard: keep user added partitons
Currently sysupgrade overwrites whole disk and destroys partitions added by user. Sync the sysupgrade code with the one present in x86 target to remedy this behaviour. Signed-off-by: Tomasz Maciej Nowak <tomek_n@o2.pl>
-rwxr-xr-xtarget/linux/mvebu/base-files/lib/upgrade/platform.sh9
-rw-r--r--target/linux/mvebu/base-files/lib/upgrade/sdcard.sh74
-rw-r--r--target/linux/mvebu/cortexa53/target.mk2
-rw-r--r--target/linux/mvebu/cortexa72/target.mk2
-rw-r--r--target/linux/mvebu/image/cortex-a9.mk7
5 files changed, 83 insertions, 11 deletions
diff --git a/target/linux/mvebu/base-files/lib/upgrade/platform.sh b/target/linux/mvebu/base-files/lib/upgrade/platform.sh
index e4ccf9d7f2..57b2f00a4c 100755
--- a/target/linux/mvebu/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mvebu/base-files/lib/upgrade/platform.sh
@@ -8,7 +8,14 @@ RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
REQUIRE_IMAGE_METADATA=1
platform_check_image() {
- return 0
+ case "$(board_name)" in
+ armada-385-turris-omnia|armada-388-clearfog-base|armada-388-clearfog-pro|globalscale,espressobin|marvell,armada8040-mcbin)
+ platform_check_image_sdcard "$ARGV"
+ ;;
+ *)
+ return 0
+ ;;
+ esac
}
platform_do_upgrade() {
diff --git a/target/linux/mvebu/base-files/lib/upgrade/sdcard.sh b/target/linux/mvebu/base-files/lib/upgrade/sdcard.sh
index 7aa91f463c..28fad31757 100644
--- a/target/linux/mvebu/base-files/lib/upgrade/sdcard.sh
+++ b/target/linux/mvebu/base-files/lib/upgrade/sdcard.sh
@@ -6,7 +6,7 @@ get_magic_at() {
platform_check_image_sdcard() {
local file="$1"
- local magic
+ local magic diskdev partdev diff
magic=$(get_magic_at "$file" 510)
[ "$magic" != "55aa" ] && {
@@ -14,18 +14,82 @@ platform_check_image_sdcard() {
return 1
}
- return 0;
+ export_bootdevice && export_partdevice diskdev 0 || {
+ echo "Unable to determine upgrade device"
+ return 1
+ }
+
+ get_partitions "/dev/$diskdev" bootdisk
+
+ #extract the boot sector from the image
+ get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
+
+ get_partitions /tmp/image.bs image
+
+ #compare tables
+ diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
+
+ rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
+
+ if [ -n "$diff" ]; then
+ echo "Partition layout has changed. Full image will be written."
+ ask_bool 0 "Abort" && exit 1
+ return 0
+ fi
}
platform_do_upgrade_sdcard() {
local board=$(board_name)
- local diskdev
+ local diskdev partdev diff
+
+ export_bootdevice && export_partdevice diskdev 0 || {
+ echo "Unable to determine upgrade device"
+ return 1
+ }
sync
- if export_bootdevice && export_partdevice diskdev 0; then
- get_image "$1" | dd of=/dev/$diskdev bs=2M conv=fsync
+
+ if [ "$SAVE_PARTITIONS" = "1" ]; then
+ get_partitions "/dev/$diskdev" bootdisk
+
+ #extract the boot sector from the image
+ get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
+
+ get_partitions /tmp/image.bs image
+
+ #compare tables
+ diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
+ else
+ diff=1
+ fi
+
+ if [ -n "$diff" ]; then
+ get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
+
+ # Separate removal and addtion is necessary; otherwise, partition 1
+ # will be missing if it overlaps with the old partition 2
+ partx -d - "/dev/$diskdev"
+ partx -a - "/dev/$diskdev"
+
+ return 0
fi
+ #write uboot image
+ get_image "$@" | dd of="$diskdev" bs=512 skip=1 seek=1 count=2048 conv=fsync
+ #iterate over each partition from the image and write it to the boot disk
+ while read part start size; do
+ if export_partdevice partdev $part; then
+ echo "Writing image to /dev/$partdev..."
+ get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
+ else
+ echo "Unable to find partition $part device, skipped."
+ fi
+ done < /tmp/partmap.image
+
+ #copy partition uuid
+ echo "Writing new UUID to /dev/$diskdev..."
+ get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
+
case "$board" in
armada-385-turris-omnia)
fw_setenv openwrt_bootargs 'earlyprintk console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=auto rootwait'
diff --git a/target/linux/mvebu/cortexa53/target.mk b/target/linux/mvebu/cortexa53/target.mk
index d420fd9f59..fe89d08ffa 100644
--- a/target/linux/mvebu/cortexa53/target.mk
+++ b/target/linux/mvebu/cortexa53/target.mk
@@ -11,6 +11,6 @@ ARCH:=aarch64
BOARDNAME:=Marvell Armada 3700LP (ARM64)
CPU_TYPE:=cortex-a53
FEATURES+=ext4
-DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs
+DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs partx-utils
KERNELNAME:=Image dtbs
diff --git a/target/linux/mvebu/cortexa72/target.mk b/target/linux/mvebu/cortexa72/target.mk
index a9384f3fa6..540ef1104f 100644
--- a/target/linux/mvebu/cortexa72/target.mk
+++ b/target/linux/mvebu/cortexa72/target.mk
@@ -11,6 +11,6 @@ ARCH:=aarch64
BOARDNAME:=Marvell Armada 7k/8k (ARM64)
CPU_TYPE:=cortex-a72
FEATURES+=ext4
-DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs
+DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs partx-utils
KERNELNAME:=Image dtbs
diff --git a/target/linux/mvebu/image/cortex-a9.mk b/target/linux/mvebu/image/cortex-a9.mk
index 9d84283525..66cf54f9c5 100644
--- a/target/linux/mvebu/image/cortex-a9.mk
+++ b/target/linux/mvebu/image/cortex-a9.mk
@@ -126,7 +126,7 @@ define Device/armada-388-clearfog-pro
KERNEL_INSTALL := 1
KERNEL := kernel-bin
DEVICE_TITLE := SolidRun ClearFog Pro
- DEVICE_PACKAGES := mkf2fs e2fsprogs swconfig
+ DEVICE_PACKAGES := mkf2fs e2fsprogs partx-utils swconfig
IMAGES := sdcard.img.gz
IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata
DEVICE_DTS := armada-388-clearfog-pro armada-388-clearfog-base
@@ -139,7 +139,7 @@ define Device/armada-388-clearfog-base
KERNEL_INSTALL := 1
KERNEL := kernel-bin
DEVICE_TITLE := SolidRun ClearFog Base
- DEVICE_PACKAGES := mkf2fs e2fsprogs
+ DEVICE_PACKAGES := mkf2fs e2fsprogs partx-utils
IMAGES := sdcard.img.gz
IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata
DEVICE_DTS := armada-388-clearfog-pro armada-388-clearfog-base
@@ -162,7 +162,8 @@ define Device/turris-omnia
DEVICE_TITLE := Turris Omnia
DEVICE_PACKAGES := \
mkf2fs e2fsprogs kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 \
- wpad-basic kmod-ath9k kmod-ath10k-ct ath10k-firmware-qca988x-ct
+ wpad-basic kmod-ath9k kmod-ath10k-ct ath10k-firmware-qca988x-ct \
+ partx-utils
IMAGES := $$(IMAGE_PREFIX)-sysupgrade.img.gz omnia-medkit-$$(IMAGE_PREFIX)-initramfs.tar.gz
IMAGE/$$(IMAGE_PREFIX)-sysupgrade.img.gz := boot-img | sdcard-img | gzip | append-metadata
IMAGE/omnia-medkit-$$(IMAGE_PREFIX)-initramfs.tar.gz := omnia-medkit-initramfs | gzip