summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeelesh Gupta <neelegup@linux.vnet.ibm.com>2013-08-29 19:21:32 +0530
committerJeremy Kerr <jk@ozlabs.org>2013-08-30 11:29:09 +1000
commit503d1454f222e2b0c6f8dd433a9e91870a17f460 (patch)
treefdfb76e3e30157e40390072f2f92e3f4aa86ec94
parent50a98e73d4eed46e859368915a7800cc904b44f2 (diff)
downloadtalos-petitboot-503d1454f222e2b0c6f8dd433a9e91870a17f460.zip
talos-petitboot-503d1454f222e2b0c6f8dd433a9e91870a17f460.tar.gz
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>
-rw-r--r--discover/yaboot-parser.c20
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 {
OpenPOWER on IntegriCloud