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.
This commit is contained in:
oster 2021-08-02 20:31:14 +00:00
parent 4ea42cccd0
commit 7464f2ddcd
4 changed files with 102 additions and 10 deletions

View File

@ -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 @@ be done for
.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,

View File

@ -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 @@ main(int argc,char *argv[])
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 @@ main(int argc,char *argv[])
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 @@ main(int argc,char *argv[])
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;
}

View File

@ -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_ */

View File

@ -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_RewriteParityThread(RF_Raid_t *raidPtr);
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 @@ rf_containsboot(RF_Raid_t *r, device_t bdv) {
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 @@ raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
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 @@ raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
/* 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 @@ rf_ReconThread(struct rf_recon_req_internal *req)
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 @@ rf_ReconstructInPlaceThread(struct rf_recon_req_internal *req)
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);