diff options
-rw-r--r-- | sys/dev/softraid.c | 59 | ||||
-rw-r--r-- | sys/dev/softraidvar.h | 66 |
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 */ |