Changeset View
Changeset View
Standalone View
Standalone View
head/sys/geom/raid/md_ddf.c
Show First 20 Lines • Show All 751 Lines • ▼ Show 20 Lines | if (GET32(meta, hdr->bbmlog_length) != 0) { | ||||
SET32(meta, bbm->Entry_Count, 0); | SET32(meta, bbm->Entry_Count, 0); | ||||
SET32(meta, bbm->Spare_Block_Count, 0); | SET32(meta, bbm->Spare_Block_Count, 0); | ||||
} | } | ||||
} | } | ||||
static void | static void | ||||
ddf_meta_copy(struct ddf_meta *dst, struct ddf_meta *src) | ddf_meta_copy(struct ddf_meta *dst, struct ddf_meta *src) | ||||
{ | { | ||||
struct ddf_header *hdr; | |||||
u_int ss; | u_int ss; | ||||
hdr = src->hdr; | |||||
dst->bigendian = src->bigendian; | dst->bigendian = src->bigendian; | ||||
ss = dst->sectorsize = src->sectorsize; | ss = dst->sectorsize = src->sectorsize; | ||||
dst->hdr = malloc(ss, M_MD_DDF, M_WAITOK); | dst->hdr = malloc(ss, M_MD_DDF, M_WAITOK); | ||||
memcpy(dst->hdr, src->hdr, ss); | memcpy(dst->hdr, src->hdr, ss); | ||||
dst->cdr = malloc(GET32(src, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); | dst->cdr = malloc(GET32(src, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); | ||||
memcpy(dst->cdr, src->cdr, GET32(src, hdr->cd_length) * ss); | memcpy(dst->cdr, src->cdr, GET32(src, hdr->cd_length) * ss); | ||||
dst->pdr = malloc(GET32(src, hdr->pdr_length) * ss, M_MD_DDF, M_WAITOK); | dst->pdr = malloc(GET32(src, hdr->pdr_length) * ss, M_MD_DDF, M_WAITOK); | ||||
memcpy(dst->pdr, src->pdr, GET32(src, hdr->pdr_length) * ss); | memcpy(dst->pdr, src->pdr, GET32(src, hdr->pdr_length) * ss); | ||||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | ddf_meta_free(struct ddf_meta *meta) | ||||
} | } | ||||
} | } | ||||
static void | static void | ||||
ddf_vol_meta_create(struct ddf_vol_meta *meta, struct ddf_meta *sample) | ddf_vol_meta_create(struct ddf_vol_meta *meta, struct ddf_meta *sample) | ||||
{ | { | ||||
struct timespec ts; | struct timespec ts; | ||||
struct clocktime ct; | struct clocktime ct; | ||||
struct ddf_header *hdr; | |||||
u_int ss, size; | u_int ss, size; | ||||
hdr = sample->hdr; | |||||
meta->bigendian = sample->bigendian; | meta->bigendian = sample->bigendian; | ||||
ss = meta->sectorsize = sample->sectorsize; | ss = meta->sectorsize = sample->sectorsize; | ||||
meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); | meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); | ||||
memcpy(meta->hdr, sample->hdr, ss); | memcpy(meta->hdr, sample->hdr, ss); | ||||
meta->cdr = malloc(GET32(sample, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); | meta->cdr = malloc(GET32(sample, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); | ||||
memcpy(meta->cdr, sample->cdr, GET32(sample, hdr->cd_length) * ss); | memcpy(meta->cdr, sample->cdr, GET32(sample, hdr->cd_length) * ss); | ||||
meta->vde = malloc(sizeof(struct ddf_vd_entry), M_MD_DDF, M_WAITOK); | meta->vde = malloc(sizeof(struct ddf_vd_entry), M_MD_DDF, M_WAITOK); | ||||
memset(meta->vde, 0xff, sizeof(struct ddf_vd_entry)); | memset(meta->vde, 0xff, sizeof(struct ddf_vd_entry)); | ||||
Show All 9 Lines | ddf_vol_meta_create(struct ddf_vol_meta *meta, struct ddf_meta *sample) | ||||
memcpy(meta->vdc->VD_GUID, meta->vde->VD_GUID, 24); | memcpy(meta->vdc->VD_GUID, meta->vde->VD_GUID, 24); | ||||
SET32(meta, vdc->Sequence_Number, 0); | SET32(meta, vdc->Sequence_Number, 0); | ||||
} | } | ||||
static void | static void | ||||
ddf_vol_meta_update(struct ddf_vol_meta *dst, struct ddf_meta *src, | ddf_vol_meta_update(struct ddf_vol_meta *dst, struct ddf_meta *src, | ||||
uint8_t *GUID, int started) | uint8_t *GUID, int started) | ||||
{ | { | ||||
struct ddf_header *hdr; | |||||
struct ddf_vd_entry *vde; | struct ddf_vd_entry *vde; | ||||
struct ddf_vdc_record *vdc; | struct ddf_vdc_record *vdc; | ||||
int vnew, bvnew, bvd, size; | int vnew, bvnew, bvd, size; | ||||
u_int ss; | u_int ss; | ||||
hdr = src->hdr; | |||||
vde = &src->vdr->entry[ddf_meta_find_vd(src, GUID)]; | vde = &src->vdr->entry[ddf_meta_find_vd(src, GUID)]; | ||||
vdc = ddf_meta_find_vdc(src, GUID); | vdc = ddf_meta_find_vdc(src, GUID); | ||||
if (GET8D(src, vdc->Secondary_Element_Count) == 1) | if (GET8D(src, vdc->Secondary_Element_Count) == 1) | ||||
bvd = 0; | bvd = 0; | ||||
else | else | ||||
bvd = GET8D(src, vdc->Secondary_Element_Seq); | bvd = GET8D(src, vdc->Secondary_Element_Seq); | ||||
size = GET16(src, hdr->Configuration_Record_Length) * src->sectorsize; | size = GET16(src, hdr->Configuration_Record_Length) * src->sectorsize; | ||||
▲ Show 20 Lines • Show All 530 Lines • ▼ Show 20 Lines | g_raid_md_ddf_get_disk(struct g_raid_softc *sc, uint8_t *GUID, uint32_t id) | ||||
} | } | ||||
return (disk); | return (disk); | ||||
} | } | ||||
static int | static int | ||||
g_raid_md_ddf_purge_volumes(struct g_raid_softc *sc) | g_raid_md_ddf_purge_volumes(struct g_raid_softc *sc) | ||||
{ | { | ||||
struct g_raid_volume *vol, *tvol; | struct g_raid_volume *vol, *tvol; | ||||
struct g_raid_md_ddf_pervolume *pv; | |||||
int i, res; | int i, res; | ||||
res = 0; | res = 0; | ||||
TAILQ_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tvol) { | TAILQ_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tvol) { | ||||
pv = vol->v_md_data; | |||||
if (vol->v_stopping) | if (vol->v_stopping) | ||||
continue; | continue; | ||||
for (i = 0; i < vol->v_disks_count; i++) { | for (i = 0; i < vol->v_disks_count; i++) { | ||||
if (vol->v_subdisks[i].sd_state != G_RAID_SUBDISK_S_NONE) | if (vol->v_subdisks[i].sd_state != G_RAID_SUBDISK_S_NONE) | ||||
break; | break; | ||||
} | } | ||||
if (i >= vol->v_disks_count) { | if (i >= vol->v_disks_count) { | ||||
g_raid_destroy_volume(vol); | g_raid_destroy_volume(vol); | ||||
▲ Show 20 Lines • Show All 417 Lines • ▼ Show 20 Lines | g_raid_md_ddf_start(struct g_raid_volume *vol) | ||||
struct g_raid_softc *sc; | struct g_raid_softc *sc; | ||||
struct g_raid_subdisk *sd; | struct g_raid_subdisk *sd; | ||||
struct g_raid_disk *disk; | struct g_raid_disk *disk; | ||||
struct g_raid_md_object *md; | struct g_raid_md_object *md; | ||||
struct g_raid_md_ddf_perdisk *pd; | struct g_raid_md_ddf_perdisk *pd; | ||||
struct g_raid_md_ddf_pervolume *pv; | struct g_raid_md_ddf_pervolume *pv; | ||||
struct g_raid_md_ddf_object *mdi; | struct g_raid_md_ddf_object *mdi; | ||||
struct ddf_vol_meta *vmeta; | struct ddf_vol_meta *vmeta; | ||||
struct ddf_vdc_record *vdc; | |||||
uint64_t *val2; | uint64_t *val2; | ||||
int i, j, bvd; | int i, j, bvd; | ||||
sc = vol->v_softc; | sc = vol->v_softc; | ||||
md = sc->sc_md; | md = sc->sc_md; | ||||
mdi = (struct g_raid_md_ddf_object *)md; | mdi = (struct g_raid_md_ddf_object *)md; | ||||
pv = vol->v_md_data; | pv = vol->v_md_data; | ||||
vmeta = &pv->pv_meta; | vmeta = &pv->pv_meta; | ||||
vdc = vmeta->vdc; | |||||
vol->v_raid_level = GET8(vmeta, vdc->Primary_RAID_Level); | vol->v_raid_level = GET8(vmeta, vdc->Primary_RAID_Level); | ||||
vol->v_raid_level_qualifier = GET8(vmeta, vdc->RLQ); | vol->v_raid_level_qualifier = GET8(vmeta, vdc->RLQ); | ||||
if (GET8(vmeta, vdc->Secondary_Element_Count) > 1 && | if (GET8(vmeta, vdc->Secondary_Element_Count) > 1 && | ||||
vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 && | vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 && | ||||
GET8(vmeta, vdc->Secondary_RAID_Level) == 0) | GET8(vmeta, vdc->Secondary_RAID_Level) == 0) | ||||
vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; | vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; | ||||
vol->v_sectorsize = GET16(vmeta, vdc->Block_Size); | vol->v_sectorsize = GET16(vmeta, vdc->Block_Size); | ||||
▲ Show 20 Lines • Show All 1,211 Lines • Show Last 20 Lines |