mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-29 20:23:01 +02:00
board/common: mnt: drop tune2fs and speed up mounting
Calling tune2fs for ext4 partitions at boot costs more than one second boot time on 32-bit Arm systems, with very little gain. Dropping this restores the default periodic fsck *and* saves boot time. Instead of calling sgdisk four times, call it only when resizing and instead use sysfs to find named paritions. Saves seconds on boards with weaker CPU and slow media. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
@@ -59,17 +59,9 @@ is_mmc()
|
||||
{
|
||||
[ -n "$mmc" ] && return $mmc
|
||||
|
||||
# Check if primary or secondary partition (our rootfs) is on MMC
|
||||
for label in primary secondary; do
|
||||
devname=$(find_partition_by_label "$label" 2>/dev/null)
|
||||
if [ -n "$devname" ]; then
|
||||
case "$devname" in
|
||||
mmcblk*)
|
||||
mmc=0
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
# Fast sysfs check — avoids triggering the slow partition scan
|
||||
for d in /sys/class/block/mmcblk[0-9]; do
|
||||
[ -d "$d" ] && mmc=0 && return 0
|
||||
done
|
||||
|
||||
mmc=1
|
||||
@@ -78,77 +70,67 @@ is_mmc()
|
||||
|
||||
wait_mmc()
|
||||
{
|
||||
# Try up to 50 times with 0.2s sleep = 10 second timeout
|
||||
for _ in $(seq 50); do
|
||||
if ls /dev/mmcblk* >/dev/null 2>&1; then
|
||||
logger $opt -p user.notice -t "$nm" "MMC device available after delay"
|
||||
return 0
|
||||
fi
|
||||
sleep .2
|
||||
tries=50
|
||||
while [ $tries -gt 0 ]; do
|
||||
for d in /dev/mmcblk[0-9]; do
|
||||
if [ -b "$d" ]; then
|
||||
logger $opt -p user.notice -t "$nm" "MMC device available after delay"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
sleep .2
|
||||
tries=$((tries - 1))
|
||||
done
|
||||
|
||||
logger $opt -p user.warn -t "$nm" "Timeout waiting for MMC device"
|
||||
return 1
|
||||
}
|
||||
|
||||
# This early on we don't have the luxury of /dev/disk/by-label/$1
|
||||
# Read filesystem label from an ext2/3/4 formatted whole disk.
|
||||
# Superblock is at byte 1024, magic 0xEF53 at offset 56, label at 120.
|
||||
# Handles both LE and BE byte order (bi-endian MIPS, etc.)
|
||||
read_ext_label()
|
||||
{
|
||||
magic=$(dd if="$1" bs=1 skip=1080 count=2 2>/dev/null \
|
||||
| od -t x2 -An | tr -d ' \n')
|
||||
case "$magic" in
|
||||
ef53|53ef) ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
|
||||
dd if="$1" bs=1 skip=1144 count=16 2>/dev/null | tr -d '\000'
|
||||
}
|
||||
|
||||
# Look up a block device by its GPT partition name using the kernel's
|
||||
# sysfs uevent data (zero forks). Falls back to reading the ext2/3/4
|
||||
# superblock for whole disks without GPT (e.g., virtual or USB setups).
|
||||
find_partition_by_label()
|
||||
{
|
||||
label="$1"
|
||||
|
||||
for diskpath in /sys/class/block/*; do
|
||||
devname=$(basename "$diskpath")
|
||||
|
||||
# Skip partitions, only check whole disks
|
||||
[ -f "$diskpath/partition" ] && continue
|
||||
|
||||
# Skip ram, loop, and other virtual devices
|
||||
case "$devname" in
|
||||
ram*|loop*|nullb*|dm-*) continue ;;
|
||||
esac
|
||||
|
||||
disk="/dev/$devname"
|
||||
|
||||
#
|
||||
# 1. Try GPT/MBR partition label using sgdisk
|
||||
#
|
||||
result=$(sgdisk -p "$disk" 2>/dev/null | awk -v label="$label" -v devname="$devname" '
|
||||
/^ *[0-9]/ {
|
||||
if ($7 == label) {
|
||||
if (devname ~ /^(mmcblk|nvme|loop)/)
|
||||
print devname "p" $1;
|
||||
else
|
||||
print devname $1;
|
||||
exit 0;
|
||||
}
|
||||
}
|
||||
')
|
||||
|
||||
if [ -n "$result" ]; then
|
||||
echo "$result"
|
||||
return 0
|
||||
fi
|
||||
|
||||
#
|
||||
# 2. Fallback: Check if the whole disk is an ext4/ext2/ext3 filesystem
|
||||
#
|
||||
|
||||
# Check for ext4/ext2/ext3 magic number (0xEF53) at offset 1080 (1024+56).
|
||||
magic_number=$(dd if="$disk" bs=1 skip=1080 count=2 2>/dev/null | od -t x2 -A n | tr -d ' \n')
|
||||
|
||||
# Check for both Little-Endian ('53ef') and Big-Endian ('ef53') interpretations of 0xEF53.
|
||||
# This supports bi-endian architectures like MIPS that may run in BE mode,
|
||||
# as well as the LE mode which is standard for RISC-V and ext filesystems.
|
||||
if [ "$magic_number" = "ef53" ] || [ "$magic_number" = "53ef" ]; then
|
||||
|
||||
# Read the volume label from offset 1144 (1024+120)
|
||||
fslabel=$(dd if="$disk" bs=1 skip=1144 count=16 2>/dev/null | tr -d '\000')
|
||||
logger $opt -p user.notice -t "$nm" "Found label $fslabel on disk $disk ..."
|
||||
|
||||
if [ "$fslabel" = "$label" ]; then
|
||||
echo "$devname"
|
||||
return 0
|
||||
# The kernel exposes GPT partition names as PARTNAME in uevent
|
||||
for uevent in /sys/class/block/*/uevent; do
|
||||
while IFS='=' read -r key val; do
|
||||
if [ "$key" = "PARTNAME" ]; then
|
||||
if [ "$val" = "$1" ]; then
|
||||
devname="${uevent%/uevent}"
|
||||
echo "${devname##*/}"
|
||||
return 0
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done < "$uevent"
|
||||
done
|
||||
|
||||
# Fallback: ext filesystem label on whole disk
|
||||
for diskpath in /sys/class/block/*; do
|
||||
[ -f "$diskpath/partition" ] && continue
|
||||
devname="${diskpath##*/}"
|
||||
case "$devname" in
|
||||
ram*|loop*|nullb*|dm-*|*boot[0-9]*|*rpmb) continue ;;
|
||||
esac
|
||||
fslabel=$(read_ext_label "/dev/$devname")
|
||||
if [ "$fslabel" = "$1" ]; then
|
||||
echo "$devname"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -319,12 +301,6 @@ mount_rw()
|
||||
fi
|
||||
fi
|
||||
|
||||
# TODO: Also look for UBI partitions
|
||||
|
||||
# Disable periodic fsck, yet keeping safety checks on ext4
|
||||
if grep "LABEL=$label" /etc/fstab |grep -q ext4; then
|
||||
tune2fs -c 0 -i 0 LABEL="$1" 2>/dev/null
|
||||
fi
|
||||
mount LABEL="$1" 2>/dev/null && return 0
|
||||
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user