xref: /openbsd-src/sys/dev/softraidvar.h (revision a28daedfc357b214be5c701aa8ba8adb29a7f1c2)
1 /* $OpenBSD: softraidvar.h,v 1.66 2008/12/24 19:32:02 marco Exp $ */
2 /*
3  * Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
4  * Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef SOFTRAIDVAR_H
20 #define SOFTRAIDVAR_H
21 
22 #include <crypto/md5.h>
23 
24 #define SR_UUID_MAX		16
25 struct sr_uuid {
26 	u_int8_t		sui_id[SR_UUID_MAX];
27 } __packed;
28 
29 #define SR_META_SIZE		64	/* save space at chunk beginning */
30 #define SR_META_OFFSET		16	/* skip 8192 bytes at chunk beginning */
31 #define SR_META_VERSION		3	/* bump when sr_metadata changes */
32 struct sr_metadata {
33 	struct sr_meta_invariant {
34 		/* do not change order of ssd_magic, ssd_version */
35 		u_int64_t	ssd_magic;	/* magic id */
36 #define	SR_MAGIC		0x4d4152436372616dLLU
37 		u_int32_t	ssd_version; 	/* meta data version */
38 		u_int32_t	ssd_flags;
39 		struct sr_uuid	ssd_uuid;	/* unique identifier */
40 
41 		/* chunks */
42 		u_int32_t	ssd_chunk_no;	/* number of chunks */
43 		u_int32_t	ssd_chunk_id;	/* chunk identifier */
44 
45 		/* optional */
46 		u_int32_t	ssd_opt_no;	/* nr of optional md elements */
47 		u_int32_t	ssd_pad;
48 
49 		/* volume metadata */
50 		u_int32_t	ssd_volid;	/* volume id */
51 		u_int32_t	ssd_level;	/* raid level */
52 		int64_t		ssd_size;	/* virt disk size in blocks */
53 		char		ssd_vendor[8];	/* scsi vendor */
54 		char		ssd_product[16];/* scsi product */
55 		char		ssd_revision[4];/* scsi revision */
56 		/* optional volume members */
57 		u_int32_t	ssd_strip_size;	/* strip size */
58 	} _sdd_invariant;
59 #define ssdi			_sdd_invariant
60 	/* MD5 of invariant metadata */
61 	u_int8_t		ssd_checksum[MD5_DIGEST_LENGTH];
62 	char			ssd_devname[32];/* /dev/XXXXX */
63 	u_int32_t		ssd_meta_flags;
64 #define	SR_META_DIRTY		0x1
65 	u_int32_t		ssd_pad;
66 	u_int64_t		ssd_ondisk;	/* on disk version counter */
67 	int64_t			ssd_rebuild;	/* last block of rebuild */
68 } __packed;
69 
70 struct sr_meta_chunk {
71 	struct sr_meta_chunk_invariant {
72 		u_int32_t	scm_volid;	/* vd we belong to */
73 		u_int32_t	scm_chunk_id;	/* chunk id */
74 		char		scm_devname[32];/* /dev/XXXXX */
75 		int64_t		scm_size;	/* size of partition in blocks*/
76 		int64_t		scm_coerced_size; /* coerced sz of part in blk*/
77 		struct sr_uuid	scm_uuid;	/* unique identifier */
78 	} _scm_invariant;
79 #define scmi			_scm_invariant
80 	/* MD5 of invariant chunk metadata */
81 	u_int8_t		scm_checksum[MD5_DIGEST_LENGTH];
82 	u_int32_t		scm_status;	/* use bio bioc_disk status */
83 } __packed;
84 
85 #define SR_CRYPTO_MAXKEYBYTES	32	/* max bytes in a key (AES-XTS-256) */
86 #define SR_CRYPTO_MAXKEYS	32	/* max keys per volume */
87 #define SR_CRYPTO_KEYBITS	512	/* AES-XTS with 2 * 256 bit keys */
88 #define SR_CRYPTO_KEYBYTES	(SR_CRYPTO_KEYBITS >> 3)
89 #define SR_CRYPTO_KDFHINTBYTES	256	/* size of opaque KDF hint */
90 #define SR_CRYPTO_CHECKBYTES	64	/* size of generic key chksum struct */
91 #define SR_CRYPTO_KEY_BLKSHIFT	30	/* 0.5TB per key */
92 
93 /*
94  * Check that HMAC-SHA1_k(decrypted scm_key) == sch_mac, where
95  * k = SHA1(masking key)
96  */
97 struct sr_crypto_chk_hmac_sha1 {
98 	u_int8_t	sch_mac[20];
99 } __packed;
100 
101 struct sr_meta_crypto {
102 	u_int32_t		scm_alg;	/* vol crypto algorithm */
103 #define SR_CRYPTOA_AES_XTS_128	1
104 #define SR_CRYPTOA_AES_XTS_256	2
105 	u_int32_t		scm_flags;	/* key & kdfhint valid */
106 #define SR_CRYPTOF_INVALID	(0)
107 #define SR_CRYPTOF_KEY		(1<<0)
108 #define SR_CRYPTOF_KDFHINT	(1<<1)
109 	u_int32_t		scm_mask_alg;	/* disk key masking crypt alg */
110 #define SR_CRYPTOM_AES_ECB_256	1
111 	u_int32_t		scm_pad1;
112 	u_int8_t		scm_reserved[64];
113 
114 	/* symmetric keys used for disk encryption */
115 	u_int8_t		scm_key[SR_CRYPTO_MAXKEYS][SR_CRYPTO_KEYBYTES];
116 	/* hint to kdf algorithm (opaque to kernel) */
117 	u_int8_t		scm_kdfhint[SR_CRYPTO_KDFHINTBYTES];
118 
119 	u_int32_t		scm_check_alg;	/* key chksum algorithm */
120 #define SR_CRYPTOC_HMAC_SHA1		1
121 	u_int32_t		scm_pad2;
122 	union {
123 		struct sr_crypto_chk_hmac_sha1	chk_hmac_sha1;
124 		u_int8_t			chk_reserved2[64];
125 	}			_scm_chk;
126 #define	chk_hmac_sha1	_scm_chk.chk_hmac_sha1
127 } __packed;
128 
129 struct sr_meta_opt {
130 	struct sr_meta_opt_invariant {
131 		u_int32_t	som_type;	/* optional type */
132 #define SR_OPT_INVALID		0x00
133 #define SR_OPT_CRYPTO		0x01
134 		u_int32_t	som_pad;
135 		union {
136 			struct sr_meta_crypto smm_crypto;
137 		}		som_meta;
138 	} _som_invariant;
139 #define somi			_som_invariant
140 #define somi_crypto		_som_invariant.smm_crypto
141 	/* MD5 of invariant optional metadata */
142 	u_int8_t		som_checksum[MD5_DIGEST_LENGTH];
143 } __packed;
144 
145 /* this is a generic hint for KDF done in userland, not interpreted by the kernel. */
146 struct sr_crypto_genkdf {
147 	u_int32_t	len;
148 	u_int32_t	type;
149 #define SR_CRYPTOKDFT_INVALID	(0)
150 #define SR_CRYPTOKDFT_PBKDF2	(1<<0)
151 };
152 
153 /* this is a hint for KDF using PKCS#5.  Not interpreted by the kernel */
154 struct sr_crypto_kdf_pbkdf2 {
155 	u_int32_t	len;
156 	u_int32_t	type;
157 	u_int32_t	rounds;
158 	u_int8_t	salt[128];
159 };
160 
161 /*
162  * this structure is used to copy masking keys and KDF hints from/to userland.
163  * the embedded hint structures are not interpreted by the kernel.
164  */
165 struct sr_crypto_kdfinfo {
166 	u_int32_t	len;
167 	u_int32_t	flags;
168 #define SR_CRYPTOKDF_INVALID	(0)
169 #define SR_CRYPTOKDF_KEY	(1<<0)
170 #define SR_CRYPTOKDF_HINT	(1<<1)
171 	u_int8_t	maskkey[SR_CRYPTO_MAXKEYBYTES];
172 	union {
173 		struct sr_crypto_genkdf		generic;
174 		struct sr_crypto_kdf_pbkdf2	pbkdf2;
175 	}		_kdfhint;
176 #define genkdf		_kdfhint.generic
177 #define pbkdf2		_kdfhint.pbkdf2
178 };
179 
180 #ifdef _KERNEL
181 #include <dev/biovar.h>
182 
183 #include <sys/buf.h>
184 #include <sys/pool.h>
185 #include <sys/queue.h>
186 #include <sys/rwlock.h>
187 
188 #include <scsi/scsi_all.h>
189 #include <scsi/scsi_disk.h>
190 #include <scsi/scsiconf.h>
191 
192 #define DEVNAME(_s)     ((_s)->sc_dev.dv_xname)
193 
194 /* #define SR_DEBUG */
195 #ifdef SR_DEBUG
196 extern u_int32_t		sr_debug;
197 #define DPRINTF(x...)		do { if (sr_debug) printf(x); } while(0)
198 #define DNPRINTF(n,x...)	do { if (sr_debug & n) printf(x); } while(0)
199 #define	SR_D_CMD		0x0001
200 #define	SR_D_INTR		0x0002
201 #define	SR_D_MISC		0x0004
202 #define	SR_D_IOCTL		0x0008
203 #define	SR_D_CCB		0x0010
204 #define	SR_D_WU			0x0020
205 #define	SR_D_META		0x0040
206 #define	SR_D_DIS		0x0080
207 #define	SR_D_STATE		0x0100
208 #else
209 #define DPRINTF(x...)
210 #define DNPRINTF(n,x...)
211 #endif
212 
213 #define	SR_MAXFER		MAXPHYS
214 #define	SR_MAX_LD		1
215 #define	SR_MAX_CMDS		16
216 #define	SR_MAX_STATES		7
217 #define SR_VM_IGNORE_DIRTY	1
218 
219 /* forward define to prevent dependency goo */
220 struct sr_softc;
221 
222 struct sr_ccb {
223 	struct buf		ccb_buf;	/* MUST BE FIRST!! */
224 
225 	struct sr_workunit	*ccb_wu;
226 	struct sr_discipline	*ccb_dis;
227 
228 	int			ccb_target;
229 	int			ccb_state;
230 #define SR_CCB_FREE		0
231 #define SR_CCB_INPROGRESS	1
232 #define SR_CCB_OK		2
233 #define SR_CCB_FAILED		3
234 
235 	void			*ccb_opaque; /* discipline usable pointer */
236 
237 	TAILQ_ENTRY(sr_ccb)	ccb_link;
238 } __packed;
239 
240 TAILQ_HEAD(sr_ccb_list, sr_ccb);
241 
242 struct sr_workunit {
243 	struct scsi_xfer	*swu_xs;
244 	struct sr_discipline	*swu_dis;
245 
246 	int			swu_state;
247 #define SR_WU_FREE		0
248 #define SR_WU_INPROGRESS	1
249 #define SR_WU_OK		2
250 #define SR_WU_FAILED		3
251 #define SR_WU_PARTIALLYFAILED	4
252 #define SR_WU_DEFERRED		5
253 #define SR_WU_PENDING		6
254 #define SR_WU_RESTART		7
255 #define SR_WU_REQUEUE		8
256 
257 	int			swu_fake;	/* faked wu */
258 	/* workunit io range */
259 	daddr64_t		swu_blk_start;
260 	daddr64_t		swu_blk_end;
261 
262 	/* in flight totals */
263 	u_int32_t		swu_ios_complete;
264 	u_int32_t		swu_ios_failed;
265 	u_int32_t		swu_ios_succeeded;
266 
267 	/* number of ios that makes up the whole work unit */
268 	u_int32_t		swu_io_count;
269 
270 	/* colliding wu */
271 	struct sr_workunit	*swu_collider;
272 
273 	/* all ios that make up this workunit */
274 	struct sr_ccb_list	swu_ccb;
275 
276 	TAILQ_ENTRY(sr_workunit) swu_link;
277 };
278 
279 TAILQ_HEAD(sr_wu_list, sr_workunit);
280 
281 /* RAID 0 */
282 #define SR_RAID0_NOWU		16
283 struct sr_raid0 {
284 	int32_t			sr0_strip_bits;
285 };
286 
287 /* RAID 1 */
288 #define SR_RAID1_NOWU		16
289 struct sr_raid1 {
290 	u_int32_t		sr1_counter;
291 };
292 
293 /* CRYPTO */
294 #define SR_CRYPTO_NOWU		16
295 struct sr_crypto {
296 	struct sr_meta_crypto	scr_meta;
297 
298 	struct pool		sr_uiopl;
299 	struct pool		sr_iovpl;
300 
301 	/* XXX only keep scr_sid over time */
302 	u_int8_t		scr_key[SR_CRYPTO_MAXKEYS][SR_CRYPTO_KEYBYTES];
303 	u_int8_t		scr_maskkey[SR_CRYPTO_MAXKEYBYTES];
304 	u_int64_t		scr_sid[SR_CRYPTO_MAXKEYS];
305 };
306 
307 /* ata over ethernet */
308 #define SR_RAIDAOE_NOWU		2
309 struct sr_aoe {
310 	struct aoe_handler	*sra_ah;
311 	int			sra_tag;
312 	struct ifnet		*sra_ifp;
313 	char			sra_eaddr[6];
314 };
315 
316 struct sr_metadata_list {
317 	u_int8_t		sml_metadata[SR_META_SIZE * 512];
318 	dev_t			sml_mm;
319 	int			sml_used;
320 
321 	SLIST_ENTRY(sr_metadata_list) sml_link;
322 };
323 
324 SLIST_HEAD(sr_metadata_list_head, sr_metadata_list);
325 
326 struct sr_chunk {
327 	struct sr_meta_chunk	src_meta;	/* chunk meta data */
328 	struct sr_meta_opt	src_opt;	/* optional metadata */
329 
330 	/* runtime data */
331 	dev_t			src_dev_mm;	/* major/minor */
332 
333 	/* helper members before metadata makes it onto the chunk  */
334 	int			src_meta_ondisk;/* set when meta is on disk */
335 	char			src_devname[32];
336 	int64_t			src_size;	/* in blocks */
337 
338 	SLIST_ENTRY(sr_chunk)	src_link;
339 };
340 
341 SLIST_HEAD(sr_chunk_head, sr_chunk);
342 
343 struct sr_volume {
344 	/* runtime data */
345 	struct sr_chunk_head	sv_chunk_list;	/* linked list of all chunks */
346 	struct sr_chunk		**sv_chunks;	/* array to same chunks */
347 
348 	/* sensors */
349 	struct ksensor		sv_sensor;
350 	struct ksensordev	sv_sensordev;
351 	int			sv_sensor_valid;
352 };
353 
354 struct sr_discipline {
355 	struct sr_softc		*sd_sc;		/* link back to sr softc */
356 	u_int8_t		sd_type;	/* type of discipline */
357 #define	SR_MD_RAID0		0
358 #define	SR_MD_RAID1		1
359 #define	SR_MD_RAID5		2
360 #define	SR_MD_CACHE		3
361 #define	SR_MD_CRYPTO		4
362 #define	SR_MD_AOE_INIT		5
363 #define	SR_MD_AOE_TARG		6
364 	char			sd_name[10];	/* human readable dis name */
365 	u_int8_t		sd_scsibus;	/* scsibus discipline uses */
366 	struct scsi_link	sd_link;	/* link to midlayer */
367 
368 	union {
369 	    struct sr_raid0	mdd_raid0;
370 	    struct sr_raid1	mdd_raid1;
371 	    struct sr_crypto	mdd_crypto;
372 #ifdef AOE
373 	    struct sr_aoe	mdd_aoe;
374 #endif /* AOE */
375 	}			sd_dis_specific;/* dis specific members */
376 #define mds			sd_dis_specific
377 
378 	/* discipline metadata */
379 	struct sr_metadata	*sd_meta;	/* in memory copy of metadata */
380 	void			*sd_meta_foreign; /* non native metadata */
381 	u_int32_t		sd_meta_flags;
382 	int			sd_meta_type;	/* metadata functions */
383 
384 	int			sd_sync;
385 	int			sd_must_flush;
386 
387 	int			sd_deleted;
388 
389 	struct device		*sd_scsibus_dev;
390 	void			(*sd_shutdownhook)(void *);
391 
392 	/* discipline volume */
393 	struct sr_volume	sd_vol;		/* volume associated */
394 	int			sd_vol_status;	/* runtime vol status */
395 	/* discipline resources */
396 	struct sr_ccb		*sd_ccb;
397 	struct sr_ccb_list	sd_ccb_freeq;
398 	u_int32_t		sd_max_ccb_per_wu;
399 
400 	struct sr_workunit	*sd_wu;		/* all workunits */
401 	u_int32_t		sd_max_wu;
402 
403 	struct sr_wu_list	sd_wu_freeq;	/* free wu queue */
404 	struct sr_wu_list	sd_wu_pendq;	/* pending wu queue */
405 	struct sr_wu_list	sd_wu_defq;	/* deferred wu queue */
406 
407 	/* discipline stats */
408 	int			sd_wu_pending;
409 	u_int64_t		sd_wu_collisions;
410 
411 	/* discipline functions */
412 	int			(*sd_alloc_resources)(struct sr_discipline *);
413 	int			(*sd_free_resources)(struct sr_discipline *);
414 	int			(*sd_start_discipline)(struct sr_discipline *);
415 	void			(*sd_set_chunk_state)(struct sr_discipline *,
416 				    int, int);
417 	void			(*sd_set_vol_state)(struct sr_discipline *);
418 
419 	/* SCSI emulation */
420 	struct scsi_sense_data	sd_scsi_sense;
421 	int			(*sd_scsi_rw)(struct sr_workunit *);
422 	int			(*sd_scsi_sync)(struct sr_workunit *);
423 	int			(*sd_scsi_tur)(struct sr_workunit *);
424 	int			(*sd_scsi_start_stop)(struct sr_workunit *);
425 	int			(*sd_scsi_inquiry)(struct sr_workunit *);
426 	int			(*sd_scsi_read_cap)(struct sr_workunit *);
427 	int			(*sd_scsi_req_sense)(struct sr_workunit *);
428 };
429 
430 struct sr_softc {
431 	struct device		sc_dev;
432 
433 	int			(*sc_ioctl)(struct device *, u_long, caddr_t);
434 
435 	struct rwlock		sc_lock;
436 
437 	int			sc_sensors_running;
438 	/*
439 	 * during scsibus attach this is the discipline that is in use
440 	 * this variable is protected by sc_lock and splhigh
441 	 */
442 	struct sr_discipline	*sc_attach_dis;
443 
444 	/*
445 	 * XXX expensive, alternative would be nice but has to be cheap
446 	 * since the scsibus lookup happens on each IO
447 	 */
448 #define SR_MAXSCSIBUS		256
449 	struct sr_discipline	*sc_dis[SR_MAXSCSIBUS]; /* scsibus is u_int8_t */
450 };
451 
452 /* work units & ccbs */
453 int			sr_ccb_alloc(struct sr_discipline *);
454 void			sr_ccb_free(struct sr_discipline *);
455 struct sr_ccb		*sr_ccb_get(struct sr_discipline *);
456 void			sr_ccb_put(struct sr_ccb *);
457 int			sr_wu_alloc(struct sr_discipline *);
458 void			sr_wu_free(struct sr_discipline *);
459 struct sr_workunit	*sr_wu_get(struct sr_discipline *);
460 void			sr_wu_put(struct sr_workunit *);
461 
462 /* misc functions */
463 int32_t			sr_validate_stripsize(u_int32_t);
464 void			sr_meta_save_callback(void *, void *);
465 int			sr_validate_io(struct sr_workunit *, daddr64_t *,
466 			    char *);
467 int			sr_check_io_collision(struct sr_workunit *);
468 void			sr_scsi_done(struct sr_discipline *,
469 			    struct scsi_xfer *);
470 
471 /* discipline functions */
472 int			sr_raid_inquiry(struct sr_workunit *);
473 int			sr_raid_read_cap(struct sr_workunit *);
474 int			sr_raid_tur(struct sr_workunit *);
475 int			sr_raid_request_sense( struct sr_workunit *);
476 int			sr_raid_start_stop(struct sr_workunit *);
477 int			sr_raid_sync(struct sr_workunit *);
478 void			sr_raid_startwu(struct sr_workunit *);
479 
480 /* raid 0 */
481 int			sr_raid0_alloc_resources(struct sr_discipline *);
482 int			sr_raid0_free_resources(struct sr_discipline *);
483 int			sr_raid0_rw(struct sr_workunit *);
484 void			sr_raid0_intr(struct buf *);
485 void			sr_raid0_set_chunk_state(struct sr_discipline *,
486 			    int, int);
487 void			sr_raid0_set_vol_state(struct sr_discipline *);
488 
489 /* raid 1 */
490 int			sr_raid1_alloc_resources(struct sr_discipline *);
491 int			sr_raid1_free_resources(struct sr_discipline *);
492 int			sr_raid1_rw(struct sr_workunit *);
493 void			sr_raid1_intr(struct buf *);
494 void			sr_raid1_recreate_wu(struct sr_workunit *);
495 void			sr_raid1_set_chunk_state(struct sr_discipline *,
496 			    int, int);
497 void			sr_raid1_set_vol_state(struct sr_discipline *);
498 
499 /* crypto discipline */
500 int			sr_crypto_alloc_resources(struct sr_discipline *);
501 int			sr_crypto_free_resources(struct sr_discipline *);
502 int			sr_crypto_rw(struct sr_workunit *);
503 int			sr_crypto_get_kdf(struct bioc_createraid *,
504 			    struct sr_discipline *);
505 int			sr_crypto_create_keys(struct sr_discipline *);
506 
507 /* aoe discipline */
508 int			sr_aoe_alloc_resources(struct sr_discipline *);
509 int			sr_aoe_free_resources(struct sr_discipline *);
510 int			sr_aoe_rw(struct sr_workunit *);
511 /* aoe target */
512 int			sr_aoe_server_alloc_resources(struct sr_discipline *);
513 int			sr_aoe_server_free_resources(struct sr_discipline *);
514 int			sr_aoe_server_start(struct sr_discipline *);
515 
516 #ifdef SR_DEBUG
517 void			sr_dump_mem(u_int8_t *, int);
518 #endif
519 
520 #endif /* _KERNEL */
521 
522 #endif /* SOFTRAIDVAR_H */
523