Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Support on-demand re-scanning all devices to look for



details:   https://anonhg.NetBSD.org/src/rev/d510294a722b
branches:  trunk
changeset: 984974:d510294a722b
user:      oster <oster%NetBSD.org@localhost>
date:      Mon Aug 02 20:31:14 2021 +0000

description:
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.

diffstat:

 sbin/raidctl/raidctl.8             |  16 ++++++-
 sbin/raidctl/raidctl.c             |  13 ++++-
 sys/dev/raidframe/raidframeio.h    |   5 +-
 sys/dev/raidframe/rf_netbsdkintf.c |  78 ++++++++++++++++++++++++++++++++++++-
 4 files changed, 102 insertions(+), 10 deletions(-)

diffs (247 lines):

diff -r 1c4f6febf106 -r d510294a722b sbin/raidctl/raidctl.8
--- a/sbin/raidctl/raidctl.8    Mon Aug 02 20:20:54 2021 +0000
+++ b/sbin/raidctl/raidctl.8    Mon Aug 02 20:31:14 2021 +0000
@@ -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 @@
 .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,
diff -r 1c4f6febf106 -r d510294a722b sbin/raidctl/raidctl.c
--- a/sbin/raidctl/raidctl.c    Mon Aug 02 20:20:54 2021 +0000
+++ b/sbin/raidctl/raidctl.c    Mon Aug 02 20:31:14 2021 +0000
@@ -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 @@
        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 @@
                        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 @@
                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;
        }
diff -r 1c4f6febf106 -r d510294a722b sys/dev/raidframe/raidframeio.h
--- a/sys/dev/raidframe/raidframeio.h   Mon Aug 02 20:20:54 2021 +0000
+++ b/sys/dev/raidframe/raidframeio.h   Mon Aug 02 20:31:14 2021 +0000
@@ -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_ */
 
-#endif                         /* !_RF_RAIDFRAMEIO_H_ */
diff -r 1c4f6febf106 -r d510294a722b sys/dev/raidframe/rf_netbsdkintf.c
--- a/sys/dev/raidframe/rf_netbsdkintf.c        Mon Aug 02 20:20:54 2021 +0000
+++ b/sys/dev/raidframe/rf_netbsdkintf.c        Mon Aug 02 20:31:14 2021 +0000
@@ -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_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 @@
        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 @@
 
        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 @@
                /* 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 @@
        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 @@
        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);



Home | Main Index | Thread Index | Old Index