summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/softraid.c59
-rw-r--r--sys/dev/softraidvar.h66
2 files changed, 74 insertions, 51 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index 2f31fec9b16..e50b1c3c2fa 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.263 2011/12/31 17:06:10 jsing Exp $ */
+/* $OpenBSD: softraid.c,v 1.264 2012/01/11 14:10:50 jsing Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -1106,10 +1106,13 @@ sr_meta_native_bootprobe(struct sr_softc *sc, dev_t devno,
DEVNAME(sc), devname);
} else {
/* XXX fix M_WAITOK, this is boot time */
- bc = malloc(sizeof(*bc), M_DEVBUF,
- M_WAITOK | M_ZERO);
- bcopy(md, &bc->sbc_metadata,
- sizeof(bc->sbc_metadata));
+ bc = malloc(sizeof(struct sr_boot_chunk),
+ M_DEVBUF, M_WAITOK | M_ZERO);
+ bc->sbc_metadata =
+ malloc(sizeof(struct sr_metadata),
+ M_DEVBUF, M_WAITOK | M_ZERO);
+ bcopy(md, bc->sbc_metadata,
+ sizeof(struct sr_metadata));
bc->sbc_mm = rawdev;
SLIST_INSERT_HEAD(bch, bc, sbc_link);
rv = SR_META_CLAIMED;
@@ -1200,18 +1203,18 @@ sr_boot_assembly(struct sr_softc *sc)
bcnext = SLIST_NEXT(bc, sbc_link);
SLIST_REMOVE(&bch, bc, sr_boot_chunk, sbc_link);
- bc->sbc_chunk_id = bc->sbc_metadata.ssdi.ssd_chunk_id;
+ bc->sbc_chunk_id = bc->sbc_metadata->ssdi.ssd_chunk_id;
/* Handle key disks separately. */
- if (bc->sbc_metadata.ssdi.ssd_level == SR_KEYDISK_LEVEL) {
+ if (bc->sbc_metadata->ssdi.ssd_level == SR_KEYDISK_LEVEL) {
SLIST_INSERT_HEAD(&kdh, bc, sbc_link);
continue;
}
SLIST_FOREACH(bv, &bvh, sbv_link) {
- if (bcmp(&bc->sbc_metadata.ssdi.ssd_uuid,
+ if (bcmp(&bc->sbc_metadata->ssdi.ssd_uuid,
&bv->sbv_uuid,
- sizeof(bc->sbc_metadata.ssdi.ssd_uuid)) == 0)
+ sizeof(bc->sbc_metadata->ssdi.ssd_uuid)) == 0)
break;
}
@@ -1224,11 +1227,11 @@ sr_boot_assembly(struct sr_softc *sc)
goto unwind;
}
- bv->sbv_level = bc->sbc_metadata.ssdi.ssd_level;
- bv->sbv_volid = bc->sbc_metadata.ssdi.ssd_volid;
- bv->sbv_chunk_no = bc->sbc_metadata.ssdi.ssd_chunk_no;
- bcopy(&bc->sbc_metadata.ssdi.ssd_uuid, &bv->sbv_uuid,
- sizeof(bc->sbc_metadata.ssdi.ssd_uuid));
+ bv->sbv_level = bc->sbc_metadata->ssdi.ssd_level;
+ bv->sbv_volid = bc->sbc_metadata->ssdi.ssd_volid;
+ bv->sbv_chunk_no = bc->sbc_metadata->ssdi.ssd_chunk_no;
+ bcopy(&bc->sbc_metadata->ssdi.ssd_uuid, &bv->sbv_uuid,
+ sizeof(bc->sbc_metadata->ssdi.ssd_uuid));
SLIST_INIT(&bv->sbv_chunks);
/* Maintain volume order. */
@@ -1269,7 +1272,7 @@ sr_boot_assembly(struct sr_softc *sc)
SLIST_INSERT_AFTER(bc2, bc, sbc_link);
}
- bv->sbv_dev_no++;
+ bv->sbv_chunks_found++;
}
/* Allocate memory for device and ondisk version arrays. */
@@ -1319,16 +1322,16 @@ sr_boot_assembly(struct sr_softc *sc)
hotspare->src_dev_mm = bc->sbc_mm;
strlcpy(hotspare->src_devname, devname,
sizeof(hotspare->src_devname));
- hotspare->src_size = bc->sbc_metadata.ssdi.ssd_size;
+ hotspare->src_size = bc->sbc_metadata->ssdi.ssd_size;
hm = &hotspare->src_meta;
hm->scmi.scm_volid = SR_HOTSPARE_VOLID;
hm->scmi.scm_chunk_id = 0;
- hm->scmi.scm_size = bc->sbc_metadata.ssdi.ssd_size;
- hm->scmi.scm_coerced_size = bc->sbc_metadata.ssdi.ssd_size;
+ hm->scmi.scm_size = bc->sbc_metadata->ssdi.ssd_size;
+ hm->scmi.scm_coerced_size = bc->sbc_metadata->ssdi.ssd_size;
strlcpy(hm->scmi.scm_devname, devname,
sizeof(hm->scmi.scm_devname));
- bcopy(&bc->sbc_metadata.ssdi.ssd_uuid, &hm->scmi.scm_uuid,
+ bcopy(&bc->sbc_metadata->ssdi.ssd_uuid, &hm->scmi.scm_uuid,
sizeof(struct sr_uuid));
sr_checksum(sc, hm, &hm->scm_checksum,
@@ -1378,9 +1381,9 @@ sr_boot_assembly(struct sr_softc *sc)
bcr.bc_key_disk = NODEV;
if (bv->sbv_level == 'C') {
SLIST_FOREACH(bc, &kdh, sbc_link) {
- if (bcmp(&bc->sbc_metadata.ssdi.ssd_uuid,
+ if (bcmp(&bc->sbc_metadata->ssdi.ssd_uuid,
&bv->sbv_uuid,
- sizeof(bc->sbc_metadata.ssdi.ssd_uuid))
+ sizeof(bc->sbc_metadata->ssdi.ssd_uuid))
== 0)
bcr.bc_key_disk = bc->sbc_mm;
}
@@ -1393,7 +1396,7 @@ sr_boot_assembly(struct sr_softc *sc)
SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link) {
if (devs[bc->sbc_chunk_id] != NODEV) {
- bv->sbv_dev_no--;
+ bv->sbv_chunks_found--;
sr_meta_getdevname(sc, bc->sbc_mm, devname,
sizeof(devname));
printf("%s: found duplicate chunk %u for "
@@ -1402,11 +1405,11 @@ sr_boot_assembly(struct sr_softc *sc)
}
if (devs[bc->sbc_chunk_id] == NODEV ||
- bc->sbc_metadata.ssd_ondisk >
+ bc->sbc_metadata->ssd_ondisk >
ondisk[bc->sbc_chunk_id]) {
devs[bc->sbc_chunk_id] = bc->sbc_mm;
ondisk[bc->sbc_chunk_id] =
- bc->sbc_metadata.ssd_ondisk;
+ bc->sbc_metadata->ssd_ondisk;
DNPRINTF(SR_D_META, "%s: using ondisk "
"metadata version %llu for chunk %u\n",
DEVNAME(sc), ondisk[bc->sbc_chunk_id],
@@ -1414,7 +1417,7 @@ sr_boot_assembly(struct sr_softc *sc)
}
}
- if (bv->sbv_chunk_no != bv->sbv_dev_no) {
+ if (bv->sbv_chunk_no != bv->sbv_chunks_found) {
printf("%s: not all chunks were provided; "
"attempting to bring volume %d online\n",
DEVNAME(sc), bv->sbv_volid);
@@ -1440,6 +1443,8 @@ unwind:
for (bc1 = SLIST_FIRST(&bv1->sbv_chunks);
bc1 != SLIST_END(&bv1->sbv_chunks); bc1 = bc2) {
bc2 = SLIST_NEXT(bc1, sbc_link);
+ if (bc1->sbc_metadata)
+ free(bc1->sbc_metadata, M_DEVBUF);
free(bc1, M_DEVBUF);
}
free(bv1, M_DEVBUF);
@@ -1447,11 +1452,15 @@ unwind:
/* Free keydisks chunks. */
for (bc1 = SLIST_FIRST(&kdh); bc1 != SLIST_END(&kdh); bc1 = bc2) {
bc2 = SLIST_NEXT(bc1, sbc_link);
+ if (bc1->sbc_metadata)
+ free(bc1->sbc_metadata, M_DEVBUF);
free(bc1, M_DEVBUF);
}
/* Free unallocated chunks. */
for (bc1 = SLIST_FIRST(&bch); bc1 != SLIST_END(&bch); bc1 = bc2) {
bc2 = SLIST_NEXT(bc1, sbc_link);
+ if (bc1->sbc_metadata)
+ free(bc1->sbc_metadata, M_DEVBUF);
free(bc1, M_DEVBUF);
}
diff --git a/sys/dev/softraidvar.h b/sys/dev/softraidvar.h
index ba8734d261a..b615ce2afb3 100644
--- a/sys/dev/softraidvar.h
+++ b/sys/dev/softraidvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraidvar.h,v 1.113 2011/12/31 17:06:10 jsing Exp $ */
+/* $OpenBSD: softraidvar.h,v 1.114 2012/01/11 14:10:51 jsing Exp $ */
/*
* Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -252,6 +252,45 @@ struct sr_aoe_config {
unsigned char slot;
};
+struct sr_boot_chunk {
+ struct sr_metadata *sbc_metadata;
+ dev_t sbc_mm;
+
+ u_int32_t sbc_chunk_id; /* Chunk ID. */
+ u_int32_t sbc_state; /* Chunk state. */
+ u_int32_t sbc_disk; /* Disk number. */
+ int sbc_part; /* Partition number. */
+ u_int64_t sbc_ondisk; /* Ondisk version. */
+
+ void *sbc_diskinfo; /* MD disk information. */
+
+ SLIST_ENTRY(sr_boot_chunk) sbc_link;
+};
+
+SLIST_HEAD(sr_boot_chunk_head, sr_boot_chunk);
+
+struct sr_boot_volume {
+ struct sr_uuid sbv_uuid; /* Volume UUID. */
+ u_int32_t sbv_level; /* RAID Level. */
+ u_int32_t sbv_volid; /* Volume ID. */
+ u_int32_t sbv_chunk_no; /* Number of chunks. */
+ u_int32_t sbv_flags; /* Volume specific flags. */
+ u_int32_t sbv_state; /* Volume state. */
+ int64_t sbv_size; /* Virtual disk size. */
+ u_int32_t sbv_data_offset; /* Data offset. */
+ u_int64_t sbv_ondisk; /* Ondisk version. */
+
+ u_int32_t sbv_chunks_found; /* Number of chunks found. */
+ u_int32_t sbv_unit; /* Disk unit number. */
+ char sbv_part; /* Partition opened. */
+ void *sbv_diskinfo; /* MD disk information. */
+
+ struct sr_boot_chunk_head sbv_chunks; /* List of chunks. */
+
+ SLIST_ENTRY(sr_boot_volume) sbv_link;
+};
+
+SLIST_HEAD(sr_boot_volume_head, sr_boot_volume);
#ifdef _KERNEL
#include <dev/biovar.h>
@@ -422,31 +461,6 @@ struct sr_aoe {
struct sr_concat {
};
-struct sr_boot_chunk {
- struct sr_metadata sbc_metadata;
- dev_t sbc_mm;
- u_int32_t sbc_chunk_id;
- int sbc_used;
-
- SLIST_ENTRY(sr_boot_chunk) sbc_link;
-};
-
-SLIST_HEAD(sr_boot_chunk_head, sr_boot_chunk);
-
-struct sr_boot_volume {
- struct sr_uuid sbv_uuid; /* Volume UUID. */
- u_int32_t sbv_level; /* Level. */
- u_int32_t sbv_volid; /* Volume ID. */
- u_int32_t sbv_chunk_no; /* Number of chunks. */
- u_int32_t sbv_dev_no; /* Number of devs discovered. */
-
- struct sr_boot_chunk_head sbv_chunks; /* List of chunks. */
-
- SLIST_ENTRY(sr_boot_volume) sbv_link;
-};
-
-SLIST_HEAD(sr_boot_volume_head, sr_boot_volume);
-
struct sr_chunk {
struct sr_meta_chunk src_meta; /* chunk meta data */