Module Name: src Committed By: oster Date: Mon Aug 2 20:31:15 UTC 2021
Modified Files: src/sbin/raidctl: raidctl.8 raidctl.c src/sys/dev/raidframe: raidframeio.h rf_netbsdkintf.c Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.77 -r1.78 src/sbin/raidctl/raidctl.8 cvs rdiff -u -r1.73 -r1.74 src/sbin/raidctl/raidctl.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/raidframe/raidframeio.h cvs rdiff -u -r1.397 -r1.398 src/sys/dev/raidframe/rf_netbsdkintf.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/raidctl/raidctl.8 diff -u src/sbin/raidctl/raidctl.8:1.77 src/sbin/raidctl/raidctl.8:1.78 --- src/sbin/raidctl/raidctl.8:1.77 Thu May 27 07:03:27 2021 +++ src/sbin/raidctl/raidctl.8 Mon Aug 2 20:31:15 2021 @@ -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, Index: src/sbin/raidctl/raidctl.c diff -u src/sbin/raidctl/raidctl.c:1.73 src/sbin/raidctl/raidctl.c:1.74 --- src/sbin/raidctl/raidctl.c:1.73 Sun Aug 1 20:26:53 2021 +++ src/sbin/raidctl/raidctl.c Mon Aug 2 20:31:15 2021 @@ -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; } Index: src/sys/dev/raidframe/raidframeio.h diff -u src/sys/dev/raidframe/raidframeio.h:1.9 src/sys/dev/raidframe/raidframeio.h:1.10 --- src/sys/dev/raidframe/raidframeio.h:1.9 Sat Jan 20 01:32:45 2018 +++ src/sys/dev/raidframe/raidframeio.h Mon Aug 2 20:31:14 2021 @@ -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_ */ + Index: src/sys/dev/raidframe/rf_netbsdkintf.c diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.397 src/sys/dev/raidframe/rf_netbsdkintf.c:1.398 --- src/sys/dev/raidframe/rf_netbsdkintf.c:1.397 Mon Jul 26 22:50:36 2021 +++ src/sys/dev/raidframe/rf_netbsdkintf.c Mon Aug 2 20:31:14 2021 @@ -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_Ra 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 b 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 *d 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 *d /* 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_inter 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_re 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);