From c4022e6199a3337d6e4d733106d5cf3879e0b35b Mon Sep 17 00:00:00 2001 From: Rodrigo Balerdi Date: Tue, 24 Sep 2024 03:51:43 -0300 Subject: [PATCH] base-files: emmc: invalidate kernel image while rootfs is being written 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 --- package/base-files/files/lib/upgrade/emmc.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/package/base-files/files/lib/upgrade/emmc.sh b/package/base-files/files/lib/upgrade/emmc.sh index 49cffe1c658b..78e398d6d55a 100644 --- a/package/base-files/files/lib/upgrade/emmc.sh +++ b/package/base-files/files/lib/upgrade/emmc.sh @@ -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 -- 2.30.2