|
|
- #!/bin/sh
-
- cmd="$1"
- shift
-
- if [ "$cmd" = "name" ]; then
- echo "UBI"
- return 0
- fi
-
- test -e /sys/class/ubi/version || return 0
- read -r ubiver < /sys/class/ubi/version
- [ "$ubiver" = "1" ] || return 1
- test -e /sys/devices/virtual/ubi || return 0
-
- ubidev=$(ls -1 /sys/devices/virtual/ubi | head -n 1)
-
- read -r ebsize < "/sys/devices/virtual/ubi/${ubidev}/eraseblock_size"
-
- . /lib/functions/uvol.sh
-
- freebytes() {
- read -r availeb < "/sys/devices/virtual/ubi/${ubidev}/avail_eraseblocks"
- echo $((availeb * ebsize))
- }
-
- totalbytes() {
- read -r totaleb < "/sys/devices/virtual/ubi/${ubidev}/total_eraseblocks"
- echo $((totaleb * ebsize))
- }
-
- getdev() {
- local voldir volname
- for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
- read -r volname < "${voldir}/name"
- case "$volname" in
- uvol-[rw][owpd]-$1)
- basename "$voldir"
- break
- ;;
- *)
- continue
- ;;
- esac
- done
- }
-
- vol_is_mode() {
- local voldev="$1"
- local volname
- read -r volname < "/sys/devices/virtual/ubi/${ubidev}/${voldev}/name"
- case "$volname" in
- uvol-$2-*)
- return 0
- ;;
- esac
- return 1
- }
-
- getstatus() {
- local voldev
- voldev="$(getdev "$@")"
- [ "$voldev" ] || return 2
- vol_is_mode "$voldev" wo && return 22
- vol_is_mode "$voldev" wp && return 16
- vol_is_mode "$voldev" wd && return 1
- vol_is_mode "$voldev" ro && [ ! -e "/dev/ubiblock${voldev:3}" ] && return 1
- return 0
- }
-
- getsize() {
- local voldev
- voldev="$(getdev "$@")"
- [ "$voldev" ] || return 2
- cat "/sys/devices/virtual/ubi/${ubidev}/${voldev}/data_bytes"
- }
-
- getuserdev() {
- local voldev
- voldev="$(getdev "$@")"
- [ "$voldev" ] || return 2
- if vol_is_mode "$voldev" ro ; then
- echo "/dev/ubiblock${voldev:3}"
- elif vol_is_mode "$voldev" rw ; then
- echo "/dev/$voldev"
- fi
- }
-
- mkubifs() {
- local tmp_mp
- tmp_mp="$(mktemp -d)"
- mount -t ubifs "$1" "$tmp_mp" || return $?
- umount "$tmp_mp" || return $?
- rmdir "$tmp_mp" || return $?
- return 0
- }
-
- createvol() {
- local mode ret voldev
- voldev=$(getdev "$@")
- [ "$voldev" ] && return 17
- case "$3" in
- ro|wo)
- mode=wo
- ;;
- rw)
- mode=wp
- ;;
- *)
- return 22
- ;;
- esac
- ubimkvol "/dev/$ubidev" -N "uvol-$mode-$1" -s "$2" || return $?
- ret=$?
- [ $ret -eq 0 ] || return $ret
- voldev="$(getdev "$@")"
- ubiupdatevol -t "/dev/$voldev" || return $?
- [ "$mode" = "wp" ] || return 0
- mkubifs "/dev/$voldev" || return $?
- uvol_uci_add "$1" "/dev/$voldev" "rw"
- ubirename "/dev/$ubidev" "uvol-wp-$1" "uvol-wd-$1" || return $?
- }
-
- removevol() {
- local voldev volnum
- voldev=$(getdev "$@")
- [ "$voldev" ] || return 2
- vol_is_mode "$voldev" rw && return 16
- vol_is_mode "$voldev" ro && return 16
- volnum="${voldev#${ubidev}_}"
- ubirmvol "/dev/$ubidev" -n "$volnum" || return $?
- uvol_uci_remove "$1"
- uvol_uci_commit "$1"
- }
-
- block_hotplug() {
- export ACTION="$1"
- export DEVNAME="$2"
- /sbin/block hotplug
- }
-
- activatevol() {
- local voldev
- voldev="$(getdev "$@")"
- [ "$voldev" ] || return 2
- vol_is_mode "$voldev" rw && return 0
- vol_is_mode "$voldev" ro && return 0
- vol_is_mode "$voldev" wo && return 22
- vol_is_mode "$voldev" wp && return 16
- uvol_uci_commit "$1"
- if vol_is_mode "$voldev" rd; then
- ubirename "/dev/$ubidev" "uvol-rd-$1" "uvol-ro-$1" || return $?
- ubiblock --create "/dev/$voldev" || return $?
- return 0
- elif vol_is_mode "$voldev" wd; then
- ubirename "/dev/$ubidev" "uvol-wd-$1" "uvol-rw-$1" || return $?
- block_hotplug add "$voldev"
- return 0
- fi
- }
-
- disactivatevol() {
- local voldev
- voldev="$(getdev "$@")"
- [ "$voldev" ] || return 2
- vol_is_mode "$voldev" rd && return 0
- vol_is_mode "$voldev" wd && return 0
- vol_is_mode "$voldev" wo && return 22
- vol_is_mode "$voldev" wp && return 16
- if vol_is_mode "$voldev" ro; then
- grep -q "^/dev/ubiblock${voldev:3}" /proc/self/mounts && umount "/dev/ubiblock${voldev:3}"
- ubiblock --remove "/dev/$voldev"
- ubirename "/dev/$ubidev" "uvol-ro-$1" "uvol-rd-$1" || return $?
- return 0
- elif vol_is_mode "$voldev" rw; then
- umount "/dev/$voldev"
- ubirename "/dev/$ubidev" "uvol-rw-$1" "uvol-wd-$1" || return $?
- block_hotplug remove "$voldev"
- return 0
- fi
- }
-
- updatevol() {
- local voldev
- voldev="$(getdev "$@")"
- [ "$voldev" ] || return 2
- [ "$2" ] || return 22
- vol_is_mode "$voldev" wo || return 22
- ubiupdatevol -s "$2" "/dev/$voldev" -
- ubiblock --create "/dev/$voldev"
- uvol_uci_add "$1" "/dev/ubiblock${voldev:3}" "ro"
- ubiblock --remove "/dev/$voldev"
- ubirename "/dev/$ubidev" "uvol-wo-$1" "uvol-rd-$1"
- }
-
- listvols() {
- local volname volmode volsize json_output json_notfirst
- if [ "$1" = "-j" ]; then
- json_output=1
- shift
- echo "["
- fi
- for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
- read -r volname < "$voldir/name"
- case "$volname" in
- uvol-[rw][wod]*)
- read -r volsize < "$voldir/data_bytes"
- ;;
- *)
- continue
- ;;
- esac
- volmode="${volname:5:2}"
- volname="${volname:8}"
- [ "${volname:0:1}" = "." ] && continue
- if [ "$json_output" = "1" ]; then
- [ "$json_notfirst" = "1" ] && echo ","
- echo -e "\t{"
- echo -e "\t\t\"name\": \"$volname\","
- echo -e "\t\t\"mode\": \"$volmode\","
- echo -e "\t\t\"size\": $volsize"
- echo -n -e "\t}"
- json_notfirst=1
- else
- echo "$volname $volmode $volsize"
- fi
- done
-
- if [ "$json_output" = "1" ]; then
- [ "$json_notfirst" = "1" ] && echo
- echo "]"
- fi
- }
-
- bootvols() {
- local volname volmode volsize voldev fstype
- for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
- read -r volname < "$voldir/name"
- voldev="$(basename "$voldir")"
- fstype=
- case "$volname" in
- uvol-ro-*)
- ubiblock --create "/dev/$voldev" || return $?
- ;;
- *)
- continue
- ;;
- esac
- volmode="${volname:5:2}"
- volname="${volname:8}"
- done
- }
-
- detect() {
- local volname voldev volmode voldev fstype tmpdev=""
- for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
- read -r volname < "$voldir/name"
- voldev="$(basename "$voldir")"
- fstype=
- case "$volname" in
- uvol-r[od]-*)
- if ! [ -e "/dev/ubiblock${voldev:3}" ]; then
- ubiblock --create "/dev/$voldev" || return $?
- fi
- case "$volname" in
- uvol-rd-*)
- tmpdev="$tmpdev $voldev"
- ;;
- esac
- ;;
- *)
- continue
- ;;
- esac
- volmode="${volname:5:2}"
- volname="${volname:8}"
- done
-
- uvol_uci_init
-
- for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
- read -r volname < "$voldir/name"
- voldev="$(basename "$voldir")"
- case "$volname" in
- uvol-[rw][wod]*)
- true
- ;;
- *)
- continue
- ;;
- esac
- volmode="${volname:5:2}"
- volname="${volname:8}"
- case "$volmode" in
- "ro" | "rd")
- uvol_uci_add "$volname" "/dev/ubiblock${voldev:3}" "ro"
- ;;
- "rw" | "wd")
- uvol_uci_add "$volname" "/dev/${voldev}" "rw"
- ;;
- esac
- done
-
- uvol_uci_commit
-
- for voldev in $tmpdev ; do
- ubiblock --remove "/dev/$voldev" || return $?
- done
- }
-
- case "$cmd" in
- align)
- echo "$ebsize"
- ;;
- free)
- freebytes
- ;;
- total)
- totalbytes
- ;;
- detect)
- detect
- ;;
- boot)
- bootvols
- ;;
- list)
- listvols "$@"
- ;;
- create)
- createvol "$@"
- ;;
- remove)
- removevol "$@"
- ;;
- device)
- getuserdev "$@"
- ;;
- size)
- getsize "$@"
- ;;
- up)
- activatevol "$@"
- ;;
- down)
- disactivatevol "$@"
- ;;
- status)
- getstatus "$@"
- ;;
- write)
- updatevol "$@"
- ;;
- *)
- echo "unknown command"
- return 1
- ;;
- esac
|