base-files: emmc: invalidate kernel image while rootfs is being written
authorRodrigo Balerdi <lanchon@gmail.com>
Tue, 24 Sep 2024 06:51:43 +0000 (03:51 -0300)
committerDaniel Golle <daniel@makrotopia.org>
Fri, 27 Sep 2024 17:24:44 +0000 (18:24 +0100)
Some setups have alternate boot actions in case the main OS fails to
boot. These can include a secondary copy of the OS, a recovery OS, a
fallback to TFTP boot, etc.

This commit invalidates the kernel image while rootfs is being written
which, if a sysupgrade is interrupted, will trigger an alternate boot
action in devices that support it. This results in safer sysupgrades.

Signed-off-by: Rodrigo Balerdi <lanchon@gmail.com>
package/base-files/files/lib/upgrade/emmc.sh

index 49cffe1c658b338e04081e69fcfef494cd848874..78e398d6d55a458de3de5044b6dcd415362273aa 100644 (file)
@@ -16,15 +16,22 @@ emmc_upgrade_tar() {
        tar tf "$tar_file" ${board_dir}/kernel 1>/dev/null 2>/dev/null && has_kernel=1
        tar tf "$tar_file" ${board_dir}/root 1>/dev/null 2>/dev/null && has_rootfs=1
 
-       [ "$has_kernel" = 1 -a "$EMMC_KERN_DEV" ] &&
-               export EMMC_KERNEL_BLOCKS=$(($(tar xf "$tar_file" ${board_dir}/kernel -O | dd of="$EMMC_KERN_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1)))
-
        [ "$has_rootfs" = 1 -a "$EMMC_ROOT_DEV" ] && {
+               # Invalidate kernel image while rootfs is being written
+               [ "$has_kernel" = 1 -a "$EMMC_KERN_DEV" ] && {
+                       dd if=/dev/zero of="$EMMC_KERN_DEV" bs=512 count=8
+                       sync
+               }
+
                export EMMC_ROOTFS_BLOCKS=$(($(tar xf "$tar_file" ${board_dir}/root -O | dd of="$EMMC_ROOT_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1)))
                # Account for 64KiB ROOTDEV_OVERLAY_ALIGN in libfstools
                EMMC_ROOTFS_BLOCKS=$(((EMMC_ROOTFS_BLOCKS + 127) & ~127))
+               sync
        }
 
+       [ "$has_kernel" = 1 -a "$EMMC_KERN_DEV" ] &&
+               export EMMC_KERNEL_BLOCKS=$(($(tar xf "$tar_file" ${board_dir}/kernel -O | dd of="$EMMC_KERN_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1)))
+
        if [ -z "$UPGRADE_BACKUP" ]; then
                if [ "$EMMC_DATA_DEV" ]; then
                        dd if=/dev/zero of="$EMMC_DATA_DEV" bs=512 count=8