diff options
author | Andrew Jeffery <andrew@aj.id.au> | 2023-01-25 05:05:00 +0300 |
---|---|---|
committer | Andrew Jeffery <andrew@aj.id.au> | 2023-01-27 11:06:02 +0300 |
commit | a2e2aea3873c100a4dbf27100c8bc337fbffe75a (patch) | |
tree | 782d0ff409e9dba8cbf75e872e8cb75701006bb0 /meta-phosphor/recipes-phosphor | |
parent | c154438b0ac1b571e7d97ae00b66630ec97d577c (diff) | |
download | openbmc-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')
-rw-r--r-- | meta-phosphor/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh | 17 |
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" |