Lines Matching +full:mdi +full:- +full:x
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
134 #define GET8(m, f) ((m)->f)
135 #define GET16(m, f) ((m)->bigendian ? be16dec(&(m)->f) : le16dec(&(m)->f))
136 #define GET32(m, f) ((m)->bigendian ? be32dec(&(m)->f) : le32dec(&(m)->f))
137 #define GET64(m, f) ((m)->bigendian ? be64dec(&(m)->f) : le64dec(&(m)->f))
139 #define GET16D(m, f) ((m)->bigendian ? be16dec(&f) : le16dec(&f))
140 #define GET32D(m, f) ((m)->bigendian ? be32dec(&f) : le32dec(&f))
141 #define GET64D(m, f) ((m)->bigendian ? be64dec(&f) : le64dec(&f))
143 #define GET16P(m, f) ((m)->bigendian ? be16dec(f) : le16dec(f))
144 #define GET32P(m, f) ((m)->bigendian ? be32dec(f) : le32dec(f))
145 #define GET64P(m, f) ((m)->bigendian ? be64dec(f) : le64dec(f))
151 if ((m)->bigendian) \
158 if ((m)->bigendian) \
165 if ((m)->bigendian) \
170 #define SET8(m, f, v) SET8P((m), &((m)->f), (v))
171 #define SET16(m, f, v) SET16P((m), &((m)->f), (v))
172 #define SET32(m, f, v) SET32P((m), &((m)->f), (v))
173 #define SET64(m, f, v) SET64P((m), &((m)->f), (v))
179 #define GETCRNUM(m) (GET32((m), hdr->cr_length) / \
180 GET16((m), hdr->Configuration_Record_Length))
182 #define GETVDCPTR(m, n) ((struct ddf_vdc_record *)((uint8_t *)(m)->cr + \
183 (n) * GET16((m), hdr->Configuration_Record_Length) * \
184 (m)->sectorsize))
186 #define GETSAPTR(m, n) ((struct ddf_sa_record *)((uint8_t *)(m)->cr + \
187 (n) * GET16((m), hdr->Configuration_Record_Length) * \
188 (m)->sectorsize))
217 printf("%02x", buf[i]); in print_guid()
237 print_guid(meta->hdr->DDF_Header_GUID); in g_raid_md_ddf_print()
239 printf("DDF_rev %8.8s\n", (char *)&meta->hdr->DDF_rev[0]); in g_raid_md_ddf_print()
240 printf("Sequence_Number 0x%08x\n", GET32(meta, hdr->Sequence_Number)); in g_raid_md_ddf_print()
241 printf("TimeStamp 0x%08x\n", GET32(meta, hdr->TimeStamp)); in g_raid_md_ddf_print()
242 printf("Open_Flag 0x%02x\n", GET16(meta, hdr->Open_Flag)); in g_raid_md_ddf_print()
243 printf("Foreign_Flag 0x%02x\n", GET16(meta, hdr->Foreign_Flag)); in g_raid_md_ddf_print()
244 printf("Diskgrouping 0x%02x\n", GET16(meta, hdr->Diskgrouping)); in g_raid_md_ddf_print()
245 printf("Primary_Header_LBA %ju\n", GET64(meta, hdr->Primary_Header_LBA)); in g_raid_md_ddf_print()
246 printf("Secondary_Header_LBA %ju\n", GET64(meta, hdr->Secondary_Header_LBA)); in g_raid_md_ddf_print()
247 printf("WorkSpace_Length %u\n", GET32(meta, hdr->WorkSpace_Length)); in g_raid_md_ddf_print()
248 printf("WorkSpace_LBA %ju\n", GET64(meta, hdr->WorkSpace_LBA)); in g_raid_md_ddf_print()
249 printf("Max_PD_Entries %u\n", GET16(meta, hdr->Max_PD_Entries)); in g_raid_md_ddf_print()
250 printf("Max_VD_Entries %u\n", GET16(meta, hdr->Max_VD_Entries)); in g_raid_md_ddf_print()
251 printf("Max_Partitions %u\n", GET16(meta, hdr->Max_Partitions)); in g_raid_md_ddf_print()
252 printf("Configuration_Record_Length %u\n", GET16(meta, hdr->Configuration_Record_Length)); in g_raid_md_ddf_print()
253 printf("Max_Primary_Element_Entries %u\n", GET16(meta, hdr->Max_Primary_Element_Entries)); in g_raid_md_ddf_print()
254 printf("Controller Data %u:%u\n", GET32(meta, hdr->cd_section), GET32(meta, hdr->cd_length)); in g_raid_md_ddf_print()
255 …printf("Physical Disk %u:%u\n", GET32(meta, hdr->pdr_section), GET32(meta, hdr->pdr_length)… in g_raid_md_ddf_print()
256 …printf("Virtual Disk %u:%u\n", GET32(meta, hdr->vdr_section), GET32(meta, hdr->vdr_length)… in g_raid_md_ddf_print()
257 printf("Configuration Recs %u:%u\n", GET32(meta, hdr->cr_section), GET32(meta, hdr->cr_length)); in g_raid_md_ddf_print()
258 …printf("Physical Disk Recs %u:%u\n", GET32(meta, hdr->pdd_section), GET32(meta, hdr->pdd_length)… in g_raid_md_ddf_print()
259 …printf("BBM Log %u:%u\n", GET32(meta, hdr->bbmlog_section), GET32(meta, hdr->bbmlog_l… in g_raid_md_ddf_print()
260 …printf("Diagnostic Space %u:%u\n", GET32(meta, hdr->Diagnostic_Space), GET32(meta, hdr->Diagno… in g_raid_md_ddf_print()
261 …printf("Vendor_Specific_Logs %u:%u\n", GET32(meta, hdr->Vendor_Specific_Logs), GET32(meta, hdr->Ve… in g_raid_md_ddf_print()
264 print_guid(meta->cdr->Controller_GUID); in g_raid_md_ddf_print()
266 printf("Controller_Type 0x%04x%04x 0x%04x%04x\n", in g_raid_md_ddf_print()
267 GET16(meta, cdr->Controller_Type.Vendor_ID), in g_raid_md_ddf_print()
268 GET16(meta, cdr->Controller_Type.Device_ID), in g_raid_md_ddf_print()
269 GET16(meta, cdr->Controller_Type.SubVendor_ID), in g_raid_md_ddf_print()
270 GET16(meta, cdr->Controller_Type.SubDevice_ID)); in g_raid_md_ddf_print()
271 printf("Product_ID '%.16s'\n", (char *)&meta->cdr->Product_ID[0]); in g_raid_md_ddf_print()
273 printf("Populated_PDEs %u\n", GET16(meta, pdr->Populated_PDEs)); in g_raid_md_ddf_print()
274 printf("Max_PDE_Supported %u\n", GET16(meta, pdr->Max_PDE_Supported)); in g_raid_md_ddf_print()
275 for (j = 0; j < GET16(meta, pdr->Populated_PDEs); j++) { in g_raid_md_ddf_print()
276 if (isff(meta->pdr->entry[j].PD_GUID, 24)) in g_raid_md_ddf_print()
278 if (GET32(meta, pdr->entry[j].PD_Reference) == 0xffffffff) in g_raid_md_ddf_print()
281 print_guid(meta->pdr->entry[j].PD_GUID); in g_raid_md_ddf_print()
283 printf("PD_Reference 0x%08x\n", in g_raid_md_ddf_print()
284 GET32(meta, pdr->entry[j].PD_Reference)); in g_raid_md_ddf_print()
285 printf("PD_Type 0x%04x\n", in g_raid_md_ddf_print()
286 GET16(meta, pdr->entry[j].PD_Type)); in g_raid_md_ddf_print()
287 printf("PD_State 0x%04x\n", in g_raid_md_ddf_print()
288 GET16(meta, pdr->entry[j].PD_State)); in g_raid_md_ddf_print()
290 GET64(meta, pdr->entry[j].Configured_Size)); in g_raid_md_ddf_print()
292 GET16(meta, pdr->entry[j].Block_Size)); in g_raid_md_ddf_print()
295 printf("Populated_VDEs %u\n", GET16(meta, vdr->Populated_VDEs)); in g_raid_md_ddf_print()
296 printf("Max_VDE_Supported %u\n", GET16(meta, vdr->Max_VDE_Supported)); in g_raid_md_ddf_print()
297 for (j = 0; j < GET16(meta, vdr->Populated_VDEs); j++) { in g_raid_md_ddf_print()
298 if (isff(meta->vdr->entry[j].VD_GUID, 24)) in g_raid_md_ddf_print()
301 print_guid(meta->vdr->entry[j].VD_GUID); in g_raid_md_ddf_print()
303 printf("VD_Number 0x%04x\n", in g_raid_md_ddf_print()
304 GET16(meta, vdr->entry[j].VD_Number)); in g_raid_md_ddf_print()
305 printf("VD_Type 0x%04x\n", in g_raid_md_ddf_print()
306 GET16(meta, vdr->entry[j].VD_Type)); in g_raid_md_ddf_print()
307 printf("VD_State 0x%02x\n", in g_raid_md_ddf_print()
308 GET8(meta, vdr->entry[j].VD_State)); in g_raid_md_ddf_print()
309 printf("Init_State 0x%02x\n", in g_raid_md_ddf_print()
310 GET8(meta, vdr->entry[j].Init_State)); in g_raid_md_ddf_print()
312 GET8(meta, vdr->entry[j].Drive_Failures_Remaining)); in g_raid_md_ddf_print()
314 (char *)&meta->vdr->entry[j].VD_Name); in g_raid_md_ddf_print()
320 val = GET32D(meta, vdc->Signature); in g_raid_md_ddf_print()
325 print_guid(vdc->VD_GUID); in g_raid_md_ddf_print()
327 printf("Timestamp 0x%08x\n", in g_raid_md_ddf_print()
328 GET32D(meta, vdc->Timestamp)); in g_raid_md_ddf_print()
329 printf("Sequence_Number 0x%08x\n", in g_raid_md_ddf_print()
330 GET32D(meta, vdc->Sequence_Number)); in g_raid_md_ddf_print()
332 GET16D(meta, vdc->Primary_Element_Count)); in g_raid_md_ddf_print()
334 GET8D(meta, vdc->Stripe_Size)); in g_raid_md_ddf_print()
335 printf("Primary_RAID_Level 0x%02x\n", in g_raid_md_ddf_print()
336 GET8D(meta, vdc->Primary_RAID_Level)); in g_raid_md_ddf_print()
337 printf("RLQ 0x%02x\n", in g_raid_md_ddf_print()
338 GET8D(meta, vdc->RLQ)); in g_raid_md_ddf_print()
340 GET8D(meta, vdc->Secondary_Element_Count)); in g_raid_md_ddf_print()
342 GET8D(meta, vdc->Secondary_Element_Seq)); in g_raid_md_ddf_print()
343 printf("Secondary_RAID_Level 0x%02x\n", in g_raid_md_ddf_print()
344 GET8D(meta, vdc->Secondary_RAID_Level)); in g_raid_md_ddf_print()
346 GET64D(meta, vdc->Block_Count)); in g_raid_md_ddf_print()
348 GET64D(meta, vdc->VD_Size)); in g_raid_md_ddf_print()
350 GET16D(meta, vdc->Block_Size)); in g_raid_md_ddf_print()
352 GET8D(meta, vdc->Rotate_Parity_count)); in g_raid_md_ddf_print()
355 if (GET32D(meta, vdc->Associated_Spares[i]) != 0xffffffff) in g_raid_md_ddf_print()
356 printf(" 0x%08x", GET32D(meta, vdc->Associated_Spares[i])); in g_raid_md_ddf_print()
360 GET64D(meta, vdc->Cache_Flags)); in g_raid_md_ddf_print()
362 GET8D(meta, vdc->BG_Rate)); in g_raid_md_ddf_print()
364 GET8D(meta, vdc->MDF_Parity_Disks)); in g_raid_md_ddf_print()
365 printf("MDF_Parity_Generator_Polynomial 0x%04x\n", in g_raid_md_ddf_print()
366 GET16D(meta, vdc->MDF_Parity_Generator_Polynomial)); in g_raid_md_ddf_print()
367 printf("MDF_Constant_Generation_Method 0x%02x\n", in g_raid_md_ddf_print()
368 GET8D(meta, vdc->MDF_Constant_Generation_Method)); in g_raid_md_ddf_print()
370 num2 = GET16D(meta, vdc->Primary_Element_Count); in g_raid_md_ddf_print()
371 val2 = (uint64_t *)&(vdc->Physical_Disk_Sequence[GET16(meta, hdr->Max_Primary_Element_Entries)]); in g_raid_md_ddf_print()
373 printf(" 0x%08x @ %ju", in g_raid_md_ddf_print()
374 GET32D(meta, vdc->Physical_Disk_Sequence[i]), in g_raid_md_ddf_print()
382 print_guid(vuc->VD_GUID); in g_raid_md_ddf_print()
388 printf("Timestamp 0x%08x\n", in g_raid_md_ddf_print()
389 GET32D(meta, sa->Timestamp)); in g_raid_md_ddf_print()
390 printf("Spare_Type 0x%02x\n", in g_raid_md_ddf_print()
391 GET8D(meta, sa->Spare_Type)); in g_raid_md_ddf_print()
393 GET16D(meta, sa->Populated_SAEs)); in g_raid_md_ddf_print()
395 GET16D(meta, sa->MAX_SAE_Supported)); in g_raid_md_ddf_print()
396 for (i = 0; i < GET16D(meta, sa->Populated_SAEs); i++) { in g_raid_md_ddf_print()
397 if (isff(sa->entry[i].VD_GUID, 24)) in g_raid_md_ddf_print()
401 printf("%02x", sa->entry[i].VD_GUID[k]); in g_raid_md_ddf_print()
404 GET16D(meta, sa->entry[i].Secondary_Element)); in g_raid_md_ddf_print()
411 printf("Unknown configuration signature %08x\n", val); in g_raid_md_ddf_print()
417 print_guid(meta->pdd->PD_GUID); in g_raid_md_ddf_print()
419 printf("PD_Reference 0x%08x\n", in g_raid_md_ddf_print()
420 GET32(meta, pdd->PD_Reference)); in g_raid_md_ddf_print()
421 printf("Forced_Ref_Flag 0x%02x\n", in g_raid_md_ddf_print()
422 GET8(meta, pdd->Forced_Ref_Flag)); in g_raid_md_ddf_print()
423 printf("Forced_PD_GUID_Flag 0x%02x\n", in g_raid_md_ddf_print()
424 GET8(meta, pdd->Forced_PD_GUID_Flag)); in g_raid_md_ddf_print()
432 for (i = 0; i < GET16(meta, pdr->Populated_PDEs); i++) { in ddf_meta_find_pd()
434 if (memcmp(meta->pdr->entry[i].PD_GUID, GUID, 24) == 0) in ddf_meta_find_pd()
437 if (GET32(meta, pdr->entry[i].PD_Reference) == PD_Reference) in ddf_meta_find_pd()
440 if (isff(meta->pdr->entry[i].PD_GUID, 24)) in ddf_meta_find_pd()
444 if (i >= GET16(meta, pdr->Max_PDE_Supported)) in ddf_meta_find_pd()
445 return (-1); in ddf_meta_find_pd()
446 SET16(meta, pdr->Populated_PDEs, i + 1); in ddf_meta_find_pd()
449 return (-1); in ddf_meta_find_pd()
457 for (i = 0; i < GET16(meta, vdr->Populated_VDEs); i++) { in ddf_meta_find_vd()
459 if (memcmp(meta->vdr->entry[i].VD_GUID, GUID, 24) == 0) in ddf_meta_find_vd()
462 if (isff(meta->vdr->entry[i].VD_GUID, 24)) in ddf_meta_find_vd()
466 if (i >= GET16(meta, vdr->Max_VDE_Supported)) in ddf_meta_find_vd()
467 return (-1); in ddf_meta_find_vd()
468 SET16(meta, vdr->Populated_VDEs, i + 1); in ddf_meta_find_vd()
471 return (-1); in ddf_meta_find_vd()
484 if (GET32D(meta, vdc->Signature) == DDF_VDCR_SIGNATURE && in ddf_meta_find_vdc()
485 memcmp(vdc->VD_GUID, GUID, 24) == 0) in ddf_meta_find_vdc()
488 if (GET32D(meta, vdc->Signature) == 0xffffffff || in ddf_meta_find_vdc()
489 GET32D(meta, vdc->Signature) == 0) in ddf_meta_find_vdc()
505 if (GET32D(meta, vdc->Signature) != DDF_VDCR_SIGNATURE) in ddf_meta_count_vdc()
507 if (GUID == NULL || memcmp(vdc->VD_GUID, GUID, 24) == 0) in ddf_meta_count_vdc()
520 for (bvd = 0; bvd < GET8(vmeta, vdc->Secondary_Element_Count); bvd++) { in ddf_meta_find_disk()
521 if (vmeta->bvdc[bvd] == NULL) { in ddf_meta_find_disk()
522 i += GET16(vmeta, vdc->Primary_Element_Count); // XXX in ddf_meta_find_disk()
525 for (pos = 0; pos < GET16(vmeta, bvdc[bvd]->Primary_Element_Count); in ddf_meta_find_disk()
527 if (GET32(vmeta, bvdc[bvd]->Physical_Disk_Sequence[pos]) == in ddf_meta_find_disk()
537 return (-1); in ddf_meta_find_disk()
549 if (GET32D(meta, sa->Signature) == DDF_SA_SIGNATURE) in ddf_meta_find_sa()
555 if (GET32D(meta, sa->Signature) == 0xffffffff || in ddf_meta_find_sa()
556 GET32D(meta, sa->Signature) == 0) in ddf_meta_find_sa()
569 struct g_raid_md_ddf_object *mdi; in ddf_meta_create() local
577 if (sample->hdr == NULL) in ddf_meta_create()
580 mdi = (struct g_raid_md_ddf_object *)disk->d_softc->sc_md; in ddf_meta_create()
581 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in ddf_meta_create()
582 meta = &pd->pd_meta; in ddf_meta_create()
583 ss = disk->d_consumer->provider->sectorsize; in ddf_meta_create()
584 anchorlba = disk->d_consumer->provider->mediasize / ss - 1; in ddf_meta_create()
586 meta->sectorsize = ss; in ddf_meta_create()
587 meta->bigendian = sample ? sample->bigendian : mdi->mdio_bigendian; in ddf_meta_create()
592 meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); in ddf_meta_create()
593 memset(meta->hdr, 0xff, ss); in ddf_meta_create()
595 memcpy(meta->hdr, sample->hdr, sizeof(struct ddf_header)); in ddf_meta_create()
596 if (ss != sample->sectorsize) { in ddf_meta_create()
597 SET32(meta, hdr->WorkSpace_Length, in ddf_meta_create()
598 howmany(GET32(sample, hdr->WorkSpace_Length) * in ddf_meta_create()
599 sample->sectorsize, ss)); in ddf_meta_create()
600 SET16(meta, hdr->Configuration_Record_Length, in ddf_meta_create()
602 hdr->Configuration_Record_Length) * in ddf_meta_create()
603 sample->sectorsize, ss)); in ddf_meta_create()
604 SET32(meta, hdr->cd_length, in ddf_meta_create()
605 howmany(GET32(sample, hdr->cd_length) * in ddf_meta_create()
606 sample->sectorsize, ss)); in ddf_meta_create()
607 SET32(meta, hdr->pdr_length, in ddf_meta_create()
608 howmany(GET32(sample, hdr->pdr_length) * in ddf_meta_create()
609 sample->sectorsize, ss)); in ddf_meta_create()
610 SET32(meta, hdr->vdr_length, in ddf_meta_create()
611 howmany(GET32(sample, hdr->vdr_length) * in ddf_meta_create()
612 sample->sectorsize, ss)); in ddf_meta_create()
613 SET32(meta, hdr->cr_length, in ddf_meta_create()
614 howmany(GET32(sample, hdr->cr_length) * in ddf_meta_create()
615 sample->sectorsize, ss)); in ddf_meta_create()
616 SET32(meta, hdr->pdd_length, in ddf_meta_create()
617 howmany(GET32(sample, hdr->pdd_length) * in ddf_meta_create()
618 sample->sectorsize, ss)); in ddf_meta_create()
619 SET32(meta, hdr->bbmlog_length, in ddf_meta_create()
620 howmany(GET32(sample, hdr->bbmlog_length) * in ddf_meta_create()
621 sample->sectorsize, ss)); in ddf_meta_create()
622 SET32(meta, hdr->Diagnostic_Space, in ddf_meta_create()
623 howmany(GET32(sample, hdr->bbmlog_length) * in ddf_meta_create()
624 sample->sectorsize, ss)); in ddf_meta_create()
625 SET32(meta, hdr->Vendor_Specific_Logs, in ddf_meta_create()
626 howmany(GET32(sample, hdr->bbmlog_length) * in ddf_meta_create()
627 sample->sectorsize, ss)); in ddf_meta_create()
630 SET32(meta, hdr->Signature, DDF_HEADER_SIGNATURE); in ddf_meta_create()
631 snprintf(meta->hdr->DDF_Header_GUID, 25, "FreeBSD %08x%08x", in ddf_meta_create()
632 (u_int)(ts.tv_sec - DECADE), arc4random()); in ddf_meta_create()
633 memcpy(meta->hdr->DDF_rev, "02.00.00", 8); in ddf_meta_create()
634 SET32(meta, hdr->TimeStamp, (ts.tv_sec - DECADE)); in ddf_meta_create()
635 SET32(meta, hdr->WorkSpace_Length, 16 * 1024 * 1024 / ss); in ddf_meta_create()
636 SET16(meta, hdr->Max_PD_Entries, DDF_MAX_DISKS - 1); in ddf_meta_create()
637 SET16(meta, hdr->Max_VD_Entries, DDF_MAX_VDISKS); in ddf_meta_create()
638 SET16(meta, hdr->Max_Partitions, DDF_MAX_PARTITIONS); in ddf_meta_create()
639 SET16(meta, hdr->Max_Primary_Element_Entries, DDF_MAX_DISKS); in ddf_meta_create()
640 SET16(meta, hdr->Configuration_Record_Length, in ddf_meta_create()
642 GET16(meta, hdr->Max_Primary_Element_Entries), ss)); in ddf_meta_create()
643 SET32(meta, hdr->cd_length, in ddf_meta_create()
645 SET32(meta, hdr->pdr_length, in ddf_meta_create()
648 hdr->Max_PD_Entries), ss)); in ddf_meta_create()
649 SET32(meta, hdr->vdr_length, in ddf_meta_create()
652 GET16(meta, hdr->Max_VD_Entries), ss)); in ddf_meta_create()
653 SET32(meta, hdr->cr_length, in ddf_meta_create()
654 GET16(meta, hdr->Configuration_Record_Length) * in ddf_meta_create()
655 (GET16(meta, hdr->Max_Partitions) + 1)); in ddf_meta_create()
656 SET32(meta, hdr->pdd_length, in ddf_meta_create()
658 SET32(meta, hdr->bbmlog_length, 0); in ddf_meta_create()
659 SET32(meta, hdr->Diagnostic_Space_Length, 0); in ddf_meta_create()
660 SET32(meta, hdr->Vendor_Specific_Logs_Length, 0); in ddf_meta_create()
663 SET32(meta, hdr->cd_section, pos); in ddf_meta_create()
664 pos += GET32(meta, hdr->cd_length); in ddf_meta_create()
665 SET32(meta, hdr->pdr_section, pos); in ddf_meta_create()
666 pos += GET32(meta, hdr->pdr_length); in ddf_meta_create()
667 SET32(meta, hdr->vdr_section, pos); in ddf_meta_create()
668 pos += GET32(meta, hdr->vdr_length); in ddf_meta_create()
669 SET32(meta, hdr->cr_section, pos); in ddf_meta_create()
670 pos += GET32(meta, hdr->cr_length); in ddf_meta_create()
671 SET32(meta, hdr->pdd_section, pos); in ddf_meta_create()
672 pos += GET32(meta, hdr->pdd_length); in ddf_meta_create()
673 SET32(meta, hdr->bbmlog_section, in ddf_meta_create()
674 GET32(meta, hdr->bbmlog_length) != 0 ? pos : 0xffffffff); in ddf_meta_create()
675 pos += GET32(meta, hdr->bbmlog_length); in ddf_meta_create()
676 SET32(meta, hdr->Diagnostic_Space, in ddf_meta_create()
677 GET32(meta, hdr->Diagnostic_Space_Length) != 0 ? pos : 0xffffffff); in ddf_meta_create()
678 pos += GET32(meta, hdr->Diagnostic_Space_Length); in ddf_meta_create()
679 SET32(meta, hdr->Vendor_Specific_Logs, in ddf_meta_create()
680 GET32(meta, hdr->Vendor_Specific_Logs_Length) != 0 ? pos : 0xffffffff); in ddf_meta_create()
681 pos += min(GET32(meta, hdr->Vendor_Specific_Logs_Length), 1); in ddf_meta_create()
682 SET64(meta, hdr->Primary_Header_LBA, in ddf_meta_create()
683 anchorlba - pos); in ddf_meta_create()
684 SET64(meta, hdr->Secondary_Header_LBA, in ddf_meta_create()
686 SET64(meta, hdr->WorkSpace_LBA, in ddf_meta_create()
687 anchorlba + 1 - 32 * 1024 * 1024 / ss); in ddf_meta_create()
690 size = GET32(meta, hdr->cd_length) * ss; in ddf_meta_create()
691 meta->cdr = malloc(size, M_MD_DDF, M_WAITOK); in ddf_meta_create()
692 memset(meta->cdr, 0xff, size); in ddf_meta_create()
693 SET32(meta, cdr->Signature, DDF_CONTROLLER_DATA_SIGNATURE); in ddf_meta_create()
694 memcpy(meta->cdr->Controller_GUID, "FreeBSD GEOM RAID SERIAL", 24); in ddf_meta_create()
695 memcpy(meta->cdr->Product_ID, "FreeBSD GEOMRAID", 16); in ddf_meta_create()
698 size = GET32(meta, hdr->pdr_length) * ss; in ddf_meta_create()
699 meta->pdr = malloc(size, M_MD_DDF, M_WAITOK); in ddf_meta_create()
700 memset(meta->pdr, 0xff, size); in ddf_meta_create()
701 SET32(meta, pdr->Signature, DDF_PDR_SIGNATURE); in ddf_meta_create()
702 SET16(meta, pdr->Populated_PDEs, 1); in ddf_meta_create()
703 SET16(meta, pdr->Max_PDE_Supported, in ddf_meta_create()
704 GET16(meta, hdr->Max_PD_Entries)); in ddf_meta_create()
706 pde = &meta->pdr->entry[0]; in ddf_meta_create()
708 error = g_io_getattr("GEOM::ident", disk->d_consumer, &len, serial_buffer); in ddf_meta_create()
710 snprintf(pde->PD_GUID, 25, "DISK%20s", serial_buffer); in ddf_meta_create()
712 snprintf(pde->PD_GUID, 25, "DISK%04d%02d%02d%08x%04x", in ddf_meta_create()
715 SET32D(meta, pde->PD_Reference, arc4random()); in ddf_meta_create()
716 SET16D(meta, pde->PD_Type, DDF_PDE_GUID_FORCE); in ddf_meta_create()
717 SET16D(meta, pde->PD_State, 0); in ddf_meta_create()
718 SET64D(meta, pde->Configured_Size, in ddf_meta_create()
719 anchorlba + 1 - 32 * 1024 * 1024 / ss); in ddf_meta_create()
720 SET16D(meta, pde->Block_Size, ss); in ddf_meta_create()
723 size = GET32(meta, hdr->vdr_length) * ss; in ddf_meta_create()
724 meta->vdr = malloc(size, M_MD_DDF, M_WAITOK); in ddf_meta_create()
725 memset(meta->vdr, 0xff, size); in ddf_meta_create()
726 SET32(meta, vdr->Signature, DDF_VD_RECORD_SIGNATURE); in ddf_meta_create()
727 SET32(meta, vdr->Populated_VDEs, 0); in ddf_meta_create()
728 SET16(meta, vdr->Max_VDE_Supported, in ddf_meta_create()
729 GET16(meta, hdr->Max_VD_Entries)); in ddf_meta_create()
732 size = GET32(meta, hdr->cr_length) * ss; in ddf_meta_create()
733 meta->cr = malloc(size, M_MD_DDF, M_WAITOK); in ddf_meta_create()
734 memset(meta->cr, 0xff, size); in ddf_meta_create()
737 size = GET32(meta, hdr->pdd_length) * ss; in ddf_meta_create()
738 meta->pdd = malloc(size, M_MD_DDF, M_WAITOK); in ddf_meta_create()
739 memset(meta->pdd, 0xff, size); in ddf_meta_create()
740 SET32(meta, pdd->Signature, DDF_PDD_SIGNATURE); in ddf_meta_create()
741 memcpy(meta->pdd->PD_GUID, pde->PD_GUID, 24); in ddf_meta_create()
742 SET32(meta, pdd->PD_Reference, GET32D(meta, pde->PD_Reference)); in ddf_meta_create()
743 SET8(meta, pdd->Forced_Ref_Flag, DDF_PDD_FORCED_REF); in ddf_meta_create()
744 SET8(meta, pdd->Forced_PD_GUID_Flag, DDF_PDD_FORCED_GUID); in ddf_meta_create()
747 if (GET32(meta, hdr->bbmlog_length) != 0) { in ddf_meta_create()
748 size = GET32(meta, hdr->bbmlog_length) * ss; in ddf_meta_create()
749 meta->bbm = malloc(size, M_MD_DDF, M_WAITOK); in ddf_meta_create()
750 memset(meta->bbm, 0xff, size); in ddf_meta_create()
751 SET32(meta, bbm->Signature, DDF_BBML_SIGNATURE); in ddf_meta_create()
752 SET32(meta, bbm->Entry_Count, 0); in ddf_meta_create()
753 SET32(meta, bbm->Spare_Block_Count, 0); in ddf_meta_create()
762 dst->bigendian = src->bigendian; in ddf_meta_copy()
763 ss = dst->sectorsize = src->sectorsize; in ddf_meta_copy()
764 dst->hdr = malloc(ss, M_MD_DDF, M_WAITOK); in ddf_meta_copy()
765 memcpy(dst->hdr, src->hdr, ss); in ddf_meta_copy()
766 dst->cdr = malloc(GET32(src, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_copy()
767 memcpy(dst->cdr, src->cdr, GET32(src, hdr->cd_length) * ss); in ddf_meta_copy()
768 dst->pdr = malloc(GET32(src, hdr->pdr_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_copy()
769 memcpy(dst->pdr, src->pdr, GET32(src, hdr->pdr_length) * ss); in ddf_meta_copy()
770 dst->vdr = malloc(GET32(src, hdr->vdr_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_copy()
771 memcpy(dst->vdr, src->vdr, GET32(src, hdr->vdr_length) * ss); in ddf_meta_copy()
772 dst->cr = malloc(GET32(src, hdr->cr_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_copy()
773 memcpy(dst->cr, src->cr, GET32(src, hdr->cr_length) * ss); in ddf_meta_copy()
774 dst->pdd = malloc(GET32(src, hdr->pdd_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_copy()
775 memcpy(dst->pdd, src->pdd, GET32(src, hdr->pdd_length) * ss); in ddf_meta_copy()
776 if (src->bbm != NULL) { in ddf_meta_copy()
777 dst->bbm = malloc(GET32(src, hdr->bbmlog_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_copy()
778 memcpy(dst->bbm, src->bbm, GET32(src, hdr->bbmlog_length) * ss); in ddf_meta_copy()
788 for (i = 0; i < GET16(src, pdr->Populated_PDEs); i++) { in ddf_meta_update()
789 spde = &src->pdr->entry[i]; in ddf_meta_update()
790 if (isff(spde->PD_GUID, 24)) in ddf_meta_update()
793 GET32(src, pdr->entry[i].PD_Reference)); in ddf_meta_update()
796 pde = &meta->pdr->entry[j]; in ddf_meta_update()
799 pde = &meta->pdr->entry[j]; in ddf_meta_update()
800 SET16D(meta, pde->PD_State, in ddf_meta_update()
801 GET16D(meta, pde->PD_State) | in ddf_meta_update()
802 GET16D(src, pde->PD_State)); in ddf_meta_update()
811 if (meta->hdr != NULL) { in ddf_meta_free()
812 free(meta->hdr, M_MD_DDF); in ddf_meta_free()
813 meta->hdr = NULL; in ddf_meta_free()
815 if (meta->cdr != NULL) { in ddf_meta_free()
816 free(meta->cdr, M_MD_DDF); in ddf_meta_free()
817 meta->cdr = NULL; in ddf_meta_free()
819 if (meta->pdr != NULL) { in ddf_meta_free()
820 free(meta->pdr, M_MD_DDF); in ddf_meta_free()
821 meta->pdr = NULL; in ddf_meta_free()
823 if (meta->vdr != NULL) { in ddf_meta_free()
824 free(meta->vdr, M_MD_DDF); in ddf_meta_free()
825 meta->vdr = NULL; in ddf_meta_free()
827 if (meta->cr != NULL) { in ddf_meta_free()
828 free(meta->cr, M_MD_DDF); in ddf_meta_free()
829 meta->cr = NULL; in ddf_meta_free()
831 if (meta->pdd != NULL) { in ddf_meta_free()
832 free(meta->pdd, M_MD_DDF); in ddf_meta_free()
833 meta->pdd = NULL; in ddf_meta_free()
835 if (meta->bbm != NULL) { in ddf_meta_free()
836 free(meta->bbm, M_MD_DDF); in ddf_meta_free()
837 meta->bbm = NULL; in ddf_meta_free()
848 meta->bigendian = sample->bigendian; in ddf_vol_meta_create()
849 ss = meta->sectorsize = sample->sectorsize; in ddf_vol_meta_create()
850 meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); in ddf_vol_meta_create()
851 memcpy(meta->hdr, sample->hdr, ss); in ddf_vol_meta_create()
852 meta->cdr = malloc(GET32(sample, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); in ddf_vol_meta_create()
853 memcpy(meta->cdr, sample->cdr, GET32(sample, hdr->cd_length) * ss); in ddf_vol_meta_create()
854 meta->vde = malloc(sizeof(struct ddf_vd_entry), M_MD_DDF, M_WAITOK); in ddf_vol_meta_create()
855 memset(meta->vde, 0xff, sizeof(struct ddf_vd_entry)); in ddf_vol_meta_create()
858 snprintf(meta->vde->VD_GUID, 25, "FreeBSD%04d%02d%02d%08x%01x", in ddf_vol_meta_create()
861 size = GET16(sample, hdr->Configuration_Record_Length) * ss; in ddf_vol_meta_create()
862 meta->vdc = malloc(size, M_MD_DDF, M_WAITOK); in ddf_vol_meta_create()
863 memset(meta->vdc, 0xff, size); in ddf_vol_meta_create()
864 SET32(meta, vdc->Signature, DDF_VDCR_SIGNATURE); in ddf_vol_meta_create()
865 memcpy(meta->vdc->VD_GUID, meta->vde->VD_GUID, 24); in ddf_vol_meta_create()
866 SET32(meta, vdc->Sequence_Number, 0); in ddf_vol_meta_create()
878 vde = &src->vdr->entry[ddf_meta_find_vd(src, GUID)]; in ddf_vol_meta_update()
880 if (GET8D(src, vdc->Secondary_Element_Count) == 1) in ddf_vol_meta_update()
883 bvd = GET8D(src, vdc->Secondary_Element_Seq); in ddf_vol_meta_update()
884 size = GET16(src, hdr->Configuration_Record_Length) * src->sectorsize; in ddf_vol_meta_update()
886 if (dst->vdc == NULL || in ddf_vol_meta_update()
887 (!started && ((int32_t)(GET32D(src, vdc->Sequence_Number) - in ddf_vol_meta_update()
888 GET32(dst, vdc->Sequence_Number))) > 0)) in ddf_vol_meta_update()
893 if (dst->bvdc[bvd] == NULL || in ddf_vol_meta_update()
894 (!started && ((int32_t)(GET32D(src, vdc->Sequence_Number) - in ddf_vol_meta_update()
895 GET32(dst, bvdc[bvd]->Sequence_Number))) > 0)) in ddf_vol_meta_update()
901 dst->bigendian = src->bigendian; in ddf_vol_meta_update()
902 ss = dst->sectorsize = src->sectorsize; in ddf_vol_meta_update()
903 if (dst->hdr != NULL) in ddf_vol_meta_update()
904 free(dst->hdr, M_MD_DDF); in ddf_vol_meta_update()
905 dst->hdr = malloc(ss, M_MD_DDF, M_WAITOK); in ddf_vol_meta_update()
906 memcpy(dst->hdr, src->hdr, ss); in ddf_vol_meta_update()
907 if (dst->cdr != NULL) in ddf_vol_meta_update()
908 free(dst->cdr, M_MD_DDF); in ddf_vol_meta_update()
909 dst->cdr = malloc(GET32(src, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); in ddf_vol_meta_update()
910 memcpy(dst->cdr, src->cdr, GET32(src, hdr->cd_length) * ss); in ddf_vol_meta_update()
911 if (dst->vde != NULL) in ddf_vol_meta_update()
912 free(dst->vde, M_MD_DDF); in ddf_vol_meta_update()
913 dst->vde = malloc(sizeof(struct ddf_vd_entry), M_MD_DDF, M_WAITOK); in ddf_vol_meta_update()
914 memcpy(dst->vde, vde, sizeof(struct ddf_vd_entry)); in ddf_vol_meta_update()
915 if (dst->vdc != NULL) in ddf_vol_meta_update()
916 free(dst->vdc, M_MD_DDF); in ddf_vol_meta_update()
917 dst->vdc = malloc(size, M_MD_DDF, M_WAITOK); in ddf_vol_meta_update()
918 memcpy(dst->vdc, vdc, size); in ddf_vol_meta_update()
921 if (dst->bvdc[bvd] != NULL) in ddf_vol_meta_update()
922 free(dst->bvdc[bvd], M_MD_DDF); in ddf_vol_meta_update()
923 dst->bvdc[bvd] = malloc(size, M_MD_DDF, M_WAITOK); in ddf_vol_meta_update()
924 memcpy(dst->bvdc[bvd], vdc, size); in ddf_vol_meta_update()
933 if (meta->hdr != NULL) { in ddf_vol_meta_free()
934 free(meta->hdr, M_MD_DDF); in ddf_vol_meta_free()
935 meta->hdr = NULL; in ddf_vol_meta_free()
937 if (meta->cdr != NULL) { in ddf_vol_meta_free()
938 free(meta->cdr, M_MD_DDF); in ddf_vol_meta_free()
939 meta->cdr = NULL; in ddf_vol_meta_free()
941 if (meta->vde != NULL) { in ddf_vol_meta_free()
942 free(meta->vde, M_MD_DDF); in ddf_vol_meta_free()
943 meta->vde = NULL; in ddf_vol_meta_free()
945 if (meta->vdc != NULL) { in ddf_vol_meta_free()
946 free(meta->vdc, M_MD_DDF); in ddf_vol_meta_free()
947 meta->vdc = NULL; in ddf_vol_meta_free()
950 if (meta->bvdc[i] != NULL) { in ddf_vol_meta_free()
951 free(meta->bvdc[i], M_MD_DDF); in ddf_vol_meta_free()
952 meta->bvdc[i] = NULL; in ddf_vol_meta_free()
968 ref = GET32(meta, pdd->PD_Reference); in ddf_meta_unused_range()
971 end[0] = GET64(meta, pdr->entry[pos].Configured_Size); in ddf_meta_unused_range()
976 if (GET32D(meta, vdc->Signature) != DDF_VDCR_SIGNATURE) in ddf_meta_unused_range()
978 for (pos = 0; pos < GET16D(meta, vdc->Primary_Element_Count); pos++) in ddf_meta_unused_range()
979 if (GET32D(meta, vdc->Physical_Disk_Sequence[pos]) == ref) in ddf_meta_unused_range()
981 if (pos == GET16D(meta, vdc->Primary_Element_Count)) in ddf_meta_unused_range()
983 offp = (uint64_t *)&(vdc->Physical_Disk_Sequence[ in ddf_meta_unused_range()
984 GET16(meta, hdr->Max_Primary_Element_Entries)]); in ddf_meta_unused_range()
986 end1 = beg1 + GET64D(meta, vdc->Block_Count); in ddf_meta_unused_range()
1002 if (end[j] - beg[j] > *size) { in ddf_meta_unused_range()
1004 *size = end[j] - beg[j]; in ddf_meta_unused_range()
1016 b = meta->vdr->entry[num].VD_Name; in ddf_meta_get_name()
1017 for (i = 15; i >= 0; i--) in ddf_meta_get_name()
1030 memset(meta->vde->VD_Name, 0x20, 16); in ddf_meta_put_name()
1031 memcpy(meta->vde->VD_Name, buf, len); in ddf_meta_put_name()
1047 pp = cp->provider; in ddf_meta_read()
1048 ss = meta->sectorsize = pp->sectorsize; in ddf_meta_read()
1052 abuf = g_read_data(cp, pp->mediasize - ss, ss, &error); in ddf_meta_read()
1055 pp->name, error); in ddf_meta_read()
1061 if (be32dec(&ahdr->Signature) == DDF_HEADER_SIGNATURE) in ddf_meta_read()
1062 meta->bigendian = 1; in ddf_meta_read()
1063 else if (le32dec(&ahdr->Signature) == DDF_HEADER_SIGNATURE) in ddf_meta_read()
1064 meta->bigendian = 0; in ddf_meta_read()
1066 G_RAID_DEBUG(1, "DDF signature check failed on %s", pp->name); in ddf_meta_read()
1070 if (ahdr->Header_Type != DDF_HEADER_ANCHOR) { in ddf_meta_read()
1071 G_RAID_DEBUG(1, "DDF header type check failed on %s", pp->name); in ddf_meta_read()
1075 meta->hdr = ahdr; in ddf_meta_read()
1076 plba = GET64(meta, hdr->Primary_Header_LBA); in ddf_meta_read()
1077 slba = GET64(meta, hdr->Secondary_Header_LBA); in ddf_meta_read()
1078 val = GET32(meta, hdr->CRC); in ddf_meta_read()
1079 SET32(meta, hdr->CRC, 0xffffffff); in ddf_meta_read()
1080 meta->hdr = NULL; in ddf_meta_read()
1082 G_RAID_DEBUG(1, "DDF CRC mismatch on %s", pp->name); in ddf_meta_read()
1086 if ((plba + 6) * ss >= pp->mediasize) { in ddf_meta_read()
1087 G_RAID_DEBUG(1, "DDF primary header LBA is wrong on %s", pp->name); in ddf_meta_read()
1091 if (slba != -1 && (slba + 6) * ss >= pp->mediasize) { in ddf_meta_read()
1092 G_RAID_DEBUG(1, "DDF secondary header LBA is wrong on %s", pp->name); in ddf_meta_read()
1107 (lba == plba) ? "primary" : "secondary", pp->name, error); in ddf_meta_read()
1108 if (lba == plba && slba != -1) { in ddf_meta_read()
1112 G_RAID_DEBUG(1, "DDF metadata read error on %s.", pp->name); in ddf_meta_read()
1115 meta->hdr = malloc(ss, M_MD_DDF, M_WAITOK); in ddf_meta_read()
1116 memcpy(meta->hdr, buf, ss); in ddf_meta_read()
1118 hdr = meta->hdr; in ddf_meta_read()
1119 val = GET32(meta, hdr->CRC); in ddf_meta_read()
1120 SET32(meta, hdr->CRC, 0xffffffff); in ddf_meta_read()
1121 if (hdr->Signature != ahdr->Signature || in ddf_meta_read()
1122 crc32(meta->hdr, ss) != val || in ddf_meta_read()
1123 memcmp(hdr->DDF_Header_GUID, ahdr->DDF_Header_GUID, 24) || in ddf_meta_read()
1124 GET64(meta, hdr->Primary_Header_LBA) != plba || in ddf_meta_read()
1125 GET64(meta, hdr->Secondary_Header_LBA) != slba) { in ddf_meta_read()
1128 (lba == plba) ? "primary" : "secondary", pp->name); in ddf_meta_read()
1129 if (lba == plba && slba != -1) { in ddf_meta_read()
1133 G_RAID_DEBUG(1, "DDF metadata check failed on %s", pp->name); in ddf_meta_read()
1137 if ((lba == plba && hdr->Header_Type != DDF_HEADER_PRIMARY) || in ddf_meta_read()
1138 (lba == slba && hdr->Header_Type != DDF_HEADER_SECONDARY)) in ddf_meta_read()
1141 len = max(len, GET32(meta, hdr->cd_section) + GET32(meta, hdr->cd_length)); in ddf_meta_read()
1142 len = max(len, GET32(meta, hdr->pdr_section) + GET32(meta, hdr->pdr_length)); in ddf_meta_read()
1143 len = max(len, GET32(meta, hdr->vdr_section) + GET32(meta, hdr->vdr_length)); in ddf_meta_read()
1144 len = max(len, GET32(meta, hdr->cr_section) + GET32(meta, hdr->cr_length)); in ddf_meta_read()
1145 len = max(len, GET32(meta, hdr->pdd_section) + GET32(meta, hdr->pdd_length)); in ddf_meta_read()
1146 if ((val = GET32(meta, hdr->bbmlog_section)) != 0xffffffff) in ddf_meta_read()
1147 len = max(len, val + GET32(meta, hdr->bbmlog_length)); in ddf_meta_read()
1148 if ((val = GET32(meta, hdr->Diagnostic_Space)) != 0xffffffff) in ddf_meta_read()
1149 len = max(len, val + GET32(meta, hdr->Diagnostic_Space_Length)); in ddf_meta_read()
1150 if ((val = GET32(meta, hdr->Vendor_Specific_Logs)) != 0xffffffff) in ddf_meta_read()
1151 len = max(len, val + GET32(meta, hdr->Vendor_Specific_Logs_Length)); in ddf_meta_read()
1152 if ((plba + len) * ss >= pp->mediasize) in ddf_meta_read()
1154 if (slba != -1 && (slba + len) * ss >= pp->mediasize) in ddf_meta_read()
1157 if (GET16(meta, hdr->Max_Primary_Element_Entries) == 0xffff) { in ddf_meta_read()
1158 SET16(meta, hdr->Max_Primary_Element_Entries, in ddf_meta_read()
1159 min(GET16(meta, hdr->Max_PD_Entries), in ddf_meta_read()
1160 (GET16(meta, hdr->Configuration_Record_Length) * ss - 512) / 12)); in ddf_meta_read()
1163 if (GET32(meta, hdr->cd_length) * ss >= maxphys || in ddf_meta_read()
1164 GET32(meta, hdr->pdr_length) * ss >= maxphys || in ddf_meta_read()
1165 GET32(meta, hdr->vdr_length) * ss >= maxphys || in ddf_meta_read()
1166 GET32(meta, hdr->cr_length) * ss >= maxphys || in ddf_meta_read()
1167 GET32(meta, hdr->pdd_length) * ss >= maxphys || in ddf_meta_read()
1168 GET32(meta, hdr->bbmlog_length) * ss >= maxphys) { in ddf_meta_read()
1169 G_RAID_DEBUG(1, "%s: Blocksize is too big.", pp->name); in ddf_meta_read()
1174 buf = g_read_data(cp, (lba + GET32(meta, hdr->cd_section)) * ss, in ddf_meta_read()
1175 GET32(meta, hdr->cd_length) * ss, &error); in ddf_meta_read()
1178 meta->cdr = malloc(GET32(meta, hdr->cd_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_read()
1179 memcpy(meta->cdr, buf, GET32(meta, hdr->cd_length) * ss); in ddf_meta_read()
1181 if (GET32(meta, cdr->Signature) != DDF_CONTROLLER_DATA_SIGNATURE) in ddf_meta_read()
1185 buf = g_read_data(cp, (lba + GET32(meta, hdr->pdr_section)) * ss, in ddf_meta_read()
1186 GET32(meta, hdr->pdr_length) * ss, &error); in ddf_meta_read()
1189 meta->pdr = malloc(GET32(meta, hdr->pdr_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_read()
1190 memcpy(meta->pdr, buf, GET32(meta, hdr->pdr_length) * ss); in ddf_meta_read()
1192 if (GET32(meta, pdr->Signature) != DDF_PDR_SIGNATURE) in ddf_meta_read()
1198 if (meta->bigendian) { in ddf_meta_read()
1199 for (i = 0; i < GET16(meta, pdr->Populated_PDEs); i++) { in ddf_meta_read()
1200 if (isff(meta->pdr->entry[i].PD_GUID, 24)) in ddf_meta_read()
1202 if (GET32(meta, pdr->entry[i].PD_Reference) == in ddf_meta_read()
1205 if (GET64(meta, pdr->entry[i].Configured_Size) >= in ddf_meta_read()
1207 SET16(meta, pdr->entry[i].PD_State, in ddf_meta_read()
1208 GET16(meta, pdr->entry[i].PD_State) & in ddf_meta_read()
1210 SET64(meta, pdr->entry[i].Configured_Size, in ddf_meta_read()
1211 GET64(meta, pdr->entry[i].Configured_Size) & in ddf_meta_read()
1212 ((1ULL << 48) - 1)); in ddf_meta_read()
1218 buf = g_read_data(cp, (lba + GET32(meta, hdr->vdr_section)) * ss, in ddf_meta_read()
1219 GET32(meta, hdr->vdr_length) * ss, &error); in ddf_meta_read()
1222 meta->vdr = malloc(GET32(meta, hdr->vdr_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_read()
1223 memcpy(meta->vdr, buf, GET32(meta, hdr->vdr_length) * ss); in ddf_meta_read()
1225 if (GET32(meta, vdr->Signature) != DDF_VD_RECORD_SIGNATURE) in ddf_meta_read()
1229 buf = g_read_data(cp, (lba + GET32(meta, hdr->cr_section)) * ss, in ddf_meta_read()
1230 GET32(meta, hdr->cr_length) * ss, &error); in ddf_meta_read()
1233 meta->cr = malloc(GET32(meta, hdr->cr_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_read()
1234 memcpy(meta->cr, buf, GET32(meta, hdr->cr_length) * ss); in ddf_meta_read()
1238 buf = g_read_data(cp, (lba + GET32(meta, hdr->pdd_section)) * ss, in ddf_meta_read()
1239 GET32(meta, hdr->pdd_length) * ss, &error); in ddf_meta_read()
1242 meta->pdd = malloc(GET32(meta, hdr->pdd_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_read()
1243 memcpy(meta->pdd, buf, GET32(meta, hdr->pdd_length) * ss); in ddf_meta_read()
1245 if (GET32(meta, pdd->Signature) != DDF_PDD_SIGNATURE) in ddf_meta_read()
1247 i = ddf_meta_find_pd(meta, NULL, GET32(meta, pdd->PD_Reference)); in ddf_meta_read()
1252 if (GET32(meta, hdr->bbmlog_section) != 0xffffffff && in ddf_meta_read()
1253 GET32(meta, hdr->bbmlog_length) != 0) { in ddf_meta_read()
1254 buf = g_read_data(cp, (lba + GET32(meta, hdr->bbmlog_section)) * ss, in ddf_meta_read()
1255 GET32(meta, hdr->bbmlog_length) * ss, &error); in ddf_meta_read()
1258 meta->bbm = malloc(GET32(meta, hdr->bbmlog_length) * ss, M_MD_DDF, M_WAITOK); in ddf_meta_read()
1259 memcpy(meta->bbm, buf, GET32(meta, hdr->bbmlog_length) * ss); in ddf_meta_read()
1261 if (GET32(meta, bbm->Signature) != DDF_BBML_SIGNATURE) in ddf_meta_read()
1281 pp = cp->provider; in ddf_meta_write()
1282 ss = pp->sectorsize; in ddf_meta_write()
1283 lba = alba = pp->mediasize / ss - 1; in ddf_meta_write()
1284 plba = GET64(meta, hdr->Primary_Header_LBA); in ddf_meta_write()
1285 slba = GET64(meta, hdr->Secondary_Header_LBA); in ddf_meta_write()
1288 SET8(meta, hdr->Header_Type, (lba == alba) ? DDF_HEADER_ANCHOR : in ddf_meta_write()
1290 SET32(meta, hdr->CRC, 0xffffffff); in ddf_meta_write()
1291 SET32(meta, hdr->CRC, crc32(meta->hdr, ss)); in ddf_meta_write()
1292 error = g_write_data(cp, lba * ss, meta->hdr, ss); in ddf_meta_write()
1296 pp->name, error); in ddf_meta_write()
1305 size = GET32(meta, hdr->cd_length) * ss; in ddf_meta_write()
1306 SET32(meta, cdr->CRC, 0xffffffff); in ddf_meta_write()
1307 SET32(meta, cdr->CRC, crc32(meta->cdr, size)); in ddf_meta_write()
1308 error = g_write_data(cp, (lba + GET32(meta, hdr->cd_section)) * ss, in ddf_meta_write()
1309 meta->cdr, size); in ddf_meta_write()
1313 size = GET32(meta, hdr->pdr_length) * ss; in ddf_meta_write()
1314 SET32(meta, pdr->CRC, 0xffffffff); in ddf_meta_write()
1315 SET32(meta, pdr->CRC, crc32(meta->pdr, size)); in ddf_meta_write()
1316 error = g_write_data(cp, (lba + GET32(meta, hdr->pdr_section)) * ss, in ddf_meta_write()
1317 meta->pdr, size); in ddf_meta_write()
1321 size = GET32(meta, hdr->vdr_length) * ss; in ddf_meta_write()
1322 SET32(meta, vdr->CRC, 0xffffffff); in ddf_meta_write()
1323 SET32(meta, vdr->CRC, crc32(meta->vdr, size)); in ddf_meta_write()
1324 error = g_write_data(cp, (lba + GET32(meta, hdr->vdr_section)) * ss, in ddf_meta_write()
1325 meta->vdr, size); in ddf_meta_write()
1329 size = GET16(meta, hdr->Configuration_Record_Length) * ss; in ddf_meta_write()
1333 SET32D(meta, vdc->CRC, 0xffffffff); in ddf_meta_write()
1334 SET32D(meta, vdc->CRC, crc32(vdc, size)); in ddf_meta_write()
1336 error = g_write_data(cp, (lba + GET32(meta, hdr->cr_section)) * ss, in ddf_meta_write()
1337 meta->cr, size * num); in ddf_meta_write()
1341 size = GET32(meta, hdr->pdd_length) * ss; in ddf_meta_write()
1342 SET32(meta, pdd->CRC, 0xffffffff); in ddf_meta_write()
1343 SET32(meta, pdd->CRC, crc32(meta->pdd, size)); in ddf_meta_write()
1344 error = g_write_data(cp, (lba + GET32(meta, hdr->pdd_section)) * ss, in ddf_meta_write()
1345 meta->pdd, size); in ddf_meta_write()
1349 if (GET32(meta, hdr->bbmlog_length) != 0) { in ddf_meta_write()
1350 size = GET32(meta, hdr->bbmlog_length) * ss; in ddf_meta_write()
1351 SET32(meta, bbm->CRC, 0xffffffff); in ddf_meta_write()
1352 SET32(meta, bbm->CRC, crc32(meta->bbm, size)); in ddf_meta_write()
1354 (lba + GET32(meta, hdr->bbmlog_section)) * ss, in ddf_meta_write()
1355 meta->bbm, size); in ddf_meta_write()
1361 if (lba == plba && slba != -1) { in ddf_meta_write()
1376 pp = cp->provider; in ddf_meta_erase()
1377 buf = malloc(pp->sectorsize, M_MD_DDF, M_WAITOK | M_ZERO); in ddf_meta_erase()
1378 error = g_write_data(cp, pp->mediasize - pp->sectorsize, in ddf_meta_erase()
1379 buf, pp->sectorsize); in ddf_meta_erase()
1382 pp->name, error); in ddf_meta_erase()
1394 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_ddf_get_volume()
1395 pv = vol->v_md_data; in g_raid_md_ddf_get_volume()
1396 if (memcmp(pv->pv_meta.vde->VD_GUID, GUID, 24) == 0) in g_raid_md_ddf_get_volume()
1409 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ddf_get_disk()
1410 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_ddf_get_disk()
1411 meta = &pd->pd_meta; in g_raid_md_ddf_get_disk()
1413 if (memcmp(meta->pdd->PD_GUID, GUID, 24) == 0) in g_raid_md_ddf_get_disk()
1416 if (GET32(meta, pdd->PD_Reference) == id) in g_raid_md_ddf_get_disk()
1430 TAILQ_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tvol) { in g_raid_md_ddf_purge_volumes()
1431 if (vol->v_stopping) in g_raid_md_ddf_purge_volumes()
1433 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_ddf_purge_volumes()
1434 if (vol->v_subdisks[i].sd_state != G_RAID_SUBDISK_S_NONE) in g_raid_md_ddf_purge_volumes()
1437 if (i >= vol->v_disks_count) { in g_raid_md_ddf_purge_volumes()
1455 TAILQ_FOREACH_SAFE(disk, &sc->sc_disks, d_next, tdisk) { in g_raid_md_ddf_purge_disks()
1456 if (disk->d_state == G_RAID_DISK_S_SPARE) in g_raid_md_ddf_purge_disks()
1458 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_ddf_purge_disks()
1461 for (i = 0; i < pd->pd_subdisks; ) { in g_raid_md_ddf_purge_disks()
1463 pd->pd_meta[i]->volume_id); in g_raid_md_ddf_purge_disks()
1464 if (vol != NULL && !vol->v_stopping) { in g_raid_md_ddf_purge_disks()
1468 free(pd->pd_meta[i], M_MD_DDF); in g_raid_md_ddf_purge_disks()
1469 for (j = i; j < pd->pd_subdisks - 1; j++) in g_raid_md_ddf_purge_disks()
1470 pd->pd_meta[j] = pd->pd_meta[j + 1]; in g_raid_md_ddf_purge_disks()
1471 pd->pd_meta[DDF_MAX_SUBDISKS - 1] = NULL; in g_raid_md_ddf_purge_disks()
1472 pd->pd_subdisks--; in g_raid_md_ddf_purge_disks()
1473 pd->pd_updated = 1; in g_raid_md_ddf_purge_disks()
1476 /* If there is no metadata left - erase and delete disk. */ in g_raid_md_ddf_purge_disks()
1477 if (pd->pd_subdisks == 0) { in g_raid_md_ddf_purge_disks()
1478 ddf_meta_erase(disk->d_consumer); in g_raid_md_ddf_purge_disks()
1615 struct g_raid_md_ddf_object *mdi; in g_raid_md_ddf_start_disk() local
1622 int disk_pos, md_disk_bvd = -1, md_disk_pos = -1, md_pde_pos; in g_raid_md_ddf_start_disk()
1626 sc = disk->d_softc; in g_raid_md_ddf_start_disk()
1627 mdi = (struct g_raid_md_ddf_object *)sc->sc_md; in g_raid_md_ddf_start_disk()
1628 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_ddf_start_disk()
1629 pdmeta = &pd->pd_meta; in g_raid_md_ddf_start_disk()
1630 reference = GET32(&pd->pd_meta, pdd->PD_Reference); in g_raid_md_ddf_start_disk()
1632 pv = vol->v_md_data; in g_raid_md_ddf_start_disk()
1633 vmeta = &pv->pv_meta; in g_raid_md_ddf_start_disk()
1634 gmeta = &mdi->mdio_meta; in g_raid_md_ddf_start_disk()
1644 g_raid_get_diskname(disk), vol->v_name); in g_raid_md_ddf_start_disk()
1647 if ((GET16(gmeta, pdr->entry[md_pde_pos].PD_State) & DDF_PDE_PFA) != 0) { in g_raid_md_ddf_start_disk()
1652 /* If disk has some metadata for this volume - erase. */ in g_raid_md_ddf_start_disk()
1653 if ((vdc1 = ddf_meta_find_vdc(pdmeta, vmeta->vdc->VD_GUID)) != NULL) in g_raid_md_ddf_start_disk()
1654 SET32D(pdmeta, vdc1->Signature, 0xffffffff); in g_raid_md_ddf_start_disk()
1657 if (!pv->pv_started) in g_raid_md_ddf_start_disk()
1660 * If we have already started - try to get use of the disk. in g_raid_md_ddf_start_disk()
1663 if (ddf_meta_count_vdc(&pd->pd_meta, NULL) >= in g_raid_md_ddf_start_disk()
1664 GET16(&pd->pd_meta, hdr->Max_Partitions)) { in g_raid_md_ddf_start_disk()
1669 ddf_meta_unused_range(&pd->pd_meta, &eoff, &esize); in g_raid_md_ddf_start_disk()
1675 eoff *= pd->pd_meta.sectorsize; in g_raid_md_ddf_start_disk()
1676 esize *= pd->pd_meta.sectorsize; in g_raid_md_ddf_start_disk()
1678 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_ddf_start_disk()
1679 sd = &vol->v_subdisks[i]; in g_raid_md_ddf_start_disk()
1680 if (sd->sd_state != G_RAID_SUBDISK_S_NONE) in g_raid_md_ddf_start_disk()
1681 size = sd->sd_size; in g_raid_md_ddf_start_disk()
1682 if (sd->sd_state <= G_RAID_SUBDISK_S_FAILED && in g_raid_md_ddf_start_disk()
1684 vol->v_subdisks[i].sd_state < sd->sd_state)) in g_raid_md_ddf_start_disk()
1688 vol->v_raid_level != G_RAID_VOLUME_RL_CONCAT && in g_raid_md_ddf_start_disk()
1693 disk_pos = -1; in g_raid_md_ddf_start_disk()
1696 if (vol->v_raid_level != G_RAID_VOLUME_RL_CONCAT) in g_raid_md_ddf_start_disk()
1698 md_disk_bvd = disk_pos / GET16(vmeta, vdc->Primary_Element_Count); // XXX in g_raid_md_ddf_start_disk()
1699 md_disk_pos = disk_pos % GET16(vmeta, vdc->Primary_Element_Count); // XXX in g_raid_md_ddf_start_disk()
1702 if (disk->d_state == G_RAID_DISK_S_NONE) in g_raid_md_ddf_start_disk()
1712 sa = ddf_meta_find_sa(&pd->pd_meta, 0); in g_raid_md_ddf_start_disk()
1714 if ((GET8D(&pd->pd_meta, sa->Spare_Type) & in g_raid_md_ddf_start_disk()
1716 SET32D(&pd->pd_meta, sa->Signature, 0xffffffff); in g_raid_md_ddf_start_disk()
1718 SET8D(&pd->pd_meta, sa->Spare_Type, in g_raid_md_ddf_start_disk()
1719 GET8D(&pd->pd_meta, sa->Spare_Type) | in g_raid_md_ddf_start_disk()
1725 g_raid_get_diskname(disk), disk_pos, vol->v_name); in g_raid_md_ddf_start_disk()
1729 sd = &vol->v_subdisks[disk_pos]; in g_raid_md_ddf_start_disk()
1731 if (resurrection && sd->sd_disk != NULL) { in g_raid_md_ddf_start_disk()
1732 g_raid_change_disk_state(sd->sd_disk, in g_raid_md_ddf_start_disk()
1734 TAILQ_REMOVE(&sd->sd_disk->d_subdisks, in g_raid_md_ddf_start_disk()
1737 vol->v_subdisks[disk_pos].sd_disk = disk; in g_raid_md_ddf_start_disk()
1738 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_ddf_start_disk()
1743 else if (GET16(gmeta, pdr->entry[md_pde_pos].PD_State) & DDF_PDE_PFA) in g_raid_md_ddf_start_disk()
1749 sd->sd_offset = eoff; in g_raid_md_ddf_start_disk()
1750 sd->sd_size = esize; in g_raid_md_ddf_start_disk()
1751 } else if (pdmeta->cr != NULL && in g_raid_md_ddf_start_disk()
1752 (vdc1 = ddf_meta_find_vdc(pdmeta, vmeta->vdc->VD_GUID)) != NULL) { in g_raid_md_ddf_start_disk()
1753 …val2 = (uint64_t *)&(vdc1->Physical_Disk_Sequence[GET16(vmeta, hdr->Max_Primary_Element_Entries)]); in g_raid_md_ddf_start_disk()
1754 sd->sd_offset = (off_t)GET64P(pdmeta, val2 + md_disk_pos) * 512; in g_raid_md_ddf_start_disk()
1755 sd->sd_size = (off_t)GET64D(pdmeta, vdc1->Block_Count) * 512; in g_raid_md_ddf_start_disk()
1762 } else if (GET16(gmeta, pdr->entry[md_pde_pos].PD_State) & DDF_PDE_PFA) { in g_raid_md_ddf_start_disk()
1766 } else if ((GET16(gmeta, pdr->entry[md_pde_pos].PD_State) & in g_raid_md_ddf_start_disk()
1771 sd->sd_rebuild_pos = 0; in g_raid_md_ddf_start_disk()
1772 } else if ((GET8(vmeta, vde->VD_State) & DDF_VDE_DIRTY) != 0 || in g_raid_md_ddf_start_disk()
1773 (GET8(vmeta, vde->Init_State) & DDF_VDE_INIT_MASK) != in g_raid_md_ddf_start_disk()
1800 md = sc->sc_md; in g_raid_md_ddf_refill()
1803 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_ddf_refill()
1804 pv = vol->v_md_data; in g_raid_md_ddf_refill()
1805 if (!pv->pv_started || vol->v_stopping) in g_raid_md_ddf_refill()
1810 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_ddf_refill()
1811 sd = &vol->v_subdisks[i]; in g_raid_md_ddf_refill()
1812 if (sd->sd_state == G_RAID_SUBDISK_S_NONE || in g_raid_md_ddf_refill()
1813 sd->sd_state == G_RAID_SUBDISK_S_FAILED) in g_raid_md_ddf_refill()
1820 "trying to refill.", vol->v_name); in g_raid_md_ddf_refill()
1822 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ddf_refill()
1824 if (disk->d_state < G_RAID_DISK_S_SPARE) in g_raid_md_ddf_refill()
1827 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_ddf_refill()
1828 sd = &vol->v_subdisks[i]; in g_raid_md_ddf_refill()
1829 if (sd->sd_disk == disk) in g_raid_md_ddf_refill()
1832 if (i < vol->v_disks_count) in g_raid_md_ddf_refill()
1836 pd = disk->d_md_data; in g_raid_md_ddf_refill()
1837 if (ddf_meta_count_vdc(&pd->pd_meta, NULL) < in g_raid_md_ddf_refill()
1838 GET16(&pd->pd_meta, hdr->Max_Partitions)) { in g_raid_md_ddf_refill()
1862 struct g_raid_md_ddf_object *mdi; in g_raid_md_ddf_start() local
1867 sc = vol->v_softc; in g_raid_md_ddf_start()
1868 md = sc->sc_md; in g_raid_md_ddf_start()
1869 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_ddf_start()
1870 pv = vol->v_md_data; in g_raid_md_ddf_start()
1871 vmeta = &pv->pv_meta; in g_raid_md_ddf_start()
1873 vol->v_raid_level = GET8(vmeta, vdc->Primary_RAID_Level); in g_raid_md_ddf_start()
1874 vol->v_raid_level_qualifier = GET8(vmeta, vdc->RLQ); in g_raid_md_ddf_start()
1875 if (GET8(vmeta, vdc->Secondary_Element_Count) > 1 && in g_raid_md_ddf_start()
1876 vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 && in g_raid_md_ddf_start()
1877 GET8(vmeta, vdc->Secondary_RAID_Level) == 0) in g_raid_md_ddf_start()
1878 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; in g_raid_md_ddf_start()
1879 vol->v_sectorsize = GET16(vmeta, vdc->Block_Size); in g_raid_md_ddf_start()
1880 if (vol->v_sectorsize == 0xffff) in g_raid_md_ddf_start()
1881 vol->v_sectorsize = vmeta->sectorsize; in g_raid_md_ddf_start()
1882 vol->v_strip_size = vol->v_sectorsize << GET8(vmeta, vdc->Stripe_Size); in g_raid_md_ddf_start()
1883 vol->v_disks_count = GET16(vmeta, vdc->Primary_Element_Count) * in g_raid_md_ddf_start()
1884 GET8(vmeta, vdc->Secondary_Element_Count); in g_raid_md_ddf_start()
1885 vol->v_mdf_pdisks = GET8(vmeta, vdc->MDF_Parity_Disks); in g_raid_md_ddf_start()
1886 vol->v_mdf_polynomial = GET16(vmeta, vdc->MDF_Parity_Generator_Polynomial); in g_raid_md_ddf_start()
1887 vol->v_mdf_method = GET8(vmeta, vdc->MDF_Constant_Generation_Method); in g_raid_md_ddf_start()
1888 if (GET8(vmeta, vdc->Rotate_Parity_count) > 31) in g_raid_md_ddf_start()
1889 vol->v_rotate_parity = 1; in g_raid_md_ddf_start()
1891 vol->v_rotate_parity = 1 << GET8(vmeta, vdc->Rotate_Parity_count); in g_raid_md_ddf_start()
1892 vol->v_mediasize = GET64(vmeta, vdc->VD_Size) * vol->v_sectorsize; in g_raid_md_ddf_start()
1893 for (i = 0, j = 0, bvd = 0; i < vol->v_disks_count; i++, j++) { in g_raid_md_ddf_start()
1894 if (j == GET16(vmeta, vdc->Primary_Element_Count)) { in g_raid_md_ddf_start()
1898 sd = &vol->v_subdisks[i]; in g_raid_md_ddf_start()
1899 if (vmeta->bvdc[bvd] == NULL) { in g_raid_md_ddf_start()
1900 sd->sd_offset = 0; in g_raid_md_ddf_start()
1901 sd->sd_size = GET64(vmeta, vdc->Block_Count) * in g_raid_md_ddf_start()
1902 vol->v_sectorsize; in g_raid_md_ddf_start()
1905 val2 = (uint64_t *)&(vmeta->bvdc[bvd]->Physical_Disk_Sequence[ in g_raid_md_ddf_start()
1906 GET16(vmeta, hdr->Max_Primary_Element_Entries)]); in g_raid_md_ddf_start()
1907 sd->sd_offset = GET64P(vmeta, val2 + j) * vol->v_sectorsize; in g_raid_md_ddf_start()
1908 sd->sd_size = GET64(vmeta, bvdc[bvd]->Block_Count) * in g_raid_md_ddf_start()
1909 vol->v_sectorsize; in g_raid_md_ddf_start()
1914 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ddf_start()
1915 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_ddf_start()
1916 if (ddf_meta_find_vdc(&pd->pd_meta, vmeta->vdc->VD_GUID) != NULL) in g_raid_md_ddf_start()
1920 pv->pv_started = 1; in g_raid_md_ddf_start()
1921 mdi->mdio_starting--; in g_raid_md_ddf_start()
1922 callout_stop(&pv->pv_start_co); in g_raid_md_ddf_start()
1940 pv = vol->v_md_data; in g_raid_ddf_go()
1941 sc = vol->v_softc; in g_raid_ddf_go()
1942 if (!pv->pv_started) { in g_raid_ddf_go()
1956 struct g_raid_md_ddf_object *mdi; in g_raid_md_ddf_new_disk() local
1966 sc = disk->d_softc; in g_raid_md_ddf_new_disk()
1967 md = sc->sc_md; in g_raid_md_ddf_new_disk()
1968 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_ddf_new_disk()
1969 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_ddf_new_disk()
1970 pdmeta = &pd->pd_meta; in g_raid_md_ddf_new_disk()
1971 spare = -1; in g_raid_md_ddf_new_disk()
1973 if (mdi->mdio_meta.hdr == NULL) in g_raid_md_ddf_new_disk()
1974 ddf_meta_copy(&mdi->mdio_meta, pdmeta); in g_raid_md_ddf_new_disk()
1976 ddf_meta_update(&mdi->mdio_meta, pdmeta); in g_raid_md_ddf_new_disk()
1981 val = GET32D(pdmeta, vdc->Signature); in g_raid_md_ddf_new_disk()
1983 if (val == DDF_SA_SIGNATURE && spare == -1) in g_raid_md_ddf_new_disk()
1989 k = ddf_meta_find_vd(pdmeta, vdc->VD_GUID); in g_raid_md_ddf_new_disk()
1992 vde = &pdmeta->vdr->entry[k]; in g_raid_md_ddf_new_disk()
1995 vol = g_raid_md_ddf_get_volume(sc, vdc->VD_GUID); in g_raid_md_ddf_new_disk()
1999 GET16D(pdmeta, vde->VD_Number)); in g_raid_md_ddf_new_disk()
2001 vol->v_md_data = pv; in g_raid_md_ddf_new_disk()
2002 callout_init(&pv->pv_start_co, 1); in g_raid_md_ddf_new_disk()
2003 callout_reset(&pv->pv_start_co, in g_raid_md_ddf_new_disk()
2006 mdi->mdio_starting++; in g_raid_md_ddf_new_disk()
2008 pv = vol->v_md_data; in g_raid_md_ddf_new_disk()
2010 /* If we haven't started yet - check metadata freshness. */ in g_raid_md_ddf_new_disk()
2011 vmeta = &pv->pv_meta; in g_raid_md_ddf_new_disk()
2012 ddf_vol_meta_update(vmeta, pdmeta, vdc->VD_GUID, pv->pv_started); in g_raid_md_ddf_new_disk()
2020 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_ddf_new_disk()
2021 pv = vol->v_md_data; in g_raid_md_ddf_new_disk()
2022 vmeta = &pv->pv_meta; in g_raid_md_ddf_new_disk()
2024 if (ddf_meta_find_vdc(pdmeta, vmeta->vdc->VD_GUID) == NULL) in g_raid_md_ddf_new_disk()
2027 if (pv->pv_started) { in g_raid_md_ddf_new_disk()
2033 /* If we collected all needed disks - start array. */ in g_raid_md_ddf_new_disk()
2036 for (k = 0; k < GET8(vmeta, vdc->Secondary_Element_Count); k++) { in g_raid_md_ddf_new_disk()
2037 if (vmeta->bvdc[k] == NULL) { in g_raid_md_ddf_new_disk()
2038 need += GET16(vmeta, vdc->Primary_Element_Count); in g_raid_md_ddf_new_disk()
2041 cnt = GET16(vmeta, bvdc[k]->Primary_Element_Count); in g_raid_md_ddf_new_disk()
2044 val = GET32(vmeta, bvdc[k]->Physical_Disk_Sequence[i]); in g_raid_md_ddf_new_disk()
2050 vol->v_name, have, need); in g_raid_md_ddf_new_disk()
2062 struct g_raid_md_ddf_object *mdi, *mdi1; in g_raid_md_create_req_ddf() local
2067 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_create_req_ddf()
2079 LIST_FOREACH(geom, &mp->geom, geom) { in g_raid_md_create_req_ddf()
2080 sc = geom->softc; in g_raid_md_create_req_ddf()
2083 if (sc->sc_stopping != 0) in g_raid_md_create_req_ddf()
2085 if (sc->sc_md->mdo_class != md->mdo_class) in g_raid_md_create_req_ddf()
2087 mdi1 = (struct g_raid_md_ddf_object *)sc->sc_md; in g_raid_md_create_req_ddf()
2088 if (mdi1->mdio_bigendian != be) in g_raid_md_create_req_ddf()
2098 mdi->mdio_bigendian = be; in g_raid_md_create_req_ddf()
2099 snprintf(name, sizeof(name), "DDF%s", be ? "" : "-LE"); in g_raid_md_create_req_ddf()
2103 md->mdo_softc = sc; in g_raid_md_create_req_ddf()
2104 *gp = sc->sc_geom; in g_raid_md_create_req_ddf()
2118 struct g_raid_md_ddf_object *mdi; in g_raid_md_taste_ddf() local
2123 G_RAID_DEBUG(1, "Tasting DDF on %s", cp->provider->name); in g_raid_md_taste_ddf()
2124 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_taste_ddf()
2125 pp = cp->provider; in g_raid_md_taste_ddf()
2141 LIST_FOREACH(geom, &mp->geom, geom) { in g_raid_md_taste_ddf()
2142 sc = geom->softc; in g_raid_md_taste_ddf()
2145 if (sc->sc_stopping != 0) in g_raid_md_taste_ddf()
2147 if (sc->sc_md->mdo_class != md->mdo_class) in g_raid_md_taste_ddf()
2149 mdi = (struct g_raid_md_ddf_object *)sc->sc_md; in g_raid_md_taste_ddf()
2150 if (mdi->mdio_bigendian != be) in g_raid_md_taste_ddf()
2157 G_RAID_DEBUG(1, "Found matching array %s", sc->sc_name); in g_raid_md_taste_ddf()
2160 } else { /* Not found matching node -- create one. */ in g_raid_md_taste_ddf()
2162 mdi->mdio_bigendian = be; in g_raid_md_taste_ddf()
2163 snprintf(name, sizeof(name), "DDF%s", be ? "" : "-LE"); in g_raid_md_taste_ddf()
2165 md->mdo_softc = sc; in g_raid_md_taste_ddf()
2166 geom = sc->sc_geom; in g_raid_md_taste_ddf()
2170 g_access(cp, -1, 0, 0); in g_raid_md_taste_ddf()
2173 rcp->flags |= G_CF_DIRECT_RECEIVE; in g_raid_md_taste_ddf()
2179 sx_xlock(&sc->sc_lock); in g_raid_md_taste_ddf()
2182 pd->pd_meta = meta; in g_raid_md_taste_ddf()
2184 disk->d_md_data = (void *)pd; in g_raid_md_taste_ddf()
2185 disk->d_consumer = rcp; in g_raid_md_taste_ddf()
2186 rcp->private = disk; in g_raid_md_taste_ddf()
2192 sx_xunlock(&sc->sc_lock); in g_raid_md_taste_ddf()
2204 sc = md->mdo_softc; in g_raid_md_event_ddf()
2206 return (-1); in g_raid_md_event_ddf()
2218 if (g_raid_ndisks(sc, -1) == 0) in g_raid_md_event_ddf()
2224 return (-2); in g_raid_md_event_ddf()
2233 pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; in g_raid_md_volume_event_ddf()
2236 if (!pv->pv_started) in g_raid_md_volume_event_ddf()
2240 return (-2); in g_raid_md_volume_event_ddf()
2253 struct g_raid_md_ddf_object *mdi; in g_raid_md_ctl_ddf() local
2266 sc = md->mdo_softc; in g_raid_md_ctl_ddf()
2267 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_ctl_ddf()
2275 return (-1); in g_raid_md_ctl_ddf()
2280 return (-2); in g_raid_md_ctl_ddf()
2285 return (-3); in g_raid_md_ctl_ddf()
2289 return (-4); in g_raid_md_ctl_ddf()
2291 numdisks = *nargs - 3; in g_raid_md_ctl_ddf()
2296 "(0x%02x/0x%02x), or number of disks (%d).", in g_raid_md_ctl_ddf()
2298 return (-5); in g_raid_md_ctl_ddf()
2311 error = -6; in g_raid_md_ctl_ddf()
2317 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_ddf()
2318 if (disk->d_consumer != NULL && in g_raid_md_ctl_ddf()
2319 disk->d_consumer->provider != NULL && in g_raid_md_ctl_ddf()
2320 strcmp(disk->d_consumer->provider->name, in g_raid_md_ctl_ddf()
2325 if (disk->d_state != G_RAID_DISK_S_ACTIVE) { in g_raid_md_ctl_ddf()
2328 g_raid_disk_state2str(disk->d_state)); in g_raid_md_ctl_ddf()
2329 error = -7; in g_raid_md_ctl_ddf()
2332 pd = disk->d_md_data; in g_raid_md_ctl_ddf()
2333 if (ddf_meta_count_vdc(&pd->pd_meta, NULL) >= in g_raid_md_ctl_ddf()
2334 GET16(&pd->pd_meta, hdr->Max_Partitions)) { in g_raid_md_ctl_ddf()
2338 error = -7; in g_raid_md_ctl_ddf()
2341 pp = disk->d_consumer->provider; in g_raid_md_ctl_ddf()
2343 ddf_meta_unused_range(&pd->pd_meta, in g_raid_md_ctl_ddf()
2345 offs[i] *= pp->sectorsize; in g_raid_md_ctl_ddf()
2346 size = MIN(size, (off_t)esize * pp->sectorsize); in g_raid_md_ctl_ddf()
2347 sectorsize = MAX(sectorsize, pp->sectorsize); in g_raid_md_ctl_ddf()
2357 error = -8; in g_raid_md_ctl_ddf()
2360 pp = cp->provider; in g_raid_md_ctl_ddf()
2363 disk->d_md_data = (void *)pd; in g_raid_md_ctl_ddf()
2364 disk->d_consumer = cp; in g_raid_md_ctl_ddf()
2366 cp->private = disk; in g_raid_md_ctl_ddf()
2367 ddf_meta_create(disk, &mdi->mdio_meta); in g_raid_md_ctl_ddf()
2368 if (mdi->mdio_meta.hdr == NULL) in g_raid_md_ctl_ddf()
2369 ddf_meta_copy(&mdi->mdio_meta, &pd->pd_meta); in g_raid_md_ctl_ddf()
2371 ddf_meta_update(&mdi->mdio_meta, &pd->pd_meta); in g_raid_md_ctl_ddf()
2377 size = MIN(size, GET64(&pd->pd_meta, in g_raid_md_ctl_ddf()
2378 pdr->entry[0].Configured_Size) * pp->sectorsize); in g_raid_md_ctl_ddf()
2379 sectorsize = MAX(sectorsize, pp->sectorsize); in g_raid_md_ctl_ddf()
2384 disks[i]->d_state == G_RAID_DISK_S_NONE) in g_raid_md_ctl_ddf()
2392 return (-8); in g_raid_md_ctl_ddf()
2403 return (-9); in g_raid_md_ctl_ddf()
2416 return (-10); in g_raid_md_ctl_ddf()
2420 return (-11); in g_raid_md_ctl_ddf()
2430 size -= (size % sectorsize); in g_raid_md_ctl_ddf()
2433 size -= (size % (2 * strip)); in g_raid_md_ctl_ddf()
2435 size -= (size % strip); in g_raid_md_ctl_ddf()
2438 return (-13); in g_raid_md_ctl_ddf()
2443 ddf_vol_meta_create(&pv->pv_meta, &mdi->mdio_meta); in g_raid_md_ctl_ddf()
2444 pv->pv_started = 1; in g_raid_md_ctl_ddf()
2445 vol = g_raid_create_volume(sc, volname, -1); in g_raid_md_ctl_ddf()
2446 vol->v_md_data = pv; in g_raid_md_ctl_ddf()
2447 vol->v_raid_level = level; in g_raid_md_ctl_ddf()
2448 vol->v_raid_level_qualifier = qual; in g_raid_md_ctl_ddf()
2449 vol->v_strip_size = strip; in g_raid_md_ctl_ddf()
2450 vol->v_disks_count = numdisks; in g_raid_md_ctl_ddf()
2454 vol->v_mediasize = size * numdisks; in g_raid_md_ctl_ddf()
2456 vol->v_mediasize = size; in g_raid_md_ctl_ddf()
2460 vol->v_mediasize = size * (numdisks - 1); in g_raid_md_ctl_ddf()
2462 vol->v_mediasize = size * (numdisks - 1); in g_raid_md_ctl_ddf()
2463 vol->v_rotate_parity = 1024; in g_raid_md_ctl_ddf()
2467 vol->v_mediasize = size * (numdisks - 2); in g_raid_md_ctl_ddf()
2470 vol->v_mdf_pdisks = 2; in g_raid_md_ctl_ddf()
2472 vol->v_mdf_pdisks = 3; in g_raid_md_ctl_ddf()
2473 vol->v_mdf_polynomial = 0x11d; in g_raid_md_ctl_ddf()
2474 vol->v_mdf_method = 0x00; in g_raid_md_ctl_ddf()
2475 vol->v_mediasize = size * (numdisks - vol->v_mdf_pdisks); in g_raid_md_ctl_ddf()
2477 vol->v_mediasize = ((size * numdisks) / strip / 2) * in g_raid_md_ctl_ddf()
2480 vol->v_sectorsize = sectorsize; in g_raid_md_ctl_ddf()
2486 sd = &vol->v_subdisks[i]; in g_raid_md_ctl_ddf()
2487 sd->sd_disk = disk; in g_raid_md_ctl_ddf()
2488 sd->sd_offset = offs[i]; in g_raid_md_ctl_ddf()
2489 sd->sd_size = size; in g_raid_md_ctl_ddf()
2492 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_ctl_ddf()
2515 return (-99); in g_raid_md_ctl_ddf()
2519 if (nodename != NULL && strcasecmp(sc->sc_name, nodename) != 0) in g_raid_md_ctl_ddf()
2529 return (-4); in g_raid_md_ctl_ddf()
2532 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_ddf()
2533 if (disk->d_consumer) in g_raid_md_ctl_ddf()
2534 ddf_meta_erase(disk->d_consumer); in g_raid_md_ctl_ddf()
2540 /* Destroy specified volume. If it was last - all node. */ in g_raid_md_ctl_ddf()
2543 return (-1); in g_raid_md_ctl_ddf()
2549 return (-2); in g_raid_md_ctl_ddf()
2553 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_ctl_ddf()
2554 if (strcmp(vol->v_name, volname) == 0) in g_raid_md_ctl_ddf()
2556 pp = vol->v_provider; in g_raid_md_ctl_ddf()
2559 if (strcmp(pp->name, volname) == 0) in g_raid_md_ctl_ddf()
2561 if (strncmp(pp->name, "raid/", 5) == 0 && in g_raid_md_ctl_ddf()
2562 strcmp(pp->name + 5, volname) == 0) in g_raid_md_ctl_ddf()
2568 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_ctl_ddf()
2569 if (vol->v_global_id == i) in g_raid_md_ctl_ddf()
2576 return (-3); in g_raid_md_ctl_ddf()
2582 vol->v_provider_open != 0) { in g_raid_md_ctl_ddf()
2584 return (-4); in g_raid_md_ctl_ddf()
2589 TAILQ_FOREACH(vol1, &sc->sc_volumes, v_next) in g_raid_md_ctl_ddf()
2596 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_ddf()
2597 if (disk->d_consumer) in g_raid_md_ctl_ddf()
2598 ddf_meta_erase(disk->d_consumer); in g_raid_md_ctl_ddf()
2608 return (-1); in g_raid_md_ctl_ddf()
2615 error = -2; in g_raid_md_ctl_ddf()
2621 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_ddf()
2622 if (disk->d_consumer != NULL && in g_raid_md_ctl_ddf()
2623 disk->d_consumer->provider != NULL && in g_raid_md_ctl_ddf()
2624 strcmp(disk->d_consumer->provider->name, in g_raid_md_ctl_ddf()
2631 error = -3; in g_raid_md_ctl_ddf()
2641 ddf_meta_erase(disk->d_consumer); in g_raid_md_ctl_ddf()
2650 if (g_raid_ndisks(sc, -1) == 0) in g_raid_md_ctl_ddf()
2659 return (-1); in g_raid_md_ctl_ddf()
2667 error = -3; in g_raid_md_ctl_ddf()
2678 error = -4; in g_raid_md_ctl_ddf()
2681 pp = cp->provider; in g_raid_md_ctl_ddf()
2687 disk->d_consumer = cp; in g_raid_md_ctl_ddf()
2688 disk->d_md_data = (void *)pd; in g_raid_md_ctl_ddf()
2689 cp->private = disk; in g_raid_md_ctl_ddf()
2695 ddf_meta_create(disk, &mdi->mdio_meta); in g_raid_md_ctl_ddf()
2696 sa = ddf_meta_find_sa(&pd->pd_meta, 1); in g_raid_md_ctl_ddf()
2698 SET32D(&pd->pd_meta, sa->Signature, in g_raid_md_ctl_ddf()
2700 SET8D(&pd->pd_meta, sa->Spare_Type, 0); in g_raid_md_ctl_ddf()
2701 SET16D(&pd->pd_meta, sa->Populated_SAEs, 0); in g_raid_md_ctl_ddf()
2702 SET16D(&pd->pd_meta, sa->MAX_SAE_Supported, in g_raid_md_ctl_ddf()
2703 (GET16(&pd->pd_meta, hdr->Configuration_Record_Length) * in g_raid_md_ctl_ddf()
2704 pd->pd_meta.sectorsize - in g_raid_md_ctl_ddf()
2708 if (mdi->mdio_meta.hdr == NULL) in g_raid_md_ctl_ddf()
2709 ddf_meta_copy(&mdi->mdio_meta, &pd->pd_meta); in g_raid_md_ctl_ddf()
2711 ddf_meta_update(&mdi->mdio_meta, &pd->pd_meta); in g_raid_md_ctl_ddf()
2717 return (-100); in g_raid_md_ctl_ddf()
2730 struct g_raid_md_ddf_object *mdi; in g_raid_md_write_ddf() local
2738 sc = md->mdo_softc; in g_raid_md_write_ddf()
2739 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_write_ddf()
2740 gmeta = &mdi->mdio_meta; in g_raid_md_write_ddf()
2742 if (sc->sc_stopping == G_RAID_DESTROY_HARD) in g_raid_md_write_ddf()
2750 if (mdi->mdio_starting == 0) { in g_raid_md_write_ddf()
2751 for (i = 0; i < GET16(gmeta, pdr->Populated_PDEs); i++) { in g_raid_md_write_ddf()
2752 if (isff(gmeta->pdr->entry[i].PD_GUID, 24)) in g_raid_md_write_ddf()
2754 SET16(gmeta, pdr->entry[i].PD_Type, in g_raid_md_write_ddf()
2755 GET16(gmeta, pdr->entry[i].PD_Type) & in g_raid_md_write_ddf()
2758 if ((GET16(gmeta, pdr->entry[i].PD_State) & in g_raid_md_write_ddf()
2760 SET16(gmeta, pdr->entry[i].PD_State, 0); in g_raid_md_write_ddf()
2764 /* Generate/update new per-volume metadata. */ in g_raid_md_write_ddf()
2765 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_write_ddf()
2766 pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; in g_raid_md_write_ddf()
2767 if (vol->v_stopping || !pv->pv_started) in g_raid_md_write_ddf()
2769 vmeta = &pv->pv_meta; in g_raid_md_write_ddf()
2771 SET32(vmeta, vdc->Sequence_Number, in g_raid_md_write_ddf()
2772 GET32(vmeta, vdc->Sequence_Number) + 1); in g_raid_md_write_ddf()
2773 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E && in g_raid_md_write_ddf()
2774 vol->v_disks_count % 2 == 0) in g_raid_md_write_ddf()
2775 SET16(vmeta, vdc->Primary_Element_Count, 2); in g_raid_md_write_ddf()
2777 SET16(vmeta, vdc->Primary_Element_Count, in g_raid_md_write_ddf()
2778 vol->v_disks_count); in g_raid_md_write_ddf()
2779 SET8(vmeta, vdc->Stripe_Size, in g_raid_md_write_ddf()
2780 ffs(vol->v_strip_size / vol->v_sectorsize) - 1); in g_raid_md_write_ddf()
2781 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E && in g_raid_md_write_ddf()
2782 vol->v_disks_count % 2 == 0) { in g_raid_md_write_ddf()
2783 SET8(vmeta, vdc->Primary_RAID_Level, in g_raid_md_write_ddf()
2785 SET8(vmeta, vdc->RLQ, 0); in g_raid_md_write_ddf()
2786 SET8(vmeta, vdc->Secondary_Element_Count, in g_raid_md_write_ddf()
2787 vol->v_disks_count / 2); in g_raid_md_write_ddf()
2788 SET8(vmeta, vdc->Secondary_RAID_Level, 0); in g_raid_md_write_ddf()
2790 SET8(vmeta, vdc->Primary_RAID_Level, in g_raid_md_write_ddf()
2791 vol->v_raid_level); in g_raid_md_write_ddf()
2792 SET8(vmeta, vdc->RLQ, in g_raid_md_write_ddf()
2793 vol->v_raid_level_qualifier); in g_raid_md_write_ddf()
2794 SET8(vmeta, vdc->Secondary_Element_Count, 1); in g_raid_md_write_ddf()
2795 SET8(vmeta, vdc->Secondary_RAID_Level, 0); in g_raid_md_write_ddf()
2797 SET8(vmeta, vdc->Secondary_Element_Seq, 0); in g_raid_md_write_ddf()
2798 SET64(vmeta, vdc->Block_Count, 0); in g_raid_md_write_ddf()
2799 SET64(vmeta, vdc->VD_Size, vol->v_mediasize / vol->v_sectorsize); in g_raid_md_write_ddf()
2800 SET16(vmeta, vdc->Block_Size, vol->v_sectorsize); in g_raid_md_write_ddf()
2801 SET8(vmeta, vdc->Rotate_Parity_count, in g_raid_md_write_ddf()
2802 fls(vol->v_rotate_parity) - 1); in g_raid_md_write_ddf()
2803 SET8(vmeta, vdc->MDF_Parity_Disks, vol->v_mdf_pdisks); in g_raid_md_write_ddf()
2804 SET16(vmeta, vdc->MDF_Parity_Generator_Polynomial, in g_raid_md_write_ddf()
2805 vol->v_mdf_polynomial); in g_raid_md_write_ddf()
2806 SET8(vmeta, vdc->MDF_Constant_Generation_Method, in g_raid_md_write_ddf()
2807 vol->v_mdf_method); in g_raid_md_write_ddf()
2809 SET16(vmeta, vde->VD_Number, vol->v_global_id); in g_raid_md_write_ddf()
2810 if (vol->v_state <= G_RAID_VOLUME_S_BROKEN) in g_raid_md_write_ddf()
2811 SET8(vmeta, vde->VD_State, DDF_VDE_FAILED); in g_raid_md_write_ddf()
2812 else if (vol->v_state <= G_RAID_VOLUME_S_DEGRADED) in g_raid_md_write_ddf()
2813 SET8(vmeta, vde->VD_State, DDF_VDE_DEGRADED); in g_raid_md_write_ddf()
2814 else if (vol->v_state <= G_RAID_VOLUME_S_SUBOPTIMAL) in g_raid_md_write_ddf()
2815 SET8(vmeta, vde->VD_State, DDF_VDE_PARTIAL); in g_raid_md_write_ddf()
2817 SET8(vmeta, vde->VD_State, DDF_VDE_OPTIMAL); in g_raid_md_write_ddf()
2818 if (vol->v_dirty || in g_raid_md_write_ddf()
2821 SET8(vmeta, vde->VD_State, in g_raid_md_write_ddf()
2822 GET8(vmeta, vde->VD_State) | DDF_VDE_DIRTY); in g_raid_md_write_ddf()
2823 SET8(vmeta, vde->Init_State, DDF_VDE_INIT_FULL); // XXX in g_raid_md_write_ddf()
2824 ddf_meta_put_name(vmeta, vol->v_name); in g_raid_md_write_ddf()
2826 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_write_ddf()
2827 sd = &vol->v_subdisks[i]; in g_raid_md_write_ddf()
2828 bvd = i / GET16(vmeta, vdc->Primary_Element_Count); in g_raid_md_write_ddf()
2829 pos = i % GET16(vmeta, vdc->Primary_Element_Count); in g_raid_md_write_ddf()
2830 disk = sd->sd_disk; in g_raid_md_write_ddf()
2832 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_write_ddf()
2833 if (vmeta->bvdc[bvd] == NULL) { in g_raid_md_write_ddf()
2835 hdr->Configuration_Record_Length) * in g_raid_md_write_ddf()
2836 vmeta->sectorsize; in g_raid_md_write_ddf()
2837 vmeta->bvdc[bvd] = malloc(size, in g_raid_md_write_ddf()
2839 memset(vmeta->bvdc[bvd], 0xff, size); in g_raid_md_write_ddf()
2841 memcpy(vmeta->bvdc[bvd], vmeta->vdc, in g_raid_md_write_ddf()
2843 SET8(vmeta, bvdc[bvd]->Secondary_Element_Seq, bvd); in g_raid_md_write_ddf()
2844 SET64(vmeta, bvdc[bvd]->Block_Count, in g_raid_md_write_ddf()
2845 sd->sd_size / vol->v_sectorsize); in g_raid_md_write_ddf()
2846 SET32(vmeta, bvdc[bvd]->Physical_Disk_Sequence[pos], in g_raid_md_write_ddf()
2847 GET32(&pd->pd_meta, pdd->PD_Reference)); in g_raid_md_write_ddf()
2848 val2 = (uint64_t *)&(vmeta->bvdc[bvd]->Physical_Disk_Sequence[ in g_raid_md_write_ddf()
2849 GET16(vmeta, hdr->Max_Primary_Element_Entries)]); in g_raid_md_write_ddf()
2851 sd->sd_offset / vol->v_sectorsize); in g_raid_md_write_ddf()
2853 if (vmeta->bvdc[bvd] == NULL) in g_raid_md_write_ddf()
2857 GET32(vmeta, bvdc[bvd]->Physical_Disk_Sequence[pos])); in g_raid_md_write_ddf()
2860 SET16(gmeta, pdr->entry[j].PD_Type, in g_raid_md_write_ddf()
2861 GET16(gmeta, pdr->entry[j].PD_Type) | in g_raid_md_write_ddf()
2863 if (sd->sd_state == G_RAID_SUBDISK_S_NONE) in g_raid_md_write_ddf()
2864 SET16(gmeta, pdr->entry[j].PD_State, in g_raid_md_write_ddf()
2865 GET16(gmeta, pdr->entry[j].PD_State) | in g_raid_md_write_ddf()
2867 else if (sd->sd_state == G_RAID_SUBDISK_S_FAILED) in g_raid_md_write_ddf()
2868 SET16(gmeta, pdr->entry[j].PD_State, in g_raid_md_write_ddf()
2869 GET16(gmeta, pdr->entry[j].PD_State) | in g_raid_md_write_ddf()
2871 else if (sd->sd_state <= G_RAID_SUBDISK_S_REBUILD) in g_raid_md_write_ddf()
2872 SET16(gmeta, pdr->entry[j].PD_State, in g_raid_md_write_ddf()
2873 GET16(gmeta, pdr->entry[j].PD_State) | in g_raid_md_write_ddf()
2876 SET16(gmeta, pdr->entry[j].PD_State, in g_raid_md_write_ddf()
2877 GET16(gmeta, pdr->entry[j].PD_State) | in g_raid_md_write_ddf()
2883 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_write_ddf()
2884 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_write_ddf()
2886 GET32(&pd->pd_meta, pdd->PD_Reference)); in g_raid_md_write_ddf()
2889 if (disk->d_state == G_RAID_DISK_S_FAILED) { in g_raid_md_write_ddf()
2890 SET16(gmeta, pdr->entry[i].PD_State, in g_raid_md_write_ddf()
2891 GET16(gmeta, pdr->entry[i].PD_State) | in g_raid_md_write_ddf()
2894 if (disk->d_state != G_RAID_DISK_S_SPARE) in g_raid_md_write_ddf()
2896 sa = ddf_meta_find_sa(&pd->pd_meta, 0); in g_raid_md_write_ddf()
2898 (GET8D(&pd->pd_meta, sa->Spare_Type) & in g_raid_md_write_ddf()
2900 SET16(gmeta, pdr->entry[i].PD_Type, in g_raid_md_write_ddf()
2901 GET16(gmeta, pdr->entry[i].PD_Type) | in g_raid_md_write_ddf()
2904 SET16(gmeta, pdr->entry[i].PD_Type, in g_raid_md_write_ddf()
2905 GET16(gmeta, pdr->entry[i].PD_Type) | in g_raid_md_write_ddf()
2908 SET16(gmeta, pdr->entry[i].PD_State, in g_raid_md_write_ddf()
2909 GET16(gmeta, pdr->entry[i].PD_State) | in g_raid_md_write_ddf()
2914 for (i = 0, j = -1; i < GET16(gmeta, pdr->Populated_PDEs); i++) { in g_raid_md_write_ddf()
2915 if (isff(gmeta->pdr->entry[i].PD_GUID, 24)) in g_raid_md_write_ddf()
2917 if ((GET16(gmeta, pdr->entry[i].PD_Type) & in g_raid_md_write_ddf()
2921 NULL, GET32(gmeta, pdr->entry[i].PD_Reference)) != NULL) in g_raid_md_write_ddf()
2924 memset(&gmeta->pdr->entry[i], 0xff, in g_raid_md_write_ddf()
2927 SET16(gmeta, pdr->Populated_PDEs, j + 1); in g_raid_md_write_ddf()
2929 /* Update per-disk metadata and write them. */ in g_raid_md_write_ddf()
2930 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_write_ddf()
2931 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_write_ddf()
2932 if (disk->d_state != G_RAID_DISK_S_ACTIVE && in g_raid_md_write_ddf()
2933 disk->d_state != G_RAID_DISK_S_SPARE) in g_raid_md_write_ddf()
2936 memcpy(pd->pd_meta.pdr, gmeta->pdr, in g_raid_md_write_ddf()
2937 GET32(&pd->pd_meta, hdr->pdr_length) * in g_raid_md_write_ddf()
2938 pd->pd_meta.sectorsize); in g_raid_md_write_ddf()
2940 SET16(&pd->pd_meta, vdr->Populated_VDEs, 0); in g_raid_md_write_ddf()
2941 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_write_ddf()
2942 if (vol->v_stopping) in g_raid_md_write_ddf()
2944 pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; in g_raid_md_write_ddf()
2945 i = ddf_meta_find_vd(&pd->pd_meta, in g_raid_md_write_ddf()
2946 pv->pv_meta.vde->VD_GUID); in g_raid_md_write_ddf()
2948 i = ddf_meta_find_vd(&pd->pd_meta, NULL); in g_raid_md_write_ddf()
2950 memcpy(&pd->pd_meta.vdr->entry[i], in g_raid_md_write_ddf()
2951 pv->pv_meta.vde, in g_raid_md_write_ddf()
2955 if (mdi->mdio_starting == 0) { in g_raid_md_write_ddf()
2957 j = GETCRNUM(&pd->pd_meta); in g_raid_md_write_ddf()
2959 vdc = GETVDCPTR(&pd->pd_meta, i); in g_raid_md_write_ddf()
2960 if (GET32D(&pd->pd_meta, vdc->Signature) != in g_raid_md_write_ddf()
2963 SET32D(&pd->pd_meta, vdc->Signature, 0xffffffff); in g_raid_md_write_ddf()
2966 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_write_ddf()
2967 vol = sd->sd_volume; in g_raid_md_write_ddf()
2968 if (vol->v_stopping) in g_raid_md_write_ddf()
2970 pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; in g_raid_md_write_ddf()
2971 vmeta = &pv->pv_meta; in g_raid_md_write_ddf()
2972 vdc = ddf_meta_find_vdc(&pd->pd_meta, in g_raid_md_write_ddf()
2973 vmeta->vde->VD_GUID); in g_raid_md_write_ddf()
2975 vdc = ddf_meta_find_vdc(&pd->pd_meta, NULL); in g_raid_md_write_ddf()
2977 bvd = sd->sd_pos / GET16(vmeta, in g_raid_md_write_ddf()
2978 vdc->Primary_Element_Count); in g_raid_md_write_ddf()
2979 memcpy(vdc, vmeta->bvdc[bvd], in g_raid_md_write_ddf()
2980 GET16(&pd->pd_meta, in g_raid_md_write_ddf()
2981 hdr->Configuration_Record_Length) * in g_raid_md_write_ddf()
2982 pd->pd_meta.sectorsize); in g_raid_md_write_ddf()
2987 g_raid_md_ddf_print(&pd->pd_meta); in g_raid_md_write_ddf()
2988 ddf_meta_write(disk->d_consumer, &pd->pd_meta); in g_raid_md_write_ddf()
3002 sc = md->mdo_softc; in g_raid_md_fail_disk_ddf()
3003 pd = (struct g_raid_md_ddf_perdisk *)tdisk->d_md_data; in g_raid_md_fail_disk_ddf()
3006 if (tdisk->d_state != G_RAID_DISK_S_ACTIVE) in g_raid_md_fail_disk_ddf()
3007 return (-1); in g_raid_md_fail_disk_ddf()
3015 i = ddf_meta_find_pd(&pd->pd_meta, NULL, GET32(&pd->pd_meta, pdd->PD_Reference)); in g_raid_md_fail_disk_ddf()
3016 SET16(&pd->pd_meta, pdr->entry[i].PD_State, DDF_PDE_FAILED | DDF_PDE_PFA); in g_raid_md_fail_disk_ddf()
3017 if (tdisk->d_consumer != NULL) in g_raid_md_fail_disk_ddf()
3018 ddf_meta_write(tdisk->d_consumer, &pd->pd_meta); in g_raid_md_fail_disk_ddf()
3022 TAILQ_FOREACH(sd, &tdisk->d_subdisks, sd_next) { in g_raid_md_fail_disk_ddf()
3042 pd = (struct g_raid_md_ddf_perdisk *)disk->d_md_data; in g_raid_md_free_disk_ddf()
3043 ddf_meta_free(&pd->pd_meta); in g_raid_md_free_disk_ddf()
3045 disk->d_md_data = NULL; in g_raid_md_free_disk_ddf()
3053 struct g_raid_md_ddf_object *mdi; in g_raid_md_free_volume_ddf() local
3056 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_free_volume_ddf()
3057 pv = (struct g_raid_md_ddf_pervolume *)vol->v_md_data; in g_raid_md_free_volume_ddf()
3058 ddf_vol_meta_free(&pv->pv_meta); in g_raid_md_free_volume_ddf()
3059 if (!pv->pv_started) { in g_raid_md_free_volume_ddf()
3060 pv->pv_started = 1; in g_raid_md_free_volume_ddf()
3061 mdi->mdio_starting--; in g_raid_md_free_volume_ddf()
3062 callout_stop(&pv->pv_start_co); in g_raid_md_free_volume_ddf()
3065 vol->v_md_data = NULL; in g_raid_md_free_volume_ddf()
3072 struct g_raid_md_ddf_object *mdi; in g_raid_md_free_ddf() local
3074 mdi = (struct g_raid_md_ddf_object *)md; in g_raid_md_free_ddf()
3075 if (!mdi->mdio_started) { in g_raid_md_free_ddf()
3076 mdi->mdio_started = 0; in g_raid_md_free_ddf()
3077 callout_stop(&mdi->mdio_start_co); in g_raid_md_free_ddf()
3078 G_RAID_DEBUG1(1, md->mdo_softc, in g_raid_md_free_ddf()
3079 "root_mount_rel %p", mdi->mdio_rootmount); in g_raid_md_free_ddf()
3080 root_mount_rel(mdi->mdio_rootmount); in g_raid_md_free_ddf()
3081 mdi->mdio_rootmount = NULL; in g_raid_md_free_ddf()
3083 ddf_meta_free(&mdi->mdio_meta); in g_raid_md_free_ddf()