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:
parent
4ea42cccd0
commit
7464f2ddcd
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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_ */
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue