summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilton Miller <miltonm@us.ibm.com>2016-05-23 19:17:55 -0500
committerMilton Miller <miltonm@us.ibm.com>2016-06-30 14:46:43 -0500
commitaa42dfda27582483ccf907720d4bb2e386b6d761 (patch)
treeb25ae141e4fac5c7d588d66e825747515989582b
parent694e44e047a6272f75d29171c9be847b0fbce659 (diff)
downloadtalos-openbmc-aa42dfda27582483ccf907720d4bb2e386b6d761.tar.gz
talos-openbmc-aa42dfda27582483ccf907720d4bb2e386b6d761.zip
initfs: update: check individual mtd partitions for mounts
Instead of checking for any mtd device, only check mtd devices that are to be updated. Include child mtd devices when looking for mounted filesystems. If this check is suppressed flash updates are suppressed. Suppressing the check may be useful to verify a update could succeed at shutdown. Signed-off-by: Milton Miller <miltonm@us.ibm.com>
-rwxr-xr-xmeta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh46
1 files changed, 41 insertions, 5 deletions
diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
index 9f5bede43..9d3c81276 100755
--- a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
+++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
@@ -23,11 +23,34 @@ then
mount -t devtmpfs dev dev
fi
-if grep mtd /proc/mounts
-then
- echoerr "A mtd device is mounted."
- exit 1
-fi
+# mtd number N with mtd name Name can be mounted via mtdN, or mtd:Name
+# (with a mtd aware fs) or by /dev/mtdblockN (with a mtd or block fs).
+mtdismounted() {
+ m=${1##mtd}
+ if grep -s "mtdblock$m " /proc/mounts || grep -s "mtd$m " /proc/mounts
+ then
+ return 0
+ fi
+ n=$(cat /sys/class/mtd/mtd$m/name)
+ if test -n "$n" && grep -s "mtd:$n " /proc/mounts
+ then
+ return 0
+ fi
+ return 1
+}
+
+# Detect child partitions when the whole flash is to be updated.
+# Ignore mtdNro and mtdblockN names in the class subsystem directory.
+childmtds() {
+ for m in /sys/class/mtd/$1/mtd*
+ do
+ m=${m##*/}
+ if test "${m%ro}" = "${m#mtdblock}"
+ then
+ echo $m
+ fi
+ done
+}
findmtd() {
m=$(grep -xl "$1" /sys/class/mtd/*/name)
@@ -66,6 +89,7 @@ doclean=
dosave=y
dorestore=y
toram=
+checkmount=y
whitelist=/run/initramfs/whitelist
image=/run/initramfs/image-
@@ -94,6 +118,10 @@ do
--no-flash)
doflash=
shift ;;
+ --ignore-mount)
+ checkmount=
+ doflash=
+ shift ;;
--copy-files)
toram=y
shift ;;
@@ -137,6 +165,14 @@ do
echoerr "Unable to find mtd partiton for ${f##*/}."
exit 1
fi
+ for s in $m $(childmtds $m)
+ do
+ if test -n "$checkmount" && mtdismounted $s
+ then
+ echoerr "Device $s is mounted, ${f##*/} is busy."
+ exit 1
+ fi
+ done
done
if test -n "$doflash"
OpenPOWER on IntegriCloud