Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Support on-demand re-scanning all devices to look for
details: https://anonhg.NetBSD.org/src/rev/d510294a722b
branches: trunk
changeset: 984974:d510294a722b
user: oster <oster%NetBSD.org@localhost>
date: Mon Aug 02 20:31:14 2021 +0000
description:
Support on-demand re-scanning all devices to look for
autoconfig RAID sets. raidctl now supports looking
for autoconfig RAID sets with a new '-L' flag.
diffstat:
sbin/raidctl/raidctl.8 | 16 ++++++-
sbin/raidctl/raidctl.c | 13 ++++-
sys/dev/raidframe/raidframeio.h | 5 +-
sys/dev/raidframe/rf_netbsdkintf.c | 78 ++++++++++++++++++++++++++++++++++++-
4 files changed, 102 insertions(+), 10 deletions(-)
diffs (247 lines):
diff -r 1c4f6febf106 -r d510294a722b sbin/raidctl/raidctl.8
--- a/sbin/raidctl/raidctl.8 Mon Aug 02 20:20:54 2021 +0000
+++ b/sbin/raidctl/raidctl.8 Mon Aug 02 20:31:14 2021 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: raidctl.8,v 1.77 2021/05/27 07:03:27 wiz Exp $
+.\" $NetBSD: raidctl.8,v 1.78 2021/08/02 20:31:15 oster Exp $
.\"
.\" Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -53,7 +53,7 @@
.\" any improvements or extensions that they make and grant Carnegie the
.\" rights to redistribute these changes.
.\"
-.Dd May 26, 2021
+.Dd August 2, 2021
.Dt RAIDCTL 8
.Os
.Sh NAME
@@ -96,6 +96,9 @@
.Fl i Ar dev
.Nm
.Op Fl v
+.Fl L Ar dev
+.Nm
+.Op Fl v
.Fl M
.Oo yes | no | set
.Ar params
@@ -251,6 +254,15 @@
.Em all
RAID sets before the RAID device is labeled and before
file systems are created on the RAID device.
+.It Fl L Ar dev
+Rescan all devices on the system, looking for RAID sets that can be
+auto-configured. The RAID device provided here has to be a valid
+device, but does not need to be configured. (e.g.
+.Bd -literal -offset indent
+raidctl -L raid0
+.Ed
+.Pp
+is all that is needed to perform a rescan.)
.It Fl M Ic yes Ar dev
.\"XXX should there be a section with more info on the parity map feature?
Enable the use of a parity map on the RAID set; this is the default,
diff -r 1c4f6febf106 -r d510294a722b sbin/raidctl/raidctl.c
--- a/sbin/raidctl/raidctl.c Mon Aug 02 20:20:54 2021 +0000
+++ b/sbin/raidctl/raidctl.c Mon Aug 02 20:31:14 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: raidctl.c,v 1.73 2021/08/01 20:26:53 oster Exp $ */
+/* $NetBSD: raidctl.c,v 1.74 2021/08/02 20:31:15 oster Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -39,7 +39,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: raidctl.c,v 1.73 2021/08/01 20:26:53 oster Exp $");
+__RCSID("$NetBSD: raidctl.c,v 1.74 2021/08/02 20:31:15 oster Exp $");
#endif
@@ -133,7 +133,7 @@
last_unit = 0;
openmode = O_RDWR; /* default to read/write */
- while ((ch = getopt(argc, argv, "a:A:Bc:C:f:F:g:GiI:l:mM:r:R:sSpPuU:v"))
+ while ((ch = getopt(argc, argv, "a:A:Bc:C:f:F:g:GiI:l:LmM:r:R:sSpPuU:v"))
!= -1)
switch(ch) {
case 'a':
@@ -202,6 +202,10 @@
get_comp(component, optarg, sizeof(component));
num_options++;
break;
+ case 'L':
+ action = RAIDFRAME_RESCAN;
+ num_options++;
+ break;
case 'm':
action = RAIDFRAME_PARITYMAP_STATUS;
openmode = O_RDONLY;
@@ -362,6 +366,9 @@
do_ioctl(fd, RAIDFRAME_SET_LAST_UNIT, &last_unit,
"RAIDFRAME_SET_LAST_UNIT");
break;
+ case RAIDFRAME_RESCAN:
+ do_ioctl(fd, RAIDFRAME_RESCAN, NULL, "RAIDFRAME_RESCAN");
+ break;
default:
break;
}
diff -r 1c4f6febf106 -r d510294a722b sys/dev/raidframe/raidframeio.h
--- a/sys/dev/raidframe/raidframeio.h Mon Aug 02 20:20:54 2021 +0000
+++ b/sys/dev/raidframe/raidframeio.h Mon Aug 02 20:31:14 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: raidframeio.h,v 1.9 2018/01/20 01:32:45 mrg Exp $ */
+/* $NetBSD: raidframeio.h,v 1.10 2021/08/02 20:31:14 oster Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -133,5 +133,6 @@
#define RAIDFRAME_SET_LAST_UNIT _IOW('r', 41, int)
#define RAIDFRAME_GET_INFO _IOWR('r', 42, RF_DeviceConfig_t *) /* get configuration */
#define RAIDFRAME_CONFIGURE _IOW ('r', 43, void *) /* configure the driver */
+#define RAIDFRAME_RESCAN _IO ('r', 44)
+#endif /* !_RF_RAIDFRAMEIO_H_ */
-#endif /* !_RF_RAIDFRAMEIO_H_ */
diff -r 1c4f6febf106 -r d510294a722b sys/dev/raidframe/rf_netbsdkintf.c
--- a/sys/dev/raidframe/rf_netbsdkintf.c Mon Aug 02 20:20:54 2021 +0000
+++ b/sys/dev/raidframe/rf_netbsdkintf.c Mon Aug 02 20:31:14 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_netbsdkintf.c,v 1.397 2021/07/26 22:50:36 oster Exp $ */
+/* $NetBSD: rf_netbsdkintf.c,v 1.398 2021/08/02 20:31:14 oster 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.397 2021/07/26 22:50:36 oster Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.398 2021/08/02 20:31:14 oster Exp $");
#ifdef _KERNEL_OPT
#include "opt_raid_autoconfig.h"
@@ -305,6 +305,7 @@
static void rf_CopybackThread(RF_Raid_t *raidPtr);
static void rf_ReconstructInPlaceThread(struct rf_recon_req_internal *);
static int rf_autoconfig(device_t);
+static int rf_rescan(void);
static void rf_buildroothack(RF_ConfigSet_t *);
static RF_AutoConfig_t *rf_find_raid_components(void);
@@ -480,6 +481,56 @@
return 0;
}
+static int
+rf_rescan(void)
+{
+ RF_AutoConfig_t *ac_list;
+ RF_ConfigSet_t *config_sets, *cset, *next_cset;
+ struct raid_softc *sc;
+ int raid_added;
+
+ ac_list = rf_find_raid_components();
+ config_sets = rf_create_auto_sets(ac_list);
+
+ raid_added = 1;
+ while (raid_added > 0) {
+ raid_added = 0;
+ cset = config_sets;
+ while (cset != NULL) {
+ next_cset = cset->next;
+ if (rf_have_enough_components(cset) &&
+ cset->ac->clabel->autoconfigure == 1) {
+ sc = rf_auto_config_set(cset);
+ if (sc != NULL) {
+ aprint_debug("raid%d: configured ok, rootable %d\n",
+ sc->sc_unit, cset->rootable);
+ /* We added one RAID set */
+ raid_added++;
+ } else {
+ /* The autoconfig didn't work :( */
+ aprint_debug("Autoconfig failed\n");
+ rf_release_all_vps(cset);
+ }
+ } else {
+ /* we're not autoconfiguring this set...
+ release the associated resources */
+ rf_release_all_vps(cset);
+ }
+ /* cleanup */
+ rf_cleanup_config_set(cset);
+ cset = next_cset;
+ }
+ if (raid_added > 0) {
+ /* We added at least one RAID set, so re-scan for recursive RAID */
+ ac_list = rf_find_raid_components();
+ config_sets = rf_create_auto_sets(ac_list);
+ }
+ }
+
+ return 0;
+}
+
+
static void
rf_buildroothack(RF_ConfigSet_t *config_sets)
{
@@ -1529,7 +1580,7 @@
case RAIDFRAME_REBUILD_IN_PLACE:
return rf_rebuild_in_place(raidPtr, data);
-
+
case RAIDFRAME_GET_INFO:
ucfgp = *(RF_DeviceConfig_t **)data;
d_cfg = RF_Malloc(sizeof(*d_cfg));
@@ -1574,6 +1625,9 @@
/* XXX should errors be passed up? */
return 0;
+ case RAIDFRAME_RESCAN:
+ return rf_rescan();
+
case RAIDFRAME_RESET_ACCTOTALS:
memset(&raidPtr->acc_totals, 0, sizeof(raidPtr->acc_totals));
return 0;
@@ -2680,9 +2734,17 @@
raidPtr = (RF_Raid_t *) req->raidPtr;
raidPtr->recon_in_progress = 1;
+ if (req->flags & RF_FDFLAGS_RECON_FORCE) {
+ raidPtr->forceRecon = 1;
+ }
+
rf_FailDisk((RF_Raid_t *) req->raidPtr, req->col,
((req->flags & RF_FDFLAGS_RECON) ? 1 : 0));
+ if (req->flags & RF_FDFLAGS_RECON_FORCE) {
+ raidPtr->forceRecon = 0;
+ }
+
RF_Free(req, sizeof(*req));
raidPtr->recon_in_progress = 0;
@@ -2751,7 +2813,17 @@
s = splbio();
raidPtr = req->raidPtr;
raidPtr->recon_in_progress = 1;
+
+ if (req->flags & RF_FDFLAGS_RECON_FORCE) {
+ raidPtr->forceRecon = 1;
+ }
+
rf_ReconstructInPlace(raidPtr, req->col);
+
+ if (req->flags & RF_FDFLAGS_RECON_FORCE) {
+ raidPtr->forceRecon = 0;
+ }
+
RF_Free(req, sizeof(*req));
raidPtr->recon_in_progress = 0;
splx(s);
Home |
Main Index |
Thread Index |
Old Index