1 /* $OpenBSD: softraidvar.h,v 1.63 2008/07/29 01:18: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 struct sr_metadata_list { 308 u_int8_t sml_metadata[SR_META_SIZE * 512]; 309 dev_t sml_mm; 310 int sml_used; 311 312 SLIST_ENTRY(sr_metadata_list) sml_link; 313 }; 314 315 SLIST_HEAD(sr_metadata_list_head, sr_metadata_list); 316 317 struct sr_chunk { 318 struct sr_meta_chunk src_meta; /* chunk meta data */ 319 struct sr_meta_opt src_opt; /* optional metadata */ 320 321 /* runtime data */ 322 dev_t src_dev_mm; /* major/minor */ 323 324 /* helper members before metadata makes it onto the chunk */ 325 int src_meta_ondisk;/* set when meta is on disk */ 326 char src_devname[32]; 327 int64_t src_size; /* in blocks */ 328 329 SLIST_ENTRY(sr_chunk) src_link; 330 }; 331 332 SLIST_HEAD(sr_chunk_head, sr_chunk); 333 334 struct sr_volume { 335 /* runtime data */ 336 struct sr_chunk_head sv_chunk_list; /* linked list of all chunks */ 337 struct sr_chunk **sv_chunks; /* array to same chunks */ 338 339 /* sensors */ 340 struct ksensor sv_sensor; 341 struct ksensordev sv_sensordev; 342 int sv_sensor_valid; 343 }; 344 345 struct sr_discipline { 346 struct sr_softc *sd_sc; /* link back to sr softc */ 347 u_int8_t sd_type; /* type of discipline */ 348 #define SR_MD_RAID0 0 349 #define SR_MD_RAID1 1 350 #define SR_MD_RAID5 2 351 #define SR_MD_CACHE 3 352 #define SR_MD_CRYPTO 4 353 char sd_name[10]; /* human readable dis name */ 354 u_int8_t sd_scsibus; /* scsibus discipline uses */ 355 struct scsi_link sd_link; /* link to midlayer */ 356 357 union { 358 struct sr_raid0 mdd_raid0; 359 struct sr_raid1 mdd_raid1; 360 struct sr_crypto mdd_crypto; 361 } sd_dis_specific;/* dis specific members */ 362 #define mds sd_dis_specific 363 364 /* discipline metadata */ 365 struct sr_metadata *sd_meta; /* in memory copy of metadata */ 366 void *sd_meta_foreign; /* non native metadata */ 367 u_int32_t sd_meta_flags; 368 int sd_meta_type; /* metadata functions */ 369 370 int sd_sync; 371 int sd_must_flush; 372 373 int sd_deleted; 374 375 struct device *sd_scsibus_dev; 376 void (*sd_shutdownhook)(void *); 377 378 /* discipline volume */ 379 struct sr_volume sd_vol; /* volume associated */ 380 int sd_vol_status; /* runtime vol status */ 381 /* discipline resources */ 382 struct sr_ccb *sd_ccb; 383 struct sr_ccb_list sd_ccb_freeq; 384 u_int32_t sd_max_ccb_per_wu; 385 386 struct sr_workunit *sd_wu; /* all workunits */ 387 u_int32_t sd_max_wu; 388 389 struct sr_wu_list sd_wu_freeq; /* free wu queue */ 390 struct sr_wu_list sd_wu_pendq; /* pending wu queue */ 391 struct sr_wu_list sd_wu_defq; /* deferred wu queue */ 392 393 /* discipline stats */ 394 int sd_wu_pending; 395 u_int64_t sd_wu_collisions; 396 397 /* discipline functions */ 398 int (*sd_alloc_resources)(struct sr_discipline *); 399 int (*sd_assemble_volume)(void *); 400 int (*sd_bringup_volume)(void *); 401 int (*sd_shutdown_volume)(void *); 402 int (*sd_free_resources)(struct sr_discipline *); 403 int (*sd_quiesce_io)(struct sr_discipline *); 404 void (*sd_set_chunk_state)(struct sr_discipline *, 405 int, int); 406 void (*sd_set_vol_state)(struct sr_discipline *); 407 408 /* SCSI emulation */ 409 struct scsi_sense_data sd_scsi_sense; 410 int (*sd_scsi_rw)(struct sr_workunit *); 411 int (*sd_scsi_sync)(struct sr_workunit *); 412 int (*sd_scsi_tur)(struct sr_workunit *); 413 int (*sd_scsi_start_stop)(struct sr_workunit *); 414 int (*sd_scsi_inquiry)(struct sr_workunit *); 415 int (*sd_scsi_read_cap)(struct sr_workunit *); 416 int (*sd_scsi_req_sense)(struct sr_workunit *); 417 }; 418 419 struct sr_softc { 420 struct device sc_dev; 421 422 int (*sc_ioctl)(struct device *, u_long, caddr_t); 423 424 struct rwlock sc_lock; 425 426 int sc_sensors_running; 427 /* 428 * during scsibus attach this is the discipline that is in use 429 * this variable is protected by sc_lock and splhigh 430 */ 431 struct sr_discipline *sc_attach_dis; 432 433 /* 434 * XXX expensive, alternative would be nice but has to be cheap 435 * since the scsibus lookup happens on each IO 436 */ 437 #define SR_MAXSCSIBUS 256 438 struct sr_discipline *sc_dis[SR_MAXSCSIBUS]; /* scsibus is u_int8_t */ 439 }; 440 441 /* work units & ccbs */ 442 int sr_ccb_alloc(struct sr_discipline *); 443 void sr_ccb_free(struct sr_discipline *); 444 struct sr_ccb *sr_ccb_get(struct sr_discipline *); 445 void sr_ccb_put(struct sr_ccb *); 446 int sr_wu_alloc(struct sr_discipline *); 447 void sr_wu_free(struct sr_discipline *); 448 struct sr_workunit *sr_wu_get(struct sr_discipline *); 449 void sr_wu_put(struct sr_workunit *); 450 451 /* misc functions */ 452 int32_t sr_validate_stripsize(u_int32_t); 453 void sr_meta_save_callback(void *, void *); 454 int sr_validate_io(struct sr_workunit *, daddr64_t *, 455 char *); 456 int sr_check_io_collision(struct sr_workunit *); 457 458 /* discipline functions */ 459 int sr_raid_inquiry(struct sr_workunit *); 460 int sr_raid_read_cap(struct sr_workunit *); 461 int sr_raid_tur(struct sr_workunit *); 462 int sr_raid_request_sense( struct sr_workunit *); 463 int sr_raid_start_stop(struct sr_workunit *); 464 int sr_raid_sync(struct sr_workunit *); 465 void sr_raid_startwu(struct sr_workunit *); 466 467 /* raid 0 */ 468 int sr_raid0_alloc_resources(struct sr_discipline *); 469 int sr_raid0_free_resources(struct sr_discipline *); 470 int sr_raid0_rw(struct sr_workunit *); 471 void sr_raid0_intr(struct buf *); 472 void sr_raid0_set_chunk_state(struct sr_discipline *, 473 int, int); 474 void sr_raid0_set_vol_state(struct sr_discipline *); 475 476 /* raid 1 */ 477 int sr_raid1_alloc_resources(struct sr_discipline *); 478 int sr_raid1_free_resources(struct sr_discipline *); 479 int sr_raid1_rw(struct sr_workunit *); 480 void sr_raid1_intr(struct buf *); 481 void sr_raid1_recreate_wu(struct sr_workunit *); 482 void sr_raid1_set_chunk_state(struct sr_discipline *, 483 int, int); 484 void sr_raid1_set_vol_state(struct sr_discipline *); 485 486 /* crypto discipline */ 487 int sr_crypto_alloc_resources(struct sr_discipline *); 488 int sr_crypto_free_resources(struct sr_discipline *); 489 int sr_crypto_rw(struct sr_workunit *); 490 int sr_crypto_get_kdf(struct bioc_createraid *, 491 struct sr_discipline *); 492 int sr_crypto_create_keys(struct sr_discipline *); 493 494 #ifdef SR_DEBUG 495 void sr_dump_mem(u_int8_t *, int); 496 #endif 497 498 #endif /* _KERNEL */ 499 500 #endif /* SOFTRAIDVAR_H */ 501