Module Name:    src
Committed By:   thorpej
Date:           Thu Aug  5 03:37:41 UTC 2021

Modified Files:
        src/sys/dev/raidframe [thorpej-cfargs2]: raidframeio.h raidframevar.h
            rf_dagfuncs.c rf_netbsdkintf.c rf_pqdegdags.c rf_raid.h

Log Message:
Sync w/ HEAD.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.9.28.1 src/sys/dev/raidframe/raidframeio.h
cvs rdiff -u -r1.21 -r1.21.18.1 src/sys/dev/raidframe/raidframevar.h
cvs rdiff -u -r1.33 -r1.33.2.1 src/sys/dev/raidframe/rf_dagfuncs.c
cvs rdiff -u -r1.397 -r1.397.2.1 src/sys/dev/raidframe/rf_netbsdkintf.c
cvs rdiff -u -r1.14 -r1.14.2.1 src/sys/dev/raidframe/rf_pqdegdags.c
cvs rdiff -u -r1.49 -r1.49.2.1 src/sys/dev/raidframe/rf_raid.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/raidframe/raidframeio.h
diff -u src/sys/dev/raidframe/raidframeio.h:1.9 src/sys/dev/raidframe/raidframeio.h:1.9.28.1
--- src/sys/dev/raidframe/raidframeio.h:1.9	Sat Jan 20 01:32:45 2018
+++ src/sys/dev/raidframe/raidframeio.h	Thu Aug  5 03:37:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: raidframeio.h,v 1.9 2018/01/20 01:32:45 mrg Exp $ */
+/*	$NetBSD: raidframeio.h,v 1.9.28.1 2021/08/05 03:37:41 thorpej 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/raidframevar.h
diff -u src/sys/dev/raidframe/raidframevar.h:1.21 src/sys/dev/raidframe/raidframevar.h:1.21.18.1
--- src/sys/dev/raidframe/raidframevar.h:1.21	Thu Oct 10 03:43:59 2019
+++ src/sys/dev/raidframe/raidframevar.h	Thu Aug  5 03:37:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: raidframevar.h,v 1.21 2019/10/10 03:43:59 christos Exp $ */
+/*	$NetBSD: raidframevar.h,v 1.21.18.1 2021/08/05 03:37:41 thorpej Exp $ */
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -355,6 +355,7 @@ typedef RF_uint32 RF_ReconReqFlags_t;
 /* flags that can be put in the rf_recon_req structure */
 #define RF_FDFLAGS_NONE   0x0	/* just fail the disk */
 #define RF_FDFLAGS_RECON  0x1	/* fail and initiate recon */
+#define RF_FDFLAGS_RECON_FORCE  0x2	/* fail and initiate recon, ignoring errors */
 
 struct rf_recon_req {		/* used to tell the kernel to fail a disk */
 	RF_RowCol_t col;

Index: src/sys/dev/raidframe/rf_dagfuncs.c
diff -u src/sys/dev/raidframe/rf_dagfuncs.c:1.33 src/sys/dev/raidframe/rf_dagfuncs.c:1.33.2.1
--- src/sys/dev/raidframe/rf_dagfuncs.c:1.33	Tue Jul 27 03:01:48 2021
+++ src/sys/dev/raidframe/rf_dagfuncs.c	Thu Aug  5 03:37:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_dagfuncs.c,v 1.33 2021/07/27 03:01:48 oster Exp $	*/
+/*	$NetBSD: rf_dagfuncs.c,v 1.33.2.1 2021/08/05 03:37:41 thorpej Exp $	*/
 /*
  * Copyright (c) 1995 Carnegie-Mellon University.
  * All rights reserved.
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_dagfuncs.c,v 1.33 2021/07/27 03:01:48 oster Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_dagfuncs.c,v 1.33.2.1 2021/08/05 03:37:41 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/ioctl.h>
@@ -121,7 +121,7 @@ rf_TerminateUndoFunc(RF_DagNode_t *node)
  *
  * parameters:
  *
- * 0 - physical disk addres of data
+ * 0 - physical disk address of data
  * 1 - buffer for holding read data
  * 2 - parity stripe ID
  * 3 - flags

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.397.2.1
--- src/sys/dev/raidframe/rf_netbsdkintf.c:1.397	Mon Jul 26 22:50:36 2021
+++ src/sys/dev/raidframe/rf_netbsdkintf.c	Thu Aug  5 03:37:41 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.397.2.1 2021/08/05 03:37:41 thorpej 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.397.2.1 2021/08/05 03:37:41 thorpej 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);

Index: src/sys/dev/raidframe/rf_pqdegdags.c
diff -u src/sys/dev/raidframe/rf_pqdegdags.c:1.14 src/sys/dev/raidframe/rf_pqdegdags.c:1.14.2.1
--- src/sys/dev/raidframe/rf_pqdegdags.c:1.14	Sun Aug  1 15:29:30 2021
+++ src/sys/dev/raidframe/rf_pqdegdags.c	Thu Aug  5 03:37:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_pqdegdags.c,v 1.14 2021/08/01 15:29:30 andvar Exp $	*/
+/*	$NetBSD: rf_pqdegdags.c,v 1.14.2.1 2021/08/05 03:37:41 thorpej Exp $	*/
 /*
  * Copyright (c) 1995 Carnegie-Mellon University.
  * All rights reserved.
@@ -33,7 +33,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_pqdegdags.c,v 1.14 2021/08/01 15:29:30 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_pqdegdags.c,v 1.14.2.1 2021/08/05 03:37:41 thorpej Exp $");
 
 #include "rf_archs.h"
 
@@ -379,7 +379,7 @@ RF_CREATE_DAG_FUNC_DECL(rf_PQ_DDLargeWri
        failed data units will do the correct thing. So in this case,
        the dag looks like
 
-            full stripe read of surviving data units (not being overwriten)
+            full stripe read of surviving data units (not being overwritten)
 	    write new data (ignoring failed units)   compute P&Q
 	                                             write P&Q
 

Index: src/sys/dev/raidframe/rf_raid.h
diff -u src/sys/dev/raidframe/rf_raid.h:1.49 src/sys/dev/raidframe/rf_raid.h:1.49.2.1
--- src/sys/dev/raidframe/rf_raid.h:1.49	Fri Jul 23 00:54:45 2021
+++ src/sys/dev/raidframe/rf_raid.h	Thu Aug  5 03:37:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_raid.h,v 1.49 2021/07/23 00:54:45 oster Exp $	*/
+/*	$NetBSD: rf_raid.h,v 1.49.2.1 2021/08/05 03:37:41 thorpej Exp $	*/
 /*
  * Copyright (c) 1995 Carnegie-Mellon University.
  * All rights reserved.
@@ -187,6 +187,7 @@ struct RF_Raid_s {
 	RF_HeadSepLimit_t headSepLimit;
 	int     numFloatingReconBufs;
 	int     reconInProgress;
+	int     forceRecon;
 	rf_declare_cond2(waitForReconCond);	/* goes with raidPtr->mutex */
 	RF_RaidReconDesc_t *reconDesc;	/* reconstruction descriptor */
 	RF_ReconCtrl_t *reconControl;	/* reconstruction control structure

Reply via email to