rf_compat80.h revision 1.2.2.1 1 /* $NetBSD: rf_compat80.h,v 1.2.2.1 2018/03/24 01:59:15 pgoyette Exp $ */
2
3 /*
4 * Copyright (c) 2017 Matthew R. Green
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
31 #ifndef _RF_COMPAT80_H_
32 #define _RF_COMPAT80_H_
33
34 #include <sys/ioccom.h>
35
36 /* NetBSD 8.99.x removed the row, raidPtr and next members */
37 struct rf_recon_req80 {
38 RF_RowCol_t row, col;
39 RF_ReconReqFlags_t flags;
40 void *raidPtr; /* used internally; need not be set at ioctl
41 * time */
42 struct rf_recon_req *next; /* used internally; need not be set at
43 * ioctl time */
44 };
45
46 /* NetBSD 8.99.x made this structure alignment neutral */
47 typedef struct RF_RaidDisk_s80 {
48 char devname[56]; /* name of device file */
49 RF_DiskStatus_t status; /* whether it is up or down */
50 RF_RowCol_t spareRow; /* if in status "spared", this identifies the
51 * spare disk */
52 RF_RowCol_t spareCol; /* if in status "spared", this identifies the
53 * spare disk */
54 RF_SectorCount_t numBlocks; /* number of blocks, obtained via READ
55 * CAPACITY */
56 int blockSize;
57 RF_SectorCount_t partitionSize; /* The *actual* and *full* size of
58 the partition, from the disklabel */
59 int auto_configured;/* 1 if this component was autoconfigured.
60 0 otherwise. */
61 dev_t dev;
62 } RF_RaidDisk_t80;
63
64 typedef struct RF_DeviceConfig_s80 {
65 u_int rows;
66 u_int cols;
67 u_int maxqdepth;
68 int ndevs;
69 RF_RaidDisk_t80 devs[RF_MAX_DISKS];
70 int nspares;
71 RF_RaidDisk_t80 spares[RF_MAX_DISKS];
72 } RF_DeviceConfig_t80;
73
74 typedef struct RF_Config_s80 {
75 RF_RowCol_t numRow, numCol, numSpare; /* number of rows, columns,
76 * and spare disks */
77 dev_t devs[RF_MAXROW][RF_MAXCOL]; /* device numbers for disks
78 * comprising array */
79 char devnames[RF_MAXROW][RF_MAXCOL][50]; /* device names */
80 dev_t spare_devs[RF_MAXSPARE]; /* device numbers for spare
81 * disks */
82 char spare_names[RF_MAXSPARE][50]; /* device names */
83 RF_SectorNum_t sectPerSU; /* sectors per stripe unit */
84 RF_StripeNum_t SUsPerPU;/* stripe units per parity unit */
85 RF_StripeNum_t SUsPerRU;/* stripe units per reconstruction unit */
86 RF_ParityConfig_t parityConfig; /* identifies the RAID architecture to
87 * be used */
88 RF_DiskQueueType_t diskQueueType; /* 'f' = fifo, 'c' = cvscan,
89 * not used in kernel */
90 char maxOutstandingDiskReqs; /* # concurrent reqs to be sent to a
91 * disk. not used in kernel. */
92 char debugVars[RF_MAXDBGV][50]; /* space for specifying debug
93 * variables & their values */
94 unsigned int layoutSpecificSize; /* size in bytes of
95 * layout-specific info */
96 void *layoutSpecific; /* a pointer to a layout-specific structure to
97 * be copied in */
98 int force; /* if !0, ignore many fatal
99 configuration conditions */
100 /*
101 "force" is used to override cases where the component labels would
102 indicate that configuration should not proceed without user
103 intervention
104 */
105 } RF_Config_t80;
106
107 /*
108 * These ioctls were versioned after NetBSD 8.x.
109 *
110 * RAIDFRAME_FAIL_DISK had unused pointers removed from the structure.
111 * RAIDFRAME_CHECK_*EXT and RAIDFRAME_GET_COMPONENT_LABEL were converted
112 * from pointers to full structures so that ioctl framework does the copyout.
113 * RAIDFRAME_GET_INFO80 had the containing structure reorganised so that
114 * the layout became bitsize neutral.
115 *
116 * These 6 changes enable COMPAT_NETBSD32 support to work sanely with
117 * these ioctls, leaving only RAIDFRAME_CONFIGURE needing extra help.
118 */
119
120 #define RAIDFRAME_FAIL_DISK80 _IOW ('r', 5, struct rf_recon_req80)
121 #define RAIDFRAME_GET_COMPONENT_LABEL80 _IOWR('r', 19, RF_ComponentLabel_t *)
122 #define RAIDFRAME_CHECK_RECON_STATUS_EXT80 _IOWR('r', 32, RF_ProgressInfo_t *)
123 #define RAIDFRAME_CHECK_PARITYREWRITE_STATUS_EXT80 _IOWR('r', 33, RF_ProgressInfo_t *)
124 #define RAIDFRAME_CHECK_COPYBACK_STATUS_EXT80 _IOWR('r', 34, RF_ProgressInfo_t *)
125 #define RAIDFRAME_GET_INFO80 _IOWR('r', 36, RF_DeviceConfig_t80 *)
126 #define RAIDFRAME_CONFIGURE80 _IOW ('r', 35, void *)
127
128 int rf_check_recon_status_ext80(RF_Raid_t *, void *);
129 int rf_check_parityrewrite_status_ext80(RF_Raid_t *, void *);
130 int rf_check_copyback_status_ext80(RF_Raid_t *, void *);
131 int rf_get_info80(RF_Raid_t *, void *);
132 int rf_get_component_label80(RF_Raid_t *, void *);
133 int rf_config80(RF_Raid_t *, int, void *, RF_Config_t **);
134
135 int raidframe_ioctl_80(int, int, RF_Raid_t *, int, void *, RF_Config_t **);
136
137 void raidframe_80_init(void);
138 void raidframe_80_fini(void);
139
140 #endif /* _RF_COMPAT80_H_ */
141