Merge pull request #16078 from ja-pa/fix-email
[feed/packages.git] / utils / uvol / files / ubi.sh
1 #!/bin/sh
2
3 cmd="$1"
4 shift
5
6 if [ "$cmd" = "name" ]; then
7 echo "UBI"
8 return 0
9 fi
10
11 test -e /sys/class/ubi/version || return 0
12 read -r ubiver < /sys/class/ubi/version
13 [ "$ubiver" = "1" ] || return 1
14 test -e /sys/devices/virtual/ubi || return 0
15
16 ubidev=$(ls -1 /sys/devices/virtual/ubi | head -n 1)
17
18 read -r ebsize < "/sys/devices/virtual/ubi/${ubidev}/eraseblock_size"
19
20 . /lib/functions/uvol.sh
21
22 freebytes() {
23 read -r availeb < "/sys/devices/virtual/ubi/${ubidev}/avail_eraseblocks"
24 echo $((availeb * ebsize))
25 }
26
27 totalbytes() {
28 read -r totaleb < "/sys/devices/virtual/ubi/${ubidev}/total_eraseblocks"
29 echo $((totaleb * ebsize))
30 }
31
32 getdev() {
33 local voldir volname
34 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
35 read -r volname < "${voldir}/name"
36 case "$volname" in
37 uvol-[rw][owpd]-$1)
38 basename "$voldir"
39 break
40 ;;
41 *)
42 continue
43 ;;
44 esac
45 done
46 }
47
48 vol_is_mode() {
49 local voldev="$1"
50 local volname
51 read -r volname < "/sys/devices/virtual/ubi/${ubidev}/${voldev}/name"
52 case "$volname" in
53 uvol-$2-*)
54 return 0
55 ;;
56 esac
57 return 1
58 }
59
60 getstatus() {
61 local voldev
62 voldev="$(getdev "$@")"
63 [ "$voldev" ] || return 2
64 vol_is_mode "$voldev" wo && return 22
65 vol_is_mode "$voldev" wp && return 16
66 vol_is_mode "$voldev" wd && return 1
67 vol_is_mode "$voldev" ro && [ ! -e "/dev/ubiblock${voldev:3}" ] && return 1
68 return 0
69 }
70
71 getsize() {
72 local voldev
73 voldev="$(getdev "$@")"
74 [ "$voldev" ] || return 2
75 cat "/sys/devices/virtual/ubi/${ubidev}/${voldev}/data_bytes"
76 }
77
78 getuserdev() {
79 local voldev
80 voldev="$(getdev "$@")"
81 [ "$voldev" ] || return 2
82 if vol_is_mode "$voldev" ro ; then
83 echo "/dev/ubiblock${voldev:3}"
84 elif vol_is_mode "$voldev" rw ; then
85 echo "/dev/$voldev"
86 fi
87 }
88
89 mkubifs() {
90 local tmp_mp
91 tmp_mp="$(mktemp -d)"
92 mount -t ubifs "$1" "$tmp_mp" || return $?
93 umount "$tmp_mp" || return $?
94 rmdir "$tmp_mp" || return $?
95 return 0
96 }
97
98 createvol() {
99 local mode ret voldev
100 voldev=$(getdev "$@")
101 [ "$voldev" ] && return 17
102 case "$3" in
103 ro|wo)
104 mode=wo
105 ;;
106 rw)
107 mode=wp
108 ;;
109 *)
110 return 22
111 ;;
112 esac
113 ubimkvol "/dev/$ubidev" -N "uvol-$mode-$1" -s "$2" || return $?
114 ret=$?
115 [ $ret -eq 0 ] || return $ret
116 voldev="$(getdev "$@")"
117 ubiupdatevol -t "/dev/$voldev" || return $?
118 [ "$mode" = "wp" ] || return 0
119 mkubifs "/dev/$voldev" || return $?
120 uvol_uci_add "$1" "/dev/$voldev" "rw"
121 ubirename "/dev/$ubidev" "uvol-wp-$1" "uvol-wd-$1" || return $?
122 }
123
124 removevol() {
125 local voldev volnum
126 voldev=$(getdev "$@")
127 [ "$voldev" ] || return 2
128 vol_is_mode "$voldev" rw && return 16
129 vol_is_mode "$voldev" ro && return 16
130 volnum="${voldev#${ubidev}_}"
131 ubirmvol "/dev/$ubidev" -n "$volnum" || return $?
132 uvol_uci_remove "$1"
133 uvol_uci_commit "$1"
134 }
135
136 block_hotplug() {
137 export ACTION="$1"
138 export DEVNAME="$2"
139 /sbin/block hotplug
140 }
141
142 activatevol() {
143 local voldev
144 voldev="$(getdev "$@")"
145 [ "$voldev" ] || return 2
146 vol_is_mode "$voldev" rw && return 0
147 vol_is_mode "$voldev" ro && return 0
148 vol_is_mode "$voldev" wo && return 22
149 vol_is_mode "$voldev" wp && return 16
150 uvol_uci_commit "$1"
151 if vol_is_mode "$voldev" rd; then
152 ubirename "/dev/$ubidev" "uvol-rd-$1" "uvol-ro-$1" || return $?
153 ubiblock --create "/dev/$voldev" || return $?
154 return 0
155 elif vol_is_mode "$voldev" wd; then
156 ubirename "/dev/$ubidev" "uvol-wd-$1" "uvol-rw-$1" || return $?
157 block_hotplug add "$voldev"
158 return 0
159 fi
160 }
161
162 disactivatevol() {
163 local voldev
164 voldev="$(getdev "$@")"
165 [ "$voldev" ] || return 2
166 vol_is_mode "$voldev" rd && return 0
167 vol_is_mode "$voldev" wd && return 0
168 vol_is_mode "$voldev" wo && return 22
169 vol_is_mode "$voldev" wp && return 16
170 if vol_is_mode "$voldev" ro; then
171 /sbin/block umount "ubiblock${voldev:3}"
172 ubiblock --remove "/dev/$voldev"
173 ubirename "/dev/$ubidev" "uvol-ro-$1" "uvol-rd-$1" || return $?
174 return 0
175 elif vol_is_mode "$voldev" rw; then
176 /sbin/block umount "$voldev"
177 ubirename "/dev/$ubidev" "uvol-rw-$1" "uvol-wd-$1" || return $?
178 block_hotplug remove "$voldev"
179 return 0
180 fi
181 }
182
183 updatevol() {
184 local voldev
185 voldev="$(getdev "$@")"
186 [ "$voldev" ] || return 2
187 [ "$2" ] || return 22
188 vol_is_mode "$voldev" wo || return 22
189 ubiupdatevol -s "$2" "/dev/$voldev" -
190 ubiblock --create "/dev/$voldev"
191 uvol_uci_add "$1" "/dev/ubiblock${voldev:3}" "ro"
192 ubiblock --remove "/dev/$voldev"
193 ubirename "/dev/$ubidev" "uvol-wo-$1" "uvol-rd-$1"
194 }
195
196 listvols() {
197 local volname volmode volsize
198 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
199 read -r volname < "$voldir/name"
200 case "$volname" in
201 uvol-[rw][wod]*)
202 read -r volsize < "$voldir/data_bytes"
203 ;;
204 *)
205 continue
206 ;;
207 esac
208 volmode="${volname:5:2}"
209 volname="${volname:8}"
210 echo "$volname $volmode $volsize"
211 done
212 }
213
214 bootvols() {
215 local volname volmode volsize voldev fstype
216 for voldir in "/sys/devices/virtual/ubi/${ubidev}/${ubidev}_"*; do
217 read -r volname < "$voldir/name"
218 voldev="$(basename "$voldir")"
219 fstype=
220 case "$volname" in
221 uvol-ro-*)
222 ubiblock --create "/dev/$voldev" || return $?
223 ;;
224 *)
225 continue
226 ;;
227 esac
228 volmode="${volname:5:2}"
229 volname="${volname:8}"
230 done
231 }
232
233 case "$cmd" in
234 align)
235 echo "$ebsize"
236 ;;
237 free)
238 freebytes
239 ;;
240 total)
241 totalbytes
242 ;;
243 boot)
244 bootvols
245 ;;
246 list)
247 listvols "$@"
248 ;;
249 create)
250 createvol "$@"
251 ;;
252 remove)
253 removevol "$@"
254 ;;
255 device)
256 getuserdev "$@"
257 ;;
258 size)
259 getsize "$@"
260 ;;
261 up)
262 activatevol "$@"
263 ;;
264 down)
265 disactivatevol "$@"
266 ;;
267 status)
268 getstatus "$@"
269 ;;
270 write)
271 updatevol "$@"
272 ;;
273 *)
274 echo "unknown command"
275 return 1
276 ;;
277 esac