diff --git a/package/system/fstools/Makefile b/package/system/fstools/Makefile index 9036528dbc..1df3e8c3b6 100644 --- a/package/system/fstools/Makefile +++ b/package/system/fstools/Makefile @@ -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 diff --git a/package/system/fstools/files/fstab.init b/package/system/fstools/files/fstab.init index 08d5601bee..177f752ab9 100644 --- a/package/system/fstools/files/fstab.init +++ b/package/system/fstools/files/fstab.init @@ -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 }