summaryrefslogtreecommitdiff
path: root/meta-phosphor/recipes-phosphor/initrdscripts
diff options
context:
space:
mode:
authorAndrew Jeffery <andrew@aj.id.au>2023-01-25 05:05:00 +0300
committerAndrew Jeffery <andrew@aj.id.au>2023-01-27 11:06:02 +0300
commita2e2aea3873c100a4dbf27100c8bc337fbffe75a (patch)
tree782d0ff409e9dba8cbf75e872e8cb75701006bb0 /meta-phosphor/recipes-phosphor/initrdscripts
parentc154438b0ac1b571e7d97ae00b66630ec97d577c (diff)
downloadopenbmc-a2e2aea3873c100a4dbf27100c8bc337fbffe75a.tar.xz
meta-phosphor: phosphor-mmc-init: Fix commandline parsing for root
From Joel in [1]: ``` It expects a command line string to be in the form: console=ttyS4,115200n8 rootwait root=PARTLABEL=rofs-a If booting with root=PARTLABEL=rofs-a at the start of the command line string (instead of the end), the parsing gets confused: [ 8.241229] /dev/disk/by-partlabel/root=PARTLABEL=rofs-a: Can't open blockdev mount: mounting /dev/disk/by-partlabel/root=PARTLABEL=rofs-a on /mnt/rofs failed: No such file or directory Similarly if the partition is not set, it gets confused: [ 1.919816] Run /init as init process Starting version 251.8+ [ 8.219396] /dev/disk/by-partlabel/rootwait: Can't open blockdev mount: mounting /dev/disk/by-partlabel/rootwait on /mnt/rofs failed: No such file or directory We should fix get_root so that it checks for the existance of root=PARTLABEL, and matches on it. We could fall back on rofs-a if it can't be found? ``` Based on Joel's example I tested the new implementation as follows: ``` $ declare -f old_get_root old_get_root () { local root="$@"; root="${root##* root=PARTLABEL=}"; root="${root%% *}"; [ "${root}" != "" ] && echo "${root}" } $ declare -f new_get_root new_get_root () { local cmdline="$@"; root=; for opt in $cmdline; do case $opt in root=PARTLABEL=*) root=${opt##root=PARTLABEL=} ;; *) ;; esac; done; [ -n "$root" ] && echo $root } ``` Comparing the two under various commandline orderings: ``` $ echo $working_cmdline console=ttyS4,115200n8 rootwait root=PARTLABEL=rofs-a $ old_get_root $working_cmdline rofs-a $ new_get_root $working_cmdline rofs-a $ ``` ``` $ echo $broken_cmdline root=PARTLABEL=rofs-a console=ttyS4,115200n8 rootwait $ old_get_root $broken_cmdline root=PARTLABEL=rofs-a $ new_get_root $broken_cmdline rofs-a $ ``` ``` $ echo $maybe_cmdline console=ttyS4,115200n8 root=PARTLABEL=rofs-a rootwait $ old_get_root $maybe_cmdline rofs-a $ new_get_root $maybe_cmdline rofs-a $ ``` ``` $ echo $dev_cmdline console=ttyS4,115200n8 root=/dev/sda1 rootwait $ old_get_root $dev_cmdline console=ttyS4,115200n8 $ new_get_root $dev_cmdline $ ``` In each case new_get_root() gives the expected output. [1]: https://github.com/openbmc/openbmc/issues/3898 Fixes: 0998d1e4fc58 ("initramfs: Add init script for eMMC") Change-Id: I68e95d74dd33c54d956d08ae3332ba7bdec9aeeb Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Diffstat (limited to 'meta-phosphor/recipes-phosphor/initrdscripts')
-rw-r--r--meta-phosphor/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh17
1 files changed, 13 insertions, 4 deletions
diff --git a/meta-phosphor/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh b/meta-phosphor/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh
index ad9748e651..316bffce8a 100644
--- a/meta-phosphor/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh
+++ b/meta-phosphor/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh
@@ -2,10 +2,19 @@
# Get the value of the root env variable found in /proc/cmdline
get_root() {
- local root="$(cat /proc/cmdline)"
- root="${root##* root=PARTLABEL=}"
- root="${root%% *}"
- [ "${root}" != "" ] && echo "${root}"
+ local cmdline="$(cat /proc/cmdline)"
+ root=
+ for opt in $cmdline
+ do
+ case $opt in
+ root=PARTLABEL=*)
+ root=${opt##root=PARTLABEL=}
+ ;;
+ *)
+ ;;
+ esac
+ done
+ [ -n "$root" ] && echo $root
}
fslist="proc sys dev run"