diff options
| author | mrg <mrg@NetBSD.org> | 2018-01-20 01:32:45 +0000 |
|---|---|---|
| committer | mrg <mrg@NetBSD.org> | 2018-01-20 01:32:45 +0000 |
| commit | d8ae80b97296f980733fe4c3602b4657aff3f929 (patch) | |
| tree | a1fdc4d6e4a5be8498f8ecb578055f348b66cd83 /sys/dev/raidframe | |
| parent | 9c445fe452e3b578fe2f7c47d65a2c63bc581c74 (diff) | |
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.
Diffstat (limited to 'sys/dev/raidframe')
| -rw-r--r-- | sys/dev/raidframe/raidframeio.h | 5 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_compat32.h | 4 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_compat80.c | 75 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_compat80.h | 37 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_netbsdkintf.c | 9 |
5 files changed, 121 insertions, 9 deletions
diff --git a/sys/dev/raidframe/raidframeio.h b/sys/dev/raidframe/raidframeio.h index 908fdff2b7c..72539e2e06f 100644 --- a/sys/dev/raidframe/raidframeio.h +++ b/sys/dev/raidframe/raidframeio.h @@ -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_ */ diff --git a/sys/dev/raidframe/rf_compat32.h b/sys/dev/raidframe/rf_compat32.h index 3cc430f3fb1..78da0fd656d 100644 --- a/sys/dev/raidframe/rf_compat32.h +++ b/sys/dev/raidframe/rf_compat32.h @@ -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); diff --git a/sys/dev/raidframe/rf_compat80.c b/sys/dev/raidframe/rf_compat80.c index 5c75f408106..53b963da8a3 100644 --- a/sys/dev/raidframe/rf_compat80.c +++ b/sys/dev/raidframe/rf_compat80.c @@ -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 *data) 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 *raidPtr, void *data) 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; +} diff --git a/sys/dev/raidframe/rf_compat80.h b/sys/dev/raidframe/rf_compat80.h index 2e1d4d65412..df4601813b6 100644 --- a/sys/dev/raidframe/rf_compat80.h +++ b/sys/dev/raidframe/rf_compat80.h @@ -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_ */ diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c index 9ecadaa6745..e558368c443 100644 --- a/sys/dev/raidframe/rf_netbsdkintf.c +++ b/sys/dev/raidframe/rf_netbsdkintf.c @@ -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 *data, int flag, struct lwp *l) 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 */ |
