Module Name: src
Committed By: christos
Date: Thu Apr 3 15:30:52 UTC 2014
Modified Files:
src/sys/dev/raidframe: rf_netbsdkintf.c
Log Message:
Fix bugs in raidframe + wedge and root interaction:
1. Don't call cpu_rootconf() just to setup booted_device. Calling cpu_rootconf()
multiple times can have nasty side effects (aside from printing root device
twice). Instead for those who have it, call cpu_bootconf() which is intended
just for that.
2. If the raid component devices are wedges, then matching the booted_device
against the wedges will never work; match instead on the wedges parent.
XXX: perhaps should keep looking if the parent is a wedge too?
To generate a diff of this commit:
cvs rdiff -u -r1.306 -r1.307 src/sys/dev/raidframe/rf_netbsdkintf.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/raidframe/rf_netbsdkintf.c
diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.306 src/sys/dev/raidframe/rf_netbsdkintf.c:1.307
--- src/sys/dev/raidframe/rf_netbsdkintf.c:1.306 Tue Apr 1 22:17:01 2014
+++ src/sys/dev/raidframe/rf_netbsdkintf.c Thu Apr 3 11:30:52 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_netbsdkintf.c,v 1.306 2014/04/02 02:17:01 christos Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.307 2014/04/03 15:30:52 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.306 2014/04/02 02:17:01 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.307 2014/04/03 15:30:52 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -431,6 +431,16 @@ rf_autoconfig(device_t self)
/* XXX This code can only be run once. */
raidautoconfigdone = true;
+#ifdef __HAVE_CPU_BOOTCONF
+ /*
+ * 0. find the boot device if needed first so we can use it later
+ * this needs to be done before we autoconfigure any raid sets,
+ * because if we use wedges we are not going to be able to open
+ * the boot device later
+ */
+ if (booted_device == NULL)
+ cpu_bootconf();
+#endif
/* 1. locate all RAID components on the system */
aprint_debug("Searching for RAID components...\n");
ac_list = rf_find_raid_components();
@@ -448,13 +458,19 @@ rf_autoconfig(device_t self)
}
static int
-rf_containsboot(RF_Raid_t *r, device_t dv) {
- const char *bootname = device_xname(dv);
+rf_containsboot(RF_Raid_t *r, device_t bdv) {
+ const char *bootname = device_xname(bdv);
size_t len = strlen(bootname);
for (int col = 0; col < r->numCol; col++) {
- char *devname = r->Disks[col].devname;
+ const char *devname = r->Disks[col].devname;
devname += sizeof("/dev/") - 1;
+ if (strncmp(devname, "dk", 2) == 0) {
+ const char *parent =
+ dkwedge_get_parent_name(r->Disks[col].dev);
+ if (parent != NULL)
+ devname = parent;
+ }
if (strncmp(devname, bootname, len) == 0) {
struct raid_softc *sc = r->softc;
aprint_debug("raid%d includes boot device %s\n",
@@ -522,8 +538,6 @@ rf_buildroothack(RF_ConfigSet_t *config_
} else
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
@@ -536,9 +550,6 @@ rf_buildroothack(RF_ConfigSet_t *config_
* booted_device and will ask the user if nothing was
* hardwired in the kernel config file
*/
-
- if (booted_device == NULL)
- cpu_rootconf();
if (booted_device == NULL)
return;