diff options
author | Neelesh Gupta <neelegup@linux.vnet.ibm.com> | 2013-08-29 19:21:32 +0530 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-08-30 11:29:09 +1000 |
commit | 503d1454f222e2b0c6f8dd433a9e91870a17f460 (patch) | |
tree | fdfb76e3e30157e40390072f2f92e3f4aa86ec94 /discover/yaboot-parser.c | |
parent | 50a98e73d4eed46e859368915a7800cc904b44f2 (diff) | |
download | talos-petitboot-503d1454f222e2b0c6f8dd433a9e91870a17f460.tar.gz talos-petitboot-503d1454f222e2b0c6f8dd433a9e91870a17f460.zip |
discover/yaboot-parser: Handle 'partition=' directive override
In a yaboot conf file, we may see a device= directive that actually
specifies a partition (eg, sda1) rather than the underlying block device
(sda). If we then encounter a partition= directive, we don't handle the
resolution of the partition correctly, as we simply append the
partition number to the device= string.
This change implements a smarter handling of the partition= directive,
where we strip away any partition information from the device=
parameter first.
Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/yaboot-parser.c')
-rw-r--r-- | discover/yaboot-parser.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/discover/yaboot-parser.c b/discover/yaboot-parser.c index c0750fe..22792d4 100644 --- a/discover/yaboot-parser.c +++ b/discover/yaboot-parser.c @@ -3,6 +3,7 @@ #include <assert.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #include "log/log.h" #include "talloc/talloc.h" @@ -53,9 +54,9 @@ static struct resource *create_yaboot_devpath_resource( const char *path) { struct discover_boot_option *opt = state->opt; - const char *dev, *part; + const char *dev, *part, *devpos; struct resource *res; - char *devpath; + char *devpath, *devstr; dev = state->device; part = state->partition; @@ -69,8 +70,19 @@ static struct resource *create_yaboot_devpath_resource( devpath = talloc_strdup(conf, path); } else if (dev && part) { - devpath = talloc_asprintf(conf, - "%s%s:%s", dev, part, path); + devpos = &dev[strlen(dev) - 1]; + if (isdigit(*devpos)) { + while (isdigit(*devpos)) + devpos--; + + devstr = talloc_strndup(conf, dev, devpos - dev + 1); + devpath = talloc_asprintf(conf, "%s%s:%s", devstr, + part, path); + talloc_free(devstr); + } else { + devpath = talloc_asprintf(conf, + "%s%s:%s", dev, part, path); + } } else if (dev) { devpath = talloc_asprintf(conf, "%s:%s", dev, path); } else { |