Module Name:    src
Committed By:   mrg
Date:           Sat Jan 20 01:32:45 UTC 2018

Modified Files:
        src/sys/dev/raidframe: raidframeio.h rf_compat32.h rf_compat80.c
            rf_compat80.h rf_netbsdkintf.c

Log Message:
fixes for the previous, noted by nakayama@.

- RAIDFRAME_CONFIGURE needs to be versioned as the rows was removed,
  adding RAIDFRAME_CONFIGURE80, rf_config80() etc.
- RAIDFRAME_CONFIGURE32 changes to match
- rf_get_info80() passed the wrong source to copyout()

some fixes to my original change were independantly made by nakayama@
who confirmed the changes work properly now.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/raidframe/raidframeio.h
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/raidframe/rf_compat32.h \
    src/sys/dev/raidframe/rf_compat80.c src/sys/dev/raidframe/rf_compat80.h
cvs rdiff -u -r1.354 -r1.355 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/sys/dev/raidframe/raidframeio.h
diff -u src/sys/dev/raidframe/raidframeio.h:1.8 src/sys/dev/raidframe/raidframeio.h:1.9
--- src/sys/dev/raidframe/raidframeio.h:1.8	Thu Jan 18 00:32:49 2018
+++ src/sys/dev/raidframe/raidframeio.h	Sat Jan 20 01:32:45 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: raidframeio.h,v 1.8 2018/01/18 00:32:49 mrg Exp $ */
+/*	$NetBSD: raidframeio.h,v 1.9 2018/01/20 01:32:45 mrg Exp $ */
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -123,7 +123,7 @@
 #define RAIDFRAME_CHECK_RECON_STATUS_EXT _IOWR('r',  32, RF_ProgressInfo_t)
 #define RAIDFRAME_CHECK_PARITYREWRITE_STATUS_EXT _IOWR ('r', 33, RF_ProgressInfo_t)
 #define RAIDFRAME_CHECK_COPYBACK_STATUS_EXT _IOWR ('r', 34, RF_ProgressInfo_t)
-#define RAIDFRAME_CONFIGURE         _IOW ('r',  35, void *)	/* configure the driver */
+/* 35 was RAIDFRAME_CONFIGURE */
 /* 36 was RAIDFRAME_GET_INFO */
 
 #define RAIDFRAME_PARITYMAP_STATUS  _IOR('r', 37, struct rf_pmstat)
@@ -132,5 +132,6 @@
 #define RAIDFRAME_PARITYMAP_SET_PARAMS _IOW('r', 40, struct rf_pmparams)
 #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 */
 
 #endif				/* !_RF_RAIDFRAMEIO_H_ */

Index: src/sys/dev/raidframe/rf_compat32.h
diff -u src/sys/dev/raidframe/rf_compat32.h:1.1 src/sys/dev/raidframe/rf_compat32.h:1.2
--- src/sys/dev/raidframe/rf_compat32.h:1.1	Thu Jan 18 00:32:49 2018
+++ src/sys/dev/raidframe/rf_compat32.h	Sat Jan 20 01:32:45 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_compat32.h,v 1.1 2018/01/18 00:32:49 mrg Exp $	*/
+/*	$NetBSD: rf_compat32.h,v 1.2 2018/01/20 01:32:45 mrg Exp $	*/
 
 /*
  * Copyright (c) 2017 Matthew R. Green
@@ -33,7 +33,7 @@
 
 #include <compat/netbsd32/netbsd32.h>
 
-#define RAIDFRAME_CONFIGURE32         _IOW ('r',  35, netbsd32_pointer_t)	/* configure the driver */
+#define RAIDFRAME_CONFIGURE32         _IOW ('r',  43, netbsd32_pointer_t)	/* configure the driver */
 #define RAIDFRAME_GET_INFO32          _IOWR('r', 42, netbsd32_pointer_t)	/* get configuration */
 
 int rf_config_netbsd32(void *data, RF_Config_t *k_cfg);
