summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2020-10-06 11:19:13 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-11-18 15:29:19 +0100
commitefeba0875ed181e7c1c7915742a3868799604d0c (patch)
tree3b95e86798d0e49b388be8d3bea30c1ce1ebc082
parentcf8a7fcbb54a36af6e10c7cd29f9afa905083ec1 (diff)
Add an ubifs mount helper
This abstracts away attaching of the right ubi and then selecting the right ubi device and volume to mount. As described in the comment at the top this allows to mount ubifs volumes directly from /etc/fstab without having to use hardcoded numbers (which depend on mount order and so are unreliable) and extra magic to care for attaching. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r--ubifs-utils/Makemodule.am2
-rwxr-xr-xubifs-utils/mount.ubifs101
2 files changed, 103 insertions, 0 deletions
diff --git a/ubifs-utils/Makemodule.am b/ubifs-utils/Makemodule.am
index 59109cc..5c5d99f 100644
--- a/ubifs-utils/Makemodule.am
+++ b/ubifs-utils/Makemodule.am
@@ -47,4 +47,6 @@ UBIFS_EXTRA = \
EXTRA_DIST += $(UBIFS_HEADER) $(UBIFS_EXTRA)
+dist_sbin_SCRIPTS = ubifs-utils/mount.ubifs
+
sbin_PROGRAMS += $(UBIFS_BINS)
diff --git a/ubifs-utils/mount.ubifs b/ubifs-utils/mount.ubifs
new file mode 100755
index 0000000..b94ddc5
--- /dev/null
+++ b/ubifs-utils/mount.ubifs
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+# This script should be installed as /sbin/mount.ubifs. The benefit is that an
+# fstab entry like:
+#
+# mtd=mtddev:home /home ubifs defaults 0 0
+#
+# results in the ubi contained in the mtd named "mtddev" to be attached (if not
+# already done) and then the volume named "home" being mounted to /home.
+
+# This is called by mount with the following options:
+# /sbin/mount.ubifs spec dir [-sfnv] [-N namespace] [-o options] [-t type.subtype]
+
+spec="$1"
+shift
+
+mtdname2num() {
+ local name
+
+ name="$1"
+
+ for d in $(find /sys/class/mtd/ -regex '.*/mtd[0-9]*'); do
+ case "$d" in
+ *ro)
+ continue
+ ;;
+ esac
+
+ if test "$name" = "$(cat "$d/name")"; then
+ local dev mtdnum
+
+ dev="$(basename "$d")"
+ mtdnum="${dev#mtd}"
+ echo "$mtdnum"
+ return
+ fi
+ done
+
+ return 1
+}
+
+mtdnum2ubi() {
+ local mtdnum
+
+ mtdnum="$1"
+
+ for d in $(find /sys/class/ubi/ -regex '.*/ubi[0-9]*'); do
+ case "$d" in
+ *_[0-9]*)
+ continue
+ ;;
+ esac
+
+ if test "$mtdnum" = "$(cat "$d/mtd_num")"; then
+ local ubi
+
+ ubi="$(basename "$d")"
+ echo "$ubi"
+ return;
+ fi
+ done
+
+ return 1
+}
+
+mtdnum2ubi_autoattach() {
+ local mtdnum ubi
+
+ mtdnum="$1"
+
+ ubi="$(mtdnum2ubi "$mtdnum")" && { echo "$ubi"; return; }
+
+ # ubiattach might fail with "mtdX is already attached to ubiY" if there
+ # is more than one mount to do in the same mtd partition. So ignore errors.
+ ubiattach -m "$mtdnum" >&2 || true
+
+ mtdnum2ubi "$mtdnum"
+}
+
+case "$spec" in
+ mtd=*:*)
+ spec="${spec#mtd=}"
+ mtd="${spec%:*}"
+ rspec="${spec#*:}"
+
+ mtdnum="$(mtdname2num "$mtd")" || {
+ echo "Failed to find mtdnum for mtd \"$mtd\""
+ exit 1
+ }
+
+ ubi="$(mtdnum2ubi_autoattach "$mtdnum")" || {
+ echo "Failed to find ubi for mtd \"$mtd\""
+ exit 1
+ }
+
+ spec="$ubi:$rspec"
+
+ ;;
+esac
+
+/bin/mount -i -t ubifs "$spec" "$@"