diff options
author | 2011-09-18 19:40:49 +0000 | |
---|---|---|
committer | 2011-09-18 19:40:49 +0000 | |
commit | ee4e3de1f33cb4e00584fe4483e204f62c95357a (patch) | |
tree | fb5a8e7ab0b2dafc93e795aa1b21794579bb6979 /sys/dev/softraidvar.h | |
parent | Fix exchanged arguments in a "can't happen" printf (diff) | |
download | wireguard-openbsd-ee4e3de1f33cb4e00584fe4483e204f62c95357a.tar.xz wireguard-openbsd-ee4e3de1f33cb4e00584fe4483e204f62c95357a.zip |
Add support for variable length optional metadata in softraid(4). This
will allow new optional metadata types to be added without needing to
change the softraid metadata version.
Note that this commit changes the softraid metadata version, however
an upgrade from older metadata is handled automatically. A full backup
prior to upgrading is still strongly recommended.
With feedback from stsp@ and marco.
Diffstat (limited to 'sys/dev/softraidvar.h')
-rw-r--r-- | sys/dev/softraidvar.h | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/sys/dev/softraidvar.h b/sys/dev/softraidvar.h index 0b27906da56..a53f55adada 100644 --- a/sys/dev/softraidvar.h +++ b/sys/dev/softraidvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: softraidvar.h,v 1.107 2011/09/18 13:11:08 jsing Exp $ */ +/* $OpenBSD: softraidvar.h,v 1.108 2011/09/18 19:40:49 jsing Exp $ */ /* * Copyright (c) 2006 Marco Peereboom <marco@peereboom.us> * Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org> @@ -28,7 +28,7 @@ #include <crypto/md5.h> -#define SR_META_VERSION 4 /* bump when sr_metadata changes */ +#define SR_META_VERSION 5 /* bump when sr_metadata changes */ #define SR_META_SIZE 64 /* save space at chunk beginning */ #define SR_META_OFFSET 16 /* skip 8192 bytes at chunk beginning */ @@ -134,7 +134,19 @@ struct sr_crypto_chk_hmac_sha1 { u_int8_t sch_mac[20]; } __packed; +#define SR_OPT_INVALID 0x00 +#define SR_OPT_CRYPTO 0x01 +#define SR_OPT_BOOT 0x02 +#define SR_OPT_KEYDISK 0x03 + +struct sr_meta_opt_hdr { + u_int32_t som_type; /* optional metadata type. */ + u_int32_t som_length; /* optional metadata length. */ + u_int8_t som_checksum[MD5_DIGEST_LENGTH]; +} __packed; + struct sr_meta_crypto { + struct sr_meta_opt_hdr scm_hdr; u_int32_t scm_alg; /* vol crypto algorithm */ #define SR_CRYPTOA_AES_XTS_128 1 #define SR_CRYPTOA_AES_XTS_256 2 @@ -163,38 +175,23 @@ struct sr_meta_crypto { } __packed; struct sr_meta_boot { + struct sr_meta_opt_hdr sbm_hdr; u_int64_t sbm_root_uid; u_int32_t sbm_bootblk_size; u_int32_t sbm_bootldr_size; } __packed; struct sr_meta_keydisk { + struct sr_meta_opt_hdr skm_hdr; u_int8_t skm_maskkey[SR_CRYPTO_MAXKEYBYTES]; } __packed; -struct sr_meta_opt { - struct sr_meta_opt_invariant { - u_int32_t som_type; /* optional type */ -#define SR_OPT_INVALID 0x00 -#define SR_OPT_CRYPTO 0x01 -#define SR_OPT_BOOT 0x02 -#define SR_OPT_KEYDISK 0x03 - u_int32_t som_pad; - union { - struct sr_meta_crypto smm_crypto; - struct sr_meta_boot smm_boot; - struct sr_meta_keydisk smm_keydisk; - } som_meta; - } _som_invariant; -#define somi _som_invariant -#define somi_crypto _som_invariant.smm_crypto -#define somi_boot _som_invariant.smm_boot - /* MD5 of invariant optional metadata */ - u_int8_t som_checksum[MD5_DIGEST_LENGTH]; -} __packed; +#define SR_OLD_META_OPT_SIZE 2480 +#define SR_OLD_META_OPT_OFFSET 8 +#define SR_OLD_META_OPT_MD5 (SR_OLD_META_OPT_SIZE - MD5_DIGEST_LENGTH) struct sr_meta_opt_item { - struct sr_meta_opt omi_om; + struct sr_meta_opt_hdr *omi_som; SLIST_ENTRY(sr_meta_opt_item) omi_link; }; @@ -560,7 +557,7 @@ struct sr_discipline { void (*sd_set_vol_state)(struct sr_discipline *); int (*sd_openings)(struct sr_discipline *); int (*sd_meta_opt_handler)(struct sr_discipline *, - struct sr_meta_opt *); + struct sr_meta_opt_hdr *); /* SCSI emulation */ struct scsi_sense_data sd_scsi_sense; |