blob: 189cafd271ccc606391d9296f00d69d5a637902a [file] [log] [blame]
#!/bin/sh
#
# Volume check service
#
# 'data+ubi' partition
DATA_MTD_NAME='"data+ubi"'
DATA_MTD_NO=
# 'rootfs' on /dev/ubi0
# 'data+ubi' on /dev/ubi1
DATA_UBI_NO=1
# eMMC support
DATA_MMC_NAME="data+ext4"
USER_NAME=user
CONFIG_NAME=config
CONFIG_SIZE=16MiB
USER_SIZE=0
BADBLOCK_FILE=/tmp/gpio/ledcontrol/flash_bad_blocks
check_mtd()
{
local a b c d e
cat /proc/mtd |
while read a b c d; do
# convert 'mtdxx:' to 'xx'
e=${a%:*}
[ $d = $1 ] && echo "${e#mtd}"
done
}
check_mmc()
{
local result=
sgdisk -p /dev/mmcblk0 >/tmp/mmcpart
while read number start end size unit code name; do
if [ "$name" = "$1" ]; then
result=$number
fi
done </tmp/mmcpart
rm -f /tmp/mmcpart
[ -n "$result" ] && echo "$result"
}
fail()
{
echo "$(basename $0):" "$@" >&2
[ -f $BADBLOCK_FILE ] || echo "" >$BADBLOCK_FILE
}
recover_volume()
{
# Format MTD device and mount UBI volumes.
# $1 - MTD device number
# $2 - UBI device number
echo "Failed to mount ubifs on mtd$1, formatting..."
# umount UBI volumes detach UBI devices
umount_ubifs $2
# format MTD partition
ubiformat /dev/mtd$1 -y
# attach UBI devices and mount UBI volumes
mount_ubifs $1 $2
}
mount_ubifs()
{
# Attach MTD device to UBI device.
# $1 - MTD device number
# $2 - UBI device number
#echo "Attach mtd$1 to /dev/ubi$2"
# If UBI device failed to attach, return 1 to call 'recover_volume()':
# 1. detach UBI devices
# 2. erase MTD partition
# 3. format MTD partition
# 4. attach UBI devices and mount UBI volumes again
ubiattach -m $1 -d $2
if [ $? -eq 0 ]; then
mount_volumes $1 $2 || return 1
else
echo "Failed to attach mtd$1 to /dev/ubi$2"
return 1
fi
}
mount_volumes()
{
# Mount UBI volumes.
# $1 - MTD device number
# $2 - UBI device number
if [ $1 -eq ${DATA_MTD_NO} ]; then
# mount UBI 'config' volume
mount_volume ${CONFIG_NAME} $2 ${CONFIG_SIZE} || return 1
# mount UBI 'user' volume
mount_volume ${USER_NAME} $2 ${USER_SIZE} || return 1
fi
}
mount_volume()
{
# Mount UBI volume.
# $1 - UBI volume name
# $2 - UBI device number
# $3 - UBI volume size
# make UBI volume
make_volume $1 $2 $3 || return 1
# mount UBI volume
[ ! -d /$1 ] && mkdir -p /$1
if ! mount -t ubifs ubi$2:$1 /$1; then
echo "Failed to mount '$1' volume"
return 1
fi
}
make_volume()
{
# Make UBI volume.
# $1 - UBI volume name
# $2 - UBI device number
# $3 - UBI volume size
# get UBI volume name and remove 'space' characters
if ubinfo -d $2 -N $1; then
echo "UBI volume '$1' exists"
return 0
fi
# echo "Make '$1' volume on /dev/ubi$2 (size:$3)"
if [ $3 -eq "0" ]; then
size_args="-m"
else
size_args="-s $3"
fi
if ! ubimkvol /dev/ubi$2 ${size_args} -N $1; then
echo "Failed to make '$1' volume"
return 1
fi
}
umount_ubifs()
{
# Umount UBI volumes.
# $1 - UBI device number
if [ $1 -eq ${DATA_UBI_NO} ]; then
[ -d /${USER_NAME} ] && umount /${USER_NAME}
[ -d /${CONFIG_NAME} ] && umount /${CONFIG_NAME}
else
return 1
fi
sleep 1
ubidetach -d $1
}
mount_ext4fs()
{
mount -t ext4 -o defaults,noatime,discard,data=writeback $1 /user || return 1
[ ! -d /user/config ] && mkdir -p /user/config
mount --bind /user/config /config || return 1
}
recover_ext4fs()
{
e2fsck $1 || mkfs.ext4 -E discard -m 2 -L ${DATA_MMC_NAME} $1
mount_ext4fs $1
}
case "$1" in
start)
# Get MTD partition number
DATA_MTD_NO=$(check_mtd ${DATA_MTD_NAME})
# Log bbinfo at boot
BBT=""
cat /proc/sys/dev/repartition/bbinfo |
while read a b ; do
BBT="$BBT$a$b "
done
echo "Bad Blocks: $BBT"
if [ ! -z "${DATA_MTD_NO}" ]; then
mount_ubifs ${DATA_MTD_NO} ${DATA_UBI_NO} || \
recover_volume ${DATA_MTD_NO} ${DATA_UBI_NO}
else
DATA_MMC_NO=$(check_mmc ${DATA_MMC_NAME})
DATA_BLK_NAME=/dev/mmcblk0p${DATA_MMC_NO}
if [ -b ${DATA_BLK_NAME} ]; then
mount_ext4fs ${DATA_BLK_NAME} || recover_ext4fs ${DATA_BLK_NAME}
fi
fi
[ ! -d /user/rw ] && mkdir -p /user/rw
[ ! -d /user/bsa ] && mkdir -p /user/bsa
[ ! -d /user/netflix ] && mkdir -p /user/netflix
[ ! -d /user/vudu ] && mkdir -p /user/vudu
[ ! -d /user/drm ] && mkdir -p /user/drm
[ ! -d /user/widevine ] && mkdir -p /user/widevine
[ ! -d /user/ytlb ] && mkdir -p /user/ytlb
[ ! -d /tmp/vudu ] && mkdir -p /tmp/vudu
rm -rf /user/diag/diagdb.bin /user/diag/*.tmp /user/diag/log
# /config must be writeable by non-root
chown bin.sys /config
chmod 775 /config
if [ -e /dev/sda ]; then
(
smartctl -t short /dev/sda
sleep 60
smartctl -l selftest /dev/sda
) 2>&1 | logos smartctl &
fi
if [ -e /config/DEBUG ]; then
echo "Enabling DEBUG mode because /config/DEBUG is set." >&2
echo >/tmp/DEBUG
fi
;;
stop)
# Get MTD partition number
DATA_MTD_NO=$(check_mtd ${DATA_MTD_NAME})
umount_ubifs ${DATA_UBI_NO}
;;
restart|reload)
;;
*)
echo "Usage: $0 {start|stop|restart}" >&2
exit 1
esac