summaryrefslogtreecommitdiffstats
path: root/sys/geom/mirror/g_mirror.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/geom/mirror/g_mirror.h')
-rw-r--r--sys/geom/mirror/g_mirror.h47
1 files changed, 44 insertions, 3 deletions
diff --git a/sys/geom/mirror/g_mirror.h b/sys/geom/mirror/g_mirror.h
index 64a8f98..03827ea 100644
--- a/sys/geom/mirror/g_mirror.h
+++ b/sys/geom/mirror/g_mirror.h
@@ -40,8 +40,9 @@
* 0 - Initial version number.
* 1 - Added 'prefer' balance algorithm.
* 2 - Added md_genid field to metadata.
+ * 3 - Added md_provsize field to metadata.
*/
-#define G_MIRROR_VERSION 2
+#define G_MIRROR_VERSION 3
#define G_MIRROR_BALANCE_NONE 0
#define G_MIRROR_BALANCE_ROUND_ROBIN 1
@@ -226,6 +227,7 @@ struct g_mirror_metadata {
uint64_t md_mflags; /* Additional mirror flags. */
uint64_t md_dflags; /* Additional disk flags. */
char md_provider[16]; /* Hardcoded provider. */
+ uint64_t md_provsize; /* Provider's size. */
u_char md_hash[16]; /* MD5 hash. */
};
static __inline void
@@ -250,10 +252,11 @@ mirror_metadata_encode(struct g_mirror_metadata *md, u_char *data)
le64enc(data + 79, md->md_mflags);
le64enc(data + 87, md->md_dflags);
bcopy(md->md_provider, data + 95, 16);
+ le64enc(data + 111, md->md_provsize);
MD5Init(&ctx);
- MD5Update(&ctx, data, 111);
+ MD5Update(&ctx, data, 119);
MD5Final(md->md_hash, &ctx);
- bcopy(md->md_hash, data + 111, 16);
+ bcopy(md->md_hash, data + 119, 16);
}
static __inline int
mirror_metadata_decode_v0v1(const u_char *data, struct g_mirror_metadata *md)
@@ -283,6 +286,7 @@ mirror_metadata_decode_v0v1(const u_char *data, struct g_mirror_metadata *md)
/* New fields. */
md->md_genid = 0;
+ md->md_provsize = 0;
return (0);
}
@@ -312,6 +316,39 @@ mirror_metadata_decode_v2(const u_char *data, struct g_mirror_metadata *md)
MD5Final(md->md_hash, &ctx);
if (bcmp(md->md_hash, data + 111, 16) != 0)
return (EINVAL);
+
+ /* New fields. */
+ md->md_provsize = 0;
+
+ return (0);
+}
+static __inline int
+mirror_metadata_decode_v3(const u_char *data, struct g_mirror_metadata *md)
+{
+ MD5_CTX ctx;
+
+ bcopy(data + 20, md->md_name, 16);
+ md->md_mid = le32dec(data + 36);
+ md->md_did = le32dec(data + 40);
+ md->md_all = *(data + 44);
+ md->md_genid = le32dec(data + 45);
+ md->md_syncid = le32dec(data + 49);
+ md->md_priority = *(data + 53);
+ md->md_slice = le32dec(data + 54);
+ md->md_balance = *(data + 58);
+ md->md_mediasize = le64dec(data + 59);
+ md->md_sectorsize = le32dec(data + 67);
+ md->md_sync_offset = le64dec(data + 71);
+ md->md_mflags = le64dec(data + 79);
+ md->md_dflags = le64dec(data + 87);
+ bcopy(data + 95, md->md_provider, 16);
+ md->md_provsize = le64dec(data + 111);
+ bcopy(data + 119, md->md_hash, 16);
+ MD5Init(&ctx);
+ MD5Update(&ctx, data, 119);
+ MD5Final(md->md_hash, &ctx);
+ if (bcmp(md->md_hash, data + 119, 16) != 0)
+ return (EINVAL);
return (0);
}
static __inline int
@@ -329,6 +366,9 @@ mirror_metadata_decode(const u_char *data, struct g_mirror_metadata *md)
case 2:
error = mirror_metadata_decode_v2(data, md);
break;
+ case 3:
+ error = mirror_metadata_decode_v3(data, md);
+ break;
default:
error = EINVAL;
break;
@@ -417,6 +457,7 @@ mirror_metadata_dump(const struct g_mirror_metadata *md)
}
printf("\n");
printf("hcprovider: %s\n", md->md_provider);
+ printf(" provsize: %ju\n", (uintmax_t)md->md_provsize);
bzero(hash, sizeof(hash));
for (i = 0; i < 16; i++) {
hash[i * 2] = hex[md->md_hash[i] >> 4];
OpenPOWER on IntegriCloud