1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
|
/* $OpenBSD: biovar.h,v 1.45 2016/08/14 04:08:03 dlg Exp $ */
/*
* Copyright (c) 2002 Niklas Hallqvist. All rights reserved.
* Copyright (c) 2005 Marco Peereboom. All rights reserved.
* Copyright (c) 2012 Joel Sing <jsing@openbsd.org>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Devices getting ioctls through this interface should use ioctl class 'B'
* and command numbers starting from 32, lower ones are reserved for generic
* ioctls. All ioctl data must be structures which start with a struct bio.
*/
#include <sys/types.h>
#define BIO_MSG_COUNT 5
#define BIO_MSG_LEN 128
struct bio_msg {
int bm_type;
#define BIO_MSG_INFO 1
#define BIO_MSG_WARN 2
#define BIO_MSG_ERROR 3
char bm_msg[BIO_MSG_LEN];
};
struct bio_status {
char bs_controller[16];
int bs_status;
#define BIO_STATUS_UNKNOWN 0
#define BIO_STATUS_SUCCESS 1
#define BIO_STATUS_ERROR 2
int bs_msg_count;
struct bio_msg bs_msgs[BIO_MSG_COUNT];
};
struct bio {
void *bio_cookie;
struct bio_status bio_status;
};
/* convert name to a cookie */
#define BIOCLOCATE _IOWR('B', 0, struct bio_locate)
struct bio_locate {
struct bio bl_bio;
char *bl_name;
};
#define BIOCINQ _IOWR('B', 32, struct bioc_inq)
struct bioc_inq {
struct bio bi_bio;
char bi_dev[16]; /* controller device */
int bi_novol; /* nr of volumes */
int bi_nodisk; /* nr of total disks */
};
#define BIOCDISK _IOWR('B', 33, struct bioc_disk)
/* structure that represents a disk in a RAID volume */
struct bioc_disk {
struct bio bd_bio;
u_int16_t bd_channel;
u_int16_t bd_target;
u_int16_t bd_lun;
u_int16_t bd_other_id; /* unused for now */
int bd_volid; /* associate with volume */
int bd_diskid; /* virtual disk */
int bd_status; /* current status */
#define BIOC_SDONLINE 0x00
#define BIOC_SDONLINE_S "Online"
#define BIOC_SDOFFLINE 0x01
#define BIOC_SDOFFLINE_S "Offline"
#define BIOC_SDFAILED 0x02
#define BIOC_SDFAILED_S "Failed"
#define BIOC_SDREBUILD 0x03
#define BIOC_SDREBUILD_S "Rebuild"
#define BIOC_SDHOTSPARE 0x04
#define BIOC_SDHOTSPARE_S "Hot spare"
#define BIOC_SDUNUSED 0x05
#define BIOC_SDUNUSED_S "Unused"
#define BIOC_SDSCRUB 0x06
#define BIOC_SDSCRUB_S "Scrubbing"
#define BIOC_SDINVALID 0xff
#define BIOC_SDINVALID_S "Invalid"
uint64_t bd_size; /* size of the disk */
char bd_vendor[32]; /* scsi string */
char bd_serial[32]; /* serial number */
char bd_procdev[16]; /* processor device */
struct {
int bdp_percent;
int bdp_seconds;
} bd_patrol;
};
#define BIOCVOL _IOWR('B', 34, struct bioc_vol)
/* structure that represents a RAID volume */
struct bioc_vol {
struct bio bv_bio;
int bv_volid; /* volume id */
int16_t bv_percent; /* percent done operation */
u_int16_t bv_seconds; /* seconds of progress so far */
int bv_status; /* current status */
#define BIOC_SVONLINE 0x00
#define BIOC_SVONLINE_S "Online"
#define BIOC_SVOFFLINE 0x01
#define BIOC_SVOFFLINE_S "Offline"
#define BIOC_SVDEGRADED 0x02
#define BIOC_SVDEGRADED_S "Degraded"
#define BIOC_SVBUILDING 0x03
#define BIOC_SVBUILDING_S "Building"
#define BIOC_SVSCRUB 0x04
#define BIOC_SVSCRUB_S "Scrubbing"
#define BIOC_SVREBUILD 0x05
#define BIOC_SVREBUILD_S "Rebuild"
#define BIOC_SVINVALID 0xff
#define BIOC_SVINVALID_S "Invalid"
uint64_t bv_size; /* size of the disk */
int bv_level; /* raid level */
int bv_nodisk; /* nr of drives */
int bv_cache; /* cache mode */
#define BIOC_CVUNKNOWN 0x00
#define BIOC_CVUNKNOWN_S ""
#define BIOC_CVWRITEBACK 0x01
#define BIOC_CVWRITEBACK_S "WB"
#define BIOC_CVWRITETHROUGH 0x02
#define BIOC_CVWRITETHROUGH_S "WT"
char bv_dev[16]; /* device */
char bv_vendor[32]; /* scsi string */
};
#define BIOCALARM _IOWR('B', 35, struct bioc_alarm)
struct bioc_alarm {
struct bio ba_bio;
int ba_opcode;
int ba_status; /* only used with get state */
#define BIOC_SADISABLE 0x00 /* disable alarm */
#define BIOC_SAENABLE 0x01 /* enable alarm */
#define BIOC_SASILENCE 0x02 /* silence alarm */
#define BIOC_GASTATUS 0x03 /* get status */
#define BIOC_SATEST 0x04 /* test alarm */
};
#define BIOCBLINK _IOWR('B', 36, struct bioc_blink)
struct bioc_blink {
struct bio bb_bio;
u_int16_t bb_channel;
u_int16_t bb_target;
int bb_status; /* current status */
#define BIOC_SBUNBLINK 0x00 /* disable blinking */
#define BIOC_SBBLINK 0x01 /* enable blink */
#define BIOC_SBALARM 0x02 /* enable alarm blink */
};
#define BIOCSETSTATE _IOWR('B', 37, struct bioc_setstate)
struct bioc_setstate {
struct bio bs_bio;
u_int16_t bs_channel;
u_int16_t bs_target;
u_int16_t bs_lun;
u_int16_t bs_other_id_type; /* use other_id instead of ctl */
#define BIOC_SSOTHER_UNUSED 0x00
#define BIOC_SSOTHER_DEVT 0x01
int bs_other_id; /* cram dev_t or other id in here */
int bs_status; /* change to this status */
#define BIOC_SSONLINE 0x00 /* online disk */
#define BIOC_SSOFFLINE 0x01 /* offline disk */
#define BIOC_SSHOTSPARE 0x02 /* mark as hotspare */
#define BIOC_SSREBUILD 0x03 /* rebuild on this disk */
int bs_volid; /* volume id for rebuild */
};
#define BIOCCREATERAID _IOWR('B', 38, struct bioc_createraid)
struct bioc_createraid {
struct bio bc_bio;
void *bc_dev_list;
u_int16_t bc_dev_list_len;
int32_t bc_key_disk;
#define BIOC_CRMAXLEN 1024
u_int16_t bc_level;
u_int32_t bc_flags;
#define BIOC_SCFORCE 0x01 /* do not assemble, force create */
#define BIOC_SCDEVT 0x02 /* dev_t array or string in dev_list */
#define BIOC_SCNOAUTOASSEMBLE 0x04 /* do not assemble during autoconf */
#define BIOC_SCBOOTABLE 0x08 /* device is bootable */
u_int32_t bc_opaque_size;
u_int32_t bc_opaque_flags;
#define BIOC_SOINVALID 0x00 /* no opaque pointer */
#define BIOC_SOIN 0x01 /* kernel perspective direction */
#define BIOC_SOOUT 0x02 /* kernel perspective direction */
u_int32_t bc_opaque_status;
#define BIOC_SOINOUT_FAILED 0x00 /* operation failed */
#define BIOC_SOINOUT_OK 0x01 /* operation succeeded */
void *bc_opaque;
};
#define BIOCDELETERAID _IOWR('B', 39, struct bioc_deleteraid)
struct bioc_deleteraid {
struct bio bd_bio;
u_int32_t bd_flags;
#define BIOC_SDCLEARMETA 0x01 /* clear metadata region */
char bd_dev[16]; /* device */
};
#define BIOCDISCIPLINE _IOWR('B', 40, struct bioc_discipline)
struct bioc_discipline {
struct bio bd_bio;
char bd_dev[16];
u_int32_t bd_cmd;
u_int32_t bd_size;
void *bd_data;
};
#define BIOCINSTALLBOOT _IOWR('B', 41, struct bioc_installboot)
struct bioc_installboot {
struct bio bb_bio;
char bb_dev[16];
void *bb_bootblk;
void *bb_bootldr;
u_int32_t bb_bootblk_size;
u_int32_t bb_bootldr_size;
};
#define BIOCPATROL _IOWR('B', 42, struct bioc_patrol)
struct bioc_patrol {
struct bio bp_bio;
int bp_opcode;
#define BIOC_SPSTOP 0x00 /* stop patrol */
#define BIOC_SPSTART 0x01 /* start patrol */
#define BIOC_GPSTATUS 0x02 /* get status */
#define BIOC_SPDISABLE 0x03 /* disable patrol */
#define BIOC_SPAUTO 0x04 /* enable patrol as auto */
#define BIOC_SPMANUAL 0x05 /* enable patrol as manual */
int bp_mode;
#define BIOC_SPMAUTO 0x00
#define BIOC_SPMMANUAL 0x01
#define BIOC_SPMDISABLED 0x02
int bp_status; /* only used with get state */
#define BIOC_SPSSTOPPED 0x00
#define BIOC_SPSREADY 0x01
#define BIOC_SPSACTIVE 0x02
#define BIOC_SPSABORTED 0xff
int bp_autoival;
int bp_autonext;
int bp_autonow;
};
/* kernel and userspace defines */
#define BIOC_INQ 0x0001
#define BIOC_DISK 0x0002
#define BIOC_VOL 0x0004
#define BIOC_ALARM 0x0008
#define BIOC_BLINK 0x0010
#define BIOC_SETSTATE 0x0020
#define BIOC_CREATERAID 0x0040
#define BIOC_DELETERAID 0x0080
#define BIOC_DISCIPLINE 0x0100
#define BIOC_INSTALLBOOT 0x0200
#define BIOC_PATROL 0x0400
/* user space defines */
#define BIOC_DEVLIST 0x10000
#ifdef _KERNEL
int bio_register(struct device *, int (*)(struct device *, u_long,
caddr_t));
void bio_unregister(struct device *);
void bio_status_init(struct bio_status *, struct device *);
void bio_status(struct bio_status *, int, int, const char *, va_list *);
void bio_info(struct bio_status *, int, const char *, ...);
void bio_warn(struct bio_status *, int, const char *, ...);
void bio_error(struct bio_status *, int, const char *, ...);
#endif
|