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. .\" Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
.\" All rights reserved. .\" All rights reserved.
@ -53,7 +53,7 @@
.\" any improvements or extensions that they make and grant Carnegie the .\" any improvements or extensions that they make and grant Carnegie the
.\" rights to redistribute these changes. .\" rights to redistribute these changes.
.\" .\"
.Dd May 26, 2021 .Dd August 2, 2021
.Dt RAIDCTL 8 .Dt RAIDCTL 8
.Os .Os
.Sh NAME .Sh NAME
@ -96,6 +96,9 @@
.Fl i Ar dev .Fl i Ar dev
.Nm .Nm
.Op Fl v .Op Fl v
.Fl L Ar dev
.Nm
.Op Fl v
.Fl M .Fl M
.Oo yes | no | set .Oo yes | no | set
.Ar params .Ar params
@ -251,6 +254,15 @@ be done for
.Em all .Em all
RAID sets before the RAID device is labeled and before RAID sets before the RAID device is labeled and before
file systems are created on the RAID device. 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 .It Fl M Ic yes Ar dev
.\"XXX should there be a section with more info on the parity map feature? .\"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, 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. * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -39,7 +39,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #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 #endif
@ -133,7 +133,7 @@ main(int argc,char *argv[])
last_unit = 0; last_unit = 0;
openmode = O_RDWR; /* default to read/write */ 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) != -1)
switch(ch) { switch(ch) {
case 'a': case 'a':
@ -202,6 +202,10 @@ main(int argc,char *argv[])
get_comp(component, optarg, sizeof(component)); get_comp(component, optarg, sizeof(component));
num_options++; num_options++;
break; break;
case 'L':
action = RAIDFRAME_RESCAN;
num_options++;
break;
case 'm': case 'm':
action = RAIDFRAME_PARITYMAP_STATUS; action = RAIDFRAME_PARITYMAP_STATUS;
openmode = O_RDONLY; openmode = O_RDONLY;
@ -362,6 +366,9 @@ main(int argc,char *argv[])
do_ioctl(fd, RAIDFRAME_SET_LAST_UNIT, &last_unit, do_ioctl(fd, RAIDFRAME_SET_LAST_UNIT, &last_unit,
"RAIDFRAME_SET_LAST_UNIT"); "RAIDFRAME_SET_LAST_UNIT");
break; break;
case RAIDFRAME_RESCAN:
do_ioctl(fd, RAIDFRAME_RESCAN, NULL, "RAIDFRAME_RESCAN");
break;
default: default:
break; 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. * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
* All rights reserved. * All rights reserved.
@ -133,5 +133,6 @@
#define RAIDFRAME_SET_LAST_UNIT _IOW('r', 41, int) #define RAIDFRAME_SET_LAST_UNIT _IOW('r', 41, int)
#define RAIDFRAME_GET_INFO _IOWR('r', 42, RF_DeviceConfig_t *) /* get configuration */ #define RAIDFRAME_GET_INFO _IOWR('r', 42, RF_DeviceConfig_t *) /* get configuration */
#define RAIDFRAME_CONFIGURE _IOW ('r', 43, void *) /* configure the driver */ #define RAIDFRAME_CONFIGURE _IOW ('r', 43, void *) /* configure the driver */
#define RAIDFRAME_RESCAN _IO ('r', 44)
#endif /* !_RF_RAIDFRAMEIO_H_ */ #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. * Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@ -101,7 +101,7 @@
***********************************************************/ ***********************************************************/
#include <sys/cdefs.h> #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 #ifdef _KERNEL_OPT
#include "opt_raid_autoconfig.h" #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_CopybackThread(RF_Raid_t *raidPtr);
static void rf_ReconstructInPlaceThread(struct rf_recon_req_internal *); static void rf_ReconstructInPlaceThread(struct rf_recon_req_internal *);
static int rf_autoconfig(device_t); static int rf_autoconfig(device_t);
static int rf_rescan(void);
static void rf_buildroothack(RF_ConfigSet_t *); static void rf_buildroothack(RF_ConfigSet_t *);
static RF_AutoConfig_t *rf_find_raid_components(void); static RF_AutoConfig_t *rf_find_raid_components(void);
@ -480,6 +481,56 @@ rf_containsboot(RF_Raid_t *r, device_t bdv) {
return 0; 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 static void
rf_buildroothack(RF_ConfigSet_t *config_sets) 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: case RAIDFRAME_REBUILD_IN_PLACE:
return rf_rebuild_in_place(raidPtr, data); return rf_rebuild_in_place(raidPtr, data);
case RAIDFRAME_GET_INFO: case RAIDFRAME_GET_INFO:
ucfgp = *(RF_DeviceConfig_t **)data; ucfgp = *(RF_DeviceConfig_t **)data;
d_cfg = RF_Malloc(sizeof(*d_cfg)); 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? */ /* XXX should errors be passed up? */
return 0; return 0;
case RAIDFRAME_RESCAN:
return rf_rescan();
case RAIDFRAME_RESET_ACCTOTALS: case RAIDFRAME_RESET_ACCTOTALS:
memset(&raidPtr->acc_totals, 0, sizeof(raidPtr->acc_totals)); memset(&raidPtr->acc_totals, 0, sizeof(raidPtr->acc_totals));
return 0; return 0;
@ -2680,9 +2734,17 @@ rf_ReconThread(struct rf_recon_req_internal *req)
raidPtr = (RF_Raid_t *) req->raidPtr; raidPtr = (RF_Raid_t *) req->raidPtr;
raidPtr->recon_in_progress = 1; raidPtr->recon_in_progress = 1;
if (req->flags & RF_FDFLAGS_RECON_FORCE) {
raidPtr->forceRecon = 1;
}
rf_FailDisk((RF_Raid_t *) req->raidPtr, req->col, rf_FailDisk((RF_Raid_t *) req->raidPtr, req->col,
((req->flags & RF_FDFLAGS_RECON) ? 1 : 0)); ((req->flags & RF_FDFLAGS_RECON) ? 1 : 0));
if (req->flags & RF_FDFLAGS_RECON_FORCE) {
raidPtr->forceRecon = 0;
}
RF_Free(req, sizeof(*req)); RF_Free(req, sizeof(*req));
raidPtr->recon_in_progress = 0; raidPtr->recon_in_progress = 0;
@ -2751,7 +2813,17 @@ rf_ReconstructInPlaceThread(struct rf_recon_req_internal *req)
s = splbio(); s = splbio();
raidPtr = req->raidPtr; raidPtr = req->raidPtr;
raidPtr->recon_in_progress = 1; raidPtr->recon_in_progress = 1;
if (req->flags & RF_FDFLAGS_RECON_FORCE) {
raidPtr->forceRecon = 1;
}
rf_ReconstructInPlace(raidPtr, req->col); rf_ReconstructInPlace(raidPtr, req->col);
if (req->flags & RF_FDFLAGS_RECON_FORCE) {
raidPtr->forceRecon = 0;
}
RF_Free(req, sizeof(*req)); RF_Free(req, sizeof(*req));
raidPtr->recon_in_progress = 0; raidPtr->recon_in_progress = 0;
splx(s); splx(s);