Index: src/sys/dev/raidframe/rf_compat80.c
diff -u src/sys/dev/raidframe/rf_compat80.c:1.1 src/sys/dev/raidframe/rf_compat80.c:1.2
--- src/sys/dev/raidframe/rf_compat80.c:1.1	Thu Jan 18 00:32:49 2018
+++ src/sys/dev/raidframe/rf_compat80.c	Sat Jan 20 01:32:45 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_compat80.c,v 1.1 2018/01/18 00:32:49 mrg Exp $	*/
+/*	$NetBSD: rf_compat80.c,v 1.2 2018/01/20 01:32:45 mrg Exp $	*/
 
 /*
  * Copyright (c) 2017 Matthew R. Green
@@ -112,7 +112,7 @@ rf_get_info80(RF_Raid_t *raidPtr, void *
 			rf_copy_raiddisk80(&config->spares[i],
 					   &config80->spares[i]);
 		}
-		rv = copyout(&config, *configPtr80, sizeof *config80);
+		rv = copyout(config80, *configPtr80, sizeof *config80);
 	}
 	RF_Free(config, sizeof(RF_DeviceConfig_t));
 	RF_Free(config80, sizeof(RF_DeviceConfig_t80));
@@ -146,3 +146,74 @@ rf_get_component_label80(RF_Raid_t *raid
 
 	return retcode;
 }
+
+int
+rf_config80(RF_Raid_t *raidPtr, int unit, void *data, RF_Config_t **k_cfgp)
+{
+	RF_Config_t80 *u80_cfg, *k80_cfg;
+	RF_Config_t *k_cfg;
+	size_t i, j;
+	int error;
+
+	if (raidPtr->valid) {
+		/* There is a valid RAID set running on this unit! */
+		printf("raid%d: Device already configured!\n", unit);
+		return EINVAL;
+	}
+
+	/* copy-in the configuration information */
+	/* data points to a pointer to the configuration structure */
+
+	u80_cfg = *((RF_Config_t80 **) data);
+	RF_Malloc(k80_cfg, sizeof(RF_Config_t80), (RF_Config_t80 *));
+	if (k80_cfg == NULL)
+		return ENOMEM;
+
+	error = copyin(u80_cfg, k80_cfg, sizeof(RF_Config_t80));
+	if (error) {
+		RF_Free(k80_cfg, sizeof(RF_Config_t80));
+		return error;
+	}
+	RF_Malloc(k_cfg, sizeof(RF_Config_t), (RF_Config_t *));
+	if (k_cfg == NULL) {
+		RF_Free(k80_cfg, sizeof(RF_Config_t80));
+		return ENOMEM;
+	}
+
+	k_cfg->numCol = k80_cfg->numCol;
+	k_cfg->numSpare = k80_cfg->numSpare;
+
+	for (i = 0; i < RF_MAXROW; i++)
+		for (j = 0; j < RF_MAXCOL; j++)
+			k_cfg->devs[i][j] = k80_cfg->devs[i][j];
+
+	memcpy(k_cfg->devnames, k80_cfg->devnames,
+	    sizeof(k_cfg->devnames));
+
+	for (i = 0; i < RF_MAXSPARE; i++)
+		k_cfg->spare_devs[i] = k80_cfg->spare_devs[i];
+
+	memcpy(k_cfg->spare_names, k80_cfg->spare_names,
+	    sizeof(k_cfg->spare_names));
+
+	k_cfg->sectPerSU = k80_cfg->sectPerSU;
+	k_cfg->SUsPerPU = k80_cfg->SUsPerPU;
+	k_cfg->SUsPerRU = k80_cfg->SUsPerRU;
+	k_cfg->parityConfig = k80_cfg->parityConfig;
+
+	memcpy(k_cfg->diskQueueType, k80_cfg->diskQueueType,
+	    sizeof(k_cfg->diskQueueType));
+
+	k_cfg->maxOutstandingDiskReqs = k80_cfg->maxOutstandingDiskReqs;
+
+	memcpy(k_cfg->debugVars, k80_cfg->debugVars,
+	    sizeof(k_cfg->debugVars));
+
+	k_cfg->layoutSpecificSize = k80_cfg->layoutSpecificSize;
+	k_cfg->layoutSpecific = k80_cfg->layoutSpecific;
+	k_cfg->force = k80_cfg->force;
+
+	RF_Free(k80_cfg, sizeof(RF_Config_t80));
+	*k_cfgp = k_cfg;
+	return 0;
+}
Index: src/sys/dev/raidframe/rf_compat80.h
diff -u src/sys/dev/raidframe/rf_compat80.h:1.1 src/sys/dev/raidframe/rf_compat80.h:1.2
--- src/sys/dev/raidframe/rf_compat80.h:1.1	Thu Jan 18 00:32:49 2018
+++ src/sys/dev/raidframe/rf_compat80.h	Sat Jan 20 01:32:45 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_compat80.h,v 1.1 2018/01/18 00:32:49 mrg Exp $	*/
+/*	$NetBSD: rf_compat80.h,v 1.2 2018/01/20 01:32:45 mrg Exp $	*/
 
 /*
  * Copyright (c) 2017 Matthew R. Green
@@ -71,6 +71,39 @@ typedef struct RF_DeviceConfig_s80 {
 	RF_RaidDisk_t80 spares[RF_MAX_DISKS];
 } RF_DeviceConfig_t80;
 
+typedef struct RF_Config_s80 {
+	RF_RowCol_t numRow, numCol, numSpare;	/* number of rows, columns,
+						 * and spare disks */
+	dev_t   devs[RF_MAXROW][RF_MAXCOL];	/* device numbers for disks
+						 * comprising array */
+	char    devnames[RF_MAXROW][RF_MAXCOL][50];	/* device names */
+	dev_t   spare_devs[RF_MAXSPARE];	/* device numbers for spare
+						 * disks */
+	char    spare_names[RF_MAXSPARE][50];	/* device names */
+	RF_SectorNum_t sectPerSU;	/* sectors per stripe unit */
+	RF_StripeNum_t SUsPerPU;/* stripe units per parity unit */
+	RF_StripeNum_t SUsPerRU;/* stripe units per reconstruction unit */
+	RF_ParityConfig_t parityConfig;	/* identifies the RAID architecture to
+					 * be used */
+	RF_DiskQueueType_t diskQueueType;	/* 'f' = fifo, 'c' = cvscan,
+						 * not used in kernel */
+	char    maxOutstandingDiskReqs;	/* # concurrent reqs to be sent to a
+					 * disk.  not used in kernel. */
+	char    debugVars[RF_MAXDBGV][50];	/* space for specifying debug
+						 * variables & their values */
+	unsigned int layoutSpecificSize;	/* size in bytes of
+						 * layout-specific info */
+	void   *layoutSpecific;	/* a pointer to a layout-specific structure to
+				 * be copied in */
+	int     force;                          /* if !0, ignore many fatal
+						   configuration conditions */
+	/*
+	   "force" is used to override cases where the component labels would
+	   indicate that configuration should not proceed without user
+	   intervention
+	 */
+} RF_Config_t80;
+
 /*
  * These ioctls were versioned after NetBSD 8.x.
  *
@@ -90,11 +123,13 @@ typedef struct RF_DeviceConfig_s80 {
 #define RAIDFRAME_CHECK_PARITYREWRITE_STATUS_EXT80	_IOWR('r', 33, RF_ProgressInfo_t *)
 #define RAIDFRAME_CHECK_COPYBACK_STATUS_EXT80		_IOWR('r', 34, RF_ProgressInfo_t *)
 #define RAIDFRAME_GET_INFO80				_IOWR('r', 36, RF_DeviceConfig_t80 *)
+#define RAIDFRAME_CONFIGURE80				_IOW ('r', 35, void *)
 
 int rf_check_recon_status_ext80(RF_Raid_t *, void *);
 int rf_check_parityrewrite_status_ext80(RF_Raid_t *, void *);
 int rf_check_copyback_status_ext80(RF_Raid_t *, void *);
 int rf_get_info80(RF_Raid_t *, void *);
 int rf_get_component_label80(RF_Raid_t *, void *);
+int rf_config80(RF_Raid_t *, int, void *, RF_Config_t **);
 
 #endif /* _RF_COMPAT80_H_ */

Index: src/sys/dev/raidframe/rf_netbsdkintf.c
diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.354 src/sys/dev/raidframe/rf_netbsdkintf.c:1.355
--- src/sys/dev/raidframe/rf_netbsdkintf.c:1.354	Fri Jan 19 09:04:23 2018
+++ src/sys/dev/raidframe/rf_netbsdkintf.c	Sat Jan 20 01:32:45 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_netbsdkintf.c,v 1.354 2018/01/19 09:04:23 skrll Exp $	*/
+/*	$NetBSD: rf_netbsdkintf.c,v 1.355 2018/01/20 01:32:45 mrg 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.354 2018/01/19 09:04:23 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.355 2018/01/20 01:32:45 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1149,6 +1149,11 @@ raidioctl(dev_t dev, u_long cmd, void *d
 
 	case RAIDFRAME_GET_COMPONENT_LABEL80:
 		return rf_get_component_label80(raidPtr, data);
+
+	case RAIDFRAME_CONFIGURE80:
+		if ((retcode = rf_config80(raidPtr, unit, data, &k_cfg)) != 0)
+			return retcode;
+		goto config;
 #endif
 
 		/* configure the system */

Reply via email to