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