probes: reuse existing slot mounts; explicit -t ext4

The image's fstab keeps the factory slots mounted under /factory, and
busybox mount's auto-type iteration against an already-mounted ext4
device provokes a cosmetic kernel 'Can't open blockdev' for each
foreign-type claim (reproduced and pinned on the bench: ext3-typed
mount of an ext4-held device prints it; ext4-typed does not). Probes
now reuse an existing mountpoint from /proc/mounts and mount fresh
targets with an explicit -t ext4.
This commit is contained in:
ScottW514
2026-08-08 13:13:20 -04:00
parent 42a01940f1
commit 0f5dec57e9
2 changed files with 26 additions and 13 deletions
+15 -6
View File
@@ -48,16 +48,25 @@ BOOTED_ROOT=$(sed -n 's/.*root=\([^ ]*\).*/\1/p' /proc/cmdline)
# P_VERSION P_KERNEL(yes|no) # P_VERSION P_KERNEL(yes|no)
probe_part () { probe_part () {
P_PRESENT=no; P_STATE=unreadable; P_TYPE=unknown; P_VERSION=""; P_KERNEL=no P_PRESENT=no; P_STATE=unreadable; P_TYPE=unknown; P_VERSION=""; P_KERNEL=no
P_MOUNTED=""
[ -b "$1" ] || return 1 [ -b "$1" ] || return 1
P_PRESENT=yes P_PRESENT=yes
if [ "$1" = "$BOOTED_ROOT" ]; then if [ "$1" = "$BOOTED_ROOT" ]; then
ROOT_DIR="" ROOT_DIR=""
else else
ROOT_DIR="/tmp/ffboot.probe.$$" # Reuse an existing mount (the image keeps the factory slots mounted
mkdir -p "$ROOT_DIR" # under /factory); a fresh mount is explicit -t ext4 - letting mount
if ! mount -o ro "$1" "$ROOT_DIR" 2>/dev/null; then # iterate types provokes a cosmetic kernel "Can't open blockdev" for
rmdir "$ROOT_DIR" 2>/dev/null # each foreign-type claim against an already-mounted device.
return 1 ROOT_DIR=$(sed -n "s|^$1 \([^ ]*\).*|\1|p" /proc/mounts | head -n 1)
if [ -z "$ROOT_DIR" ]; then
ROOT_DIR="/tmp/ffboot.probe.$$"
P_MOUNTED=yes
mkdir -p "$ROOT_DIR"
if ! mount -o ro -t ext4 "$1" "$ROOT_DIR" 2>/dev/null; then
rmdir "$ROOT_DIR" 2>/dev/null
return 1
fi
fi fi
fi fi
if [ -f "$ROOT_DIR/etc/forgefirm-version" ]; then if [ -f "$ROOT_DIR/etc/forgefirm-version" ]; then
@@ -70,7 +79,7 @@ probe_part () {
P_STATE=empty P_STATE=empty
fi fi
[ -f "$ROOT_DIR/boot/zImage" ] && P_KERNEL=yes [ -f "$ROOT_DIR/boot/zImage" ] && P_KERNEL=yes
if [ -n "$ROOT_DIR" ]; then if [ -n "$P_MOUNTED" ]; then
umount "$ROOT_DIR" 2>/dev/null umount "$ROOT_DIR" 2>/dev/null
rmdir "$ROOT_DIR" 2>/dev/null rmdir "$ROOT_DIR" 2>/dev/null
fi fi
+11 -7
View File
@@ -76,21 +76,25 @@ archive_dev () {
# read-only under /tmp (newer factory firmware has no /factory/imgN # read-only under /tmp (newer factory firmware has no /factory/imgN
# mounts, and the rootfs is read-only). # mounts, and the rootfs is read-only).
slot_probe () { slot_probe () {
S_TYPE=unknown; S_VER="" S_TYPE=unknown; S_VER=""; S_MOUNTED=""
if [ "$1" = "$ACTIVE" ]; then if [ "$1" = "$ACTIVE" ]; then
RD="" RD=""
else else
RD="/tmp/ffinstall.probe.$$" RD=$(sed -n "s|^/dev/mmcblk2p$1 \([^ ]*\).*|\1|p" /proc/mounts | head -n 1)
mkdir -p "$RD" || return 1 if [ -z "$RD" ]; then
mount -o ro "/dev/mmcblk2p$1" "$RD" 2>/dev/null \ RD="/tmp/ffinstall.probe.$$"
|| { rmdir "$RD" 2>/dev/null; return 1; } S_MOUNTED=yes
mkdir -p "$RD" || return 1
mount -o ro -t ext4 "/dev/mmcblk2p$1" "$RD" 2>/dev/null \
|| { rmdir "$RD" 2>/dev/null; return 1; }
fi
fi fi
if [ -f "$RD/etc/forgefirm-version" ]; then if [ -f "$RD/etc/forgefirm-version" ]; then
S_TYPE=forgefirm; S_VER=$(cat "$RD/etc/forgefirm-version") S_TYPE=forgefirm; S_VER=$(cat "$RD/etc/forgefirm-version")
elif [ -f "$RD/etc/version" ]; then elif [ -f "$RD/etc/version" ]; then
S_TYPE=factory; S_VER=$(cat "$RD/etc/version") S_TYPE=factory; S_VER=$(cat "$RD/etc/version")
fi fi
if [ -n "$RD" ]; then if [ -n "$S_MOUNTED" ]; then
umount "$RD" 2>/dev/null umount "$RD" 2>/dev/null
rmdir "$RD" 2>/dev/null rmdir "$RD" 2>/dev/null
fi fi
@@ -235,7 +239,7 @@ rm -f "$KEYFILE"
# --- post-write verify -------------------------------------------------------- # --- post-write verify --------------------------------------------------------
MP="/tmp/ffinstall.verify.$$" MP="/tmp/ffinstall.verify.$$"
mkdir -p "$MP" mkdir -p "$MP"
mount -o ro "/dev/mmcblk2p$TARGET" "$MP" || die "new rootfs does not mount" mount -o ro -t ext4 "/dev/mmcblk2p$TARGET" "$MP" || die "new rootfs does not mount"
NEWVER=$(cat "$MP/etc/forgefirm-version" 2>/dev/null) NEWVER=$(cat "$MP/etc/forgefirm-version" 2>/dev/null)
[ -n "$NEWVER" ] || { umount "$MP"; die "new rootfs has no ForgeFIRM version stamp"; } [ -n "$NEWVER" ] || { umount "$MP"; die "new rootfs has no ForgeFIRM version stamp"; }
[ -f "$MP/boot/zImage" ] || { umount "$MP"; die "new rootfs has no kernel"; } [ -f "$MP/boot/zImage" ] || { umount "$MP"; die "new rootfs has no kernel"; }