summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2014-04-02 02:17:01 +0000
committerchristos <christos@NetBSD.org>2014-04-02 02:17:01 +0000
commitd6c76b19bd7965645b462af623a6c1eecd6f014a (patch)
tree17fdabd4710259d055d7318b38b01a0bdbd46fb6 /sys/dev/raidframe
parentf1357331b776adc3e0bc2410c480d716f7f261a3 (diff)
If we are autoconfiguring root, then only change the booted_device if
we booted from one of the components of the root raid set. This allows us to boot from other media, without forcing the found raid to always be root. Allow the old behavior with RAIDFRAME_FORCE_ROOT. XXX: cpu_rootconf() is called twice now, which prints the booted device message twice. Perhaps we can remember that cpu_rootconf has been called and avoid calling it twice to avoid that.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_netbsdkintf.c45
1 files changed, 31 insertions, 14 deletions
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c
index 2fbdf7bb5aa..e28109d4875 100644
--- a/sys/dev/raidframe/rf_netbsdkintf.c
+++ b/sys/dev/raidframe/rf_netbsdkintf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_netbsdkintf.c,v 1.305 2014/03/16 05:20:29 dholland Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.306 2014/04/02 02:17:01 christos Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
***********************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.305 2014/03/16 05:20:29 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.306 2014/04/02 02:17:01 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -447,14 +447,30 @@ rf_autoconfig(device_t self)
return 1;
}
+static int
+rf_containsboot(RF_Raid_t *r, device_t dv) {
+ const char *bootname = device_xname(dv);
+ size_t len = strlen(bootname);
+
+ for (int col = 0; col < r->numCol; col++) {
+ char *devname = r->Disks[col].devname;
+ devname += sizeof("/dev/") - 1;
+ if (strncmp(devname, bootname, len) == 0) {
+ struct raid_softc *sc = r->softc;
+ aprint_debug("raid%d includes boot device %s\n",
+ sc->sc_unit, devname);
+ return 1;
+ }
+ }
+ return 0;
+}
+
void
rf_buildroothack(RF_ConfigSet_t *config_sets)
{
RF_ConfigSet_t *cset;
RF_ConfigSet_t *next_cset;
- int col;
int num_root;
- char *devname;
struct raid_softc *sc, *rsc;
sc = rsc = NULL;
@@ -496,14 +512,22 @@ rf_buildroothack(RF_ConfigSet_t *config_sets)
/* we found something bootable... */
if (num_root == 1) {
+ device_t candidate_root;
if (rsc->sc_dkdev.dk_nwedges != 0) {
/* XXX: How do we find the real root partition? */
char cname[sizeof(cset->ac->devname)];
snprintf(cname, sizeof(cname), "%s%c",
device_xname(rsc->sc_dev), 'a');
- booted_device = dkwedge_find_by_wname(cname);
+ candidate_root = dkwedge_find_by_wname(cname);
} else
- booted_device = rsc->sc_dev;
+ candidate_root = rsc->sc_dev;
+#ifndef RAIDFRAME_FORCE_ROOT
+ if (booted_device == NULL)
+ cpu_rootconf();
+ if (booted_device == NULL
+ || rf_containsboot(&rsc->sc_r, booted_device))
+#endif
+ booted_device = candidate_root;
} else if (num_root > 1) {
/*
@@ -528,14 +552,7 @@ rf_buildroothack(RF_ConfigSet_t *config_sets)
if (r->root_partition == 0)
continue;
- for (col = 0; col < r->numCol; col++) {
- devname = r->Disks[col].devname;
- devname += sizeof("/dev/") - 1;
- if (strncmp(devname, device_xname(booted_device),
- strlen(device_xname(booted_device))) != 0)
- continue;
- aprint_debug("raid%d includes boot device %s\n",
- sc->sc_unit, devname);
+ if (rf_containsboot(r, booted_device)) {
num_root++;
rsc = sc;
}