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.
|
.\" 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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue