package/fstools: fstab supports waiting essential mount point on boot

This commit is contained in:
Liangbin Lian 2024-01-16 16:42:49 +08:00
parent cff738370e
commit 48fa786cbb
2 changed files with 63 additions and 2 deletions

View File

@ -21,7 +21,7 @@ PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=
PKG_USE_MIPS16:=0
PKG_FLAGS:=nonshared
PKG_FLAGS:=nonshared hold
PKG_BUILD_DEPENDS := util-linux
PKG_CONFIG_DEPENDS := CONFIG_NAND_SUPPORT CONFIG_FSTOOLS_UBIFS_EXTROOT
@ -79,7 +79,7 @@ define Package/block-mount
SECTION:=base
CATEGORY:=Base system
TITLE:=Block device mounting and checking
DEPENDS:=+ubox +libubox +libuci +libblobmsg-json +libjson-c
DEPENDS:=+ubox +libubox +libuci +libblobmsg-json +libjson-c +blkid
endef
define Package/blockd

View File

@ -3,7 +3,68 @@
START=40
check_uuid() {
blkid --uuid "$1" >/dev/null 2>&1
}
check_label() {
blkid --label "$1" >/dev/null 2>&1
}
check_device() {
[ -b "$1" ] >/dev/null 2>&1
}
wait_essential() {
local enabled
local target
local essential
[ $TIMEOUT -gt 0 ] || return 1
config_get_bool enabled $1 "enabled" "0"
config_get_bool essential $1 essential "0"
[ "$enabled" = "0" -o "$essential" = "0" ] && return 0
config_get target $1 "target"
[ -z "$target" -o "$target" = "/" -o "$target" = "/rom" -o "$target" = "/overlay" ] && return 0
/bin/mount | grep -qF " on $target type " && return 0
local uuid label device check_cmd
config_get uuid $1 "uuid"
config_get label $1 "label"
config_get device $1 "device"
if [ -n "$uuid" ]; then
check_cmd="check_uuid \"$uuid\""
elif [ -n "$label" ]; then
check_cmd="check_label \"$label\""
elif [ -n "$device" ]; then
check_cmd="check_device \"$device\""
else
return 0
fi
while :; do
eval "$check_cmd" && return 0
TIMEOUT=$(($TIMEOUT - 1))
if [ $TIMEOUT -gt 0 ]; then
sleep 1
else
break
fi
done
echo "fstab: wait essential device(s) timeout on $check_cmd" >/dev/kmsg
return 1
}
check_block_ready() {
TIMEOUT=$(uci -q get fstab.@global[0].essential_timeout)
[ -z "$TIMEOUT" ] && TIMEOUT=5
[ $TIMEOUT -ge 0 ] || return 0
TIMEOUT=$(($TIMEOUT + 1))
local ORIG=$TIMEOUT
config_load fstab
config_foreach wait_essential mount
[ $TIMEOUT -gt 0 ] && echo "fstab: essential device(s) ready after $(($ORIG - $TIMEOUT)) seconds" >/dev/kmsg
}
boot() {
( check_block_ready )
/sbin/block mount
}