Lines Matching +full:pd +full:- +full:node
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2000 - 2008 Søren Schmidt <sos@FreeBSD.org>
122 uint64_t rebuild_lba64; /* Per-volume rebuild position. */
198 printf("promise_id <%.24s>\n", meta->promise_id); in g_raid_md_promise_print()
200 meta->disk.flags, meta->disk.number, meta->disk.channel, in g_raid_md_promise_print()
201 meta->disk.device, meta->disk.id); in g_raid_md_promise_print()
202 printf("disk_offset %u\n", meta->disk_offset); in g_raid_md_promise_print()
203 printf("disk_sectors %u\n", meta->disk_sectors); in g_raid_md_promise_print()
204 printf("disk_rebuild %u\n", meta->disk_rebuild); in g_raid_md_promise_print()
205 printf("generation %u\n", meta->generation); in g_raid_md_promise_print()
206 printf("status 0x%02x\n", meta->status); in g_raid_md_promise_print()
207 printf("type %u\n", meta->type); in g_raid_md_promise_print()
208 printf("total_disks %u\n", meta->total_disks); in g_raid_md_promise_print()
209 printf("stripe_shift %u\n", meta->stripe_shift); in g_raid_md_promise_print()
210 printf("array_width %u\n", meta->array_width); in g_raid_md_promise_print()
211 printf("array_number %u\n", meta->array_number); in g_raid_md_promise_print()
212 printf("total_sectors %u\n", meta->total_sectors); in g_raid_md_promise_print()
213 printf("cylinders %u\n", meta->cylinders); in g_raid_md_promise_print()
214 printf("heads %u\n", meta->heads); in g_raid_md_promise_print()
215 printf("sectors %u\n", meta->sectors); in g_raid_md_promise_print()
216 printf("volume_id 0x%016jx\n", meta->volume_id); in g_raid_md_promise_print()
220 meta->disks[i].flags, meta->disks[i].number, in g_raid_md_promise_print()
221 meta->disks[i].channel, meta->disks[i].device, in g_raid_md_promise_print()
222 meta->disks[i].id); in g_raid_md_promise_print()
224 printf("name <%.32s>\n", meta->name); in g_raid_md_promise_print()
225 printf("magic_3 0x%08x\n", meta->magic_3); in g_raid_md_promise_print()
226 printf("rebuild_lba64 %ju\n", meta->rebuild_lba64); in g_raid_md_promise_print()
227 printf("magic_4 0x%08x\n", meta->magic_4); in g_raid_md_promise_print()
228 printf("magic_5 0x%08x\n", meta->magic_5); in g_raid_md_promise_print()
229 printf("total_sectors_high 0x%08x\n", meta->total_sectors_high); in g_raid_md_promise_print()
230 printf("sector_size %u\n", meta->sector_size); in g_raid_md_promise_print()
231 printf("backup_time %d\n", meta->backup_time); in g_raid_md_promise_print()
232 printf("disk_offset_high 0x%08x\n", meta->disk_offset_high); in g_raid_md_promise_print()
233 printf("disk_sectors_high 0x%08x\n", meta->disk_sectors_high); in g_raid_md_promise_print()
234 printf("disk_rebuild_high 0x%08x\n", meta->disk_rebuild_high); in g_raid_md_promise_print()
253 for (pos = 0; pos < meta->total_disks; pos++) { in promise_meta_find_disk()
254 if (meta->disks[pos].id == id) in promise_meta_find_disk()
257 return (-1); in promise_meta_find_disk()
267 sectors -= 131072; in promise_meta_unused_range()
275 tmp = ((off_t)metaarr[j]->disk_offset_high << 32) + in promise_meta_unused_range()
276 metaarr[j]->disk_offset; in promise_meta_unused_range()
278 csize = MIN(csize, tmp - coff); in promise_meta_unused_range()
286 coff = ((off_t)metaarr[i]->disk_offset_high << 32) + in promise_meta_unused_range()
287 metaarr[i]->disk_offset + in promise_meta_unused_range()
288 ((off_t)metaarr[i]->disk_sectors_high << 32) + in promise_meta_unused_range()
289 metaarr[i]->disk_sectors; in promise_meta_unused_range()
290 csize = sectors - coff; in promise_meta_unused_range()
301 if (md_disk_pos >= 0 && vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) { in promise_meta_translate_disk()
302 width = vol->v_disks_count / 2; in promise_meta_translate_disk()
315 strncpy(buf, meta->name, 32); in promise_meta_get_name()
317 for (i = 31; i >= 0; i--) { in promise_meta_get_name()
328 memset(meta->name, 0x20, 32); in promise_meta_put_name()
329 memcpy(meta->name, buf, MIN(strlen(buf), 32)); in promise_meta_put_name()
341 pp = cp->provider; in promise_meta_read()
344 if (pp->sectorsize * 4 < sizeof(*meta)) in promise_meta_read()
346 if (pp->sectorsize * 4 > maxphys) { in promise_meta_read()
347 G_RAID_DEBUG(1, "%s: Blocksize is too big.", pp->name); in promise_meta_read()
352 buf = g_read_data(cp, pp->mediasize - pp->sectorsize * in promise_meta_read()
353 (63 - subdisks * PROMISE_META_OFFSET), in promise_meta_read()
354 pp->sectorsize * 4, &error); in promise_meta_read()
357 pp->name, error); in promise_meta_read()
363 if (strncmp(meta->promise_id, PROMISE_MAGIC, strlen(PROMISE_MAGIC)) && in promise_meta_read()
364 strncmp(meta->promise_id, FREEBSD_MAGIC, strlen(FREEBSD_MAGIC))) { in promise_meta_read()
367 "Promise signature check failed on %s", pp->name); in promise_meta_read()
372 memcpy(meta, buf, MIN(sizeof(*meta), pp->sectorsize * 4)); in promise_meta_read()
378 if (checksum != meta->checksum) { in promise_meta_read()
379 G_RAID_DEBUG(1, "Promise checksum check failed on %s", pp->name); in promise_meta_read()
384 if ((meta->integrity & PROMISE_I_VALID) == 0) { in promise_meta_read()
385 G_RAID_DEBUG(1, "Promise metadata is invalid on %s", pp->name); in promise_meta_read()
390 if (meta->total_disks > PROMISE_MAX_DISKS) { in promise_meta_read()
392 pp->name, meta->total_disks); in promise_meta_read()
398 if (meta->disk_offset_high == 0x8b8c8d8e && in promise_meta_read()
399 meta->disk_sectors_high == 0x8788898a && in promise_meta_read()
400 meta->disk_rebuild_high == 0x83848586) { in promise_meta_read()
401 meta->disk_offset_high = 0; in promise_meta_read()
402 meta->disk_sectors_high = 0; in promise_meta_read()
403 if (meta->disk_rebuild == UINT32_MAX) in promise_meta_read()
404 meta->disk_rebuild_high = UINT32_MAX; in promise_meta_read()
406 meta->disk_rebuild_high = 0; in promise_meta_read()
407 if (meta->total_sectors_high == 0x15161718) { in promise_meta_read()
408 meta->total_sectors_high = 0; in promise_meta_read()
409 meta->backup_time = 0; in promise_meta_read()
410 if (meta->rebuild_lba64 == 0x2122232425262728) in promise_meta_read()
411 meta->rebuild_lba64 = UINT64_MAX; in promise_meta_read()
414 if (meta->sector_size < 1 || meta->sector_size > 8) in promise_meta_read()
415 meta->sector_size = 1; in promise_meta_read()
438 pp = cp->provider; in promise_meta_write()
442 buf = malloc(pp->sectorsize * 4, M_MD_PROMISE, M_WAITOK | M_ZERO); in promise_meta_write()
447 cp->provider->mediasize / cp->provider->sectorsize, in promise_meta_write()
451 memcpy(&meta->promise_id[0], PROMISE_MAGIC, in promise_meta_write()
452 sizeof(PROMISE_MAGIC) - 1); in promise_meta_write()
453 meta->dummy_0 = 0x00020000; in promise_meta_write()
454 meta->integrity = PROMISE_I_VALID; in promise_meta_write()
455 meta->disk.flags = PROMISE_F_ONLINE | PROMISE_F_VALID; in promise_meta_write()
456 meta->disk.number = 0xff; in promise_meta_write()
457 arc4rand(&meta->disk.id, sizeof(meta->disk.id), 0); in promise_meta_write()
458 meta->disk_offset_high = off >> 32; in promise_meta_write()
459 meta->disk_offset = (uint32_t)off; in promise_meta_write()
460 meta->disk_sectors_high = size >> 32; in promise_meta_write()
461 meta->disk_sectors = (uint32_t)size; in promise_meta_write()
462 meta->disk_rebuild_high = UINT32_MAX; in promise_meta_write()
463 meta->disk_rebuild = UINT32_MAX; in promise_meta_write()
468 meta->checksum = 0; in promise_meta_write()
471 meta->checksum = checksum; in promise_meta_write()
472 memcpy(buf, meta, MIN(pp->sectorsize * 4, sizeof(*meta))); in promise_meta_write()
474 error = g_write_data(cp, pp->mediasize - pp->sectorsize * in promise_meta_write()
475 (63 - subdisk * PROMISE_META_OFFSET), in promise_meta_write()
476 buf, pp->sectorsize * 4); in promise_meta_write()
479 pp->name, error); in promise_meta_write()
497 pp = cp->provider; in promise_meta_erase()
498 buf = malloc(4 * pp->sectorsize, M_MD_PROMISE, M_WAITOK | M_ZERO); in promise_meta_erase()
500 error = g_write_data(cp, pp->mediasize - pp->sectorsize * in promise_meta_erase()
501 (63 - subdisk * PROMISE_META_OFFSET), in promise_meta_erase()
502 buf, 4 * pp->sectorsize); in promise_meta_erase()
505 pp->name, error); in promise_meta_erase()
520 memcpy(&meta->promise_id[0], PROMISE_MAGIC, sizeof(PROMISE_MAGIC) - 1); in promise_meta_write_spare()
521 meta->dummy_0 = 0x00020000; in promise_meta_write_spare()
522 meta->integrity = PROMISE_I_VALID; in promise_meta_write_spare()
523 meta->disk.flags = PROMISE_F_SPARE | PROMISE_F_ONLINE | PROMISE_F_VALID; in promise_meta_write_spare()
524 meta->disk.number = 0xff; in promise_meta_write_spare()
525 arc4rand(&meta->disk.id, sizeof(meta->disk.id), 0); in promise_meta_write_spare()
526 tmp = cp->provider->mediasize / cp->provider->sectorsize - 131072; in promise_meta_write_spare()
527 meta->disk_sectors_high = tmp >> 32; in promise_meta_write_spare()
528 meta->disk_sectors = (uint32_t)tmp; in promise_meta_write_spare()
529 meta->disk_rebuild_high = UINT32_MAX; in promise_meta_write_spare()
530 meta->disk_rebuild = UINT32_MAX; in promise_meta_write_spare()
542 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_promise_get_volume()
543 pv = vol->v_md_data; in g_raid_md_promise_get_volume()
544 if (pv->pv_id == id) in g_raid_md_promise_get_volume()
558 TAILQ_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tvol) { in g_raid_md_promise_purge_volumes()
559 pv = vol->v_md_data; in g_raid_md_promise_purge_volumes()
560 if (!pv->pv_started || vol->v_stopping) in g_raid_md_promise_purge_volumes()
562 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_promise_purge_volumes()
563 if (vol->v_subdisks[i].sd_state != G_RAID_SUBDISK_S_NONE) in g_raid_md_promise_purge_volumes()
566 if (i >= vol->v_disks_count) { in g_raid_md_promise_purge_volumes()
579 struct g_raid_md_promise_perdisk *pd; in g_raid_md_promise_purge_disks() local
583 TAILQ_FOREACH_SAFE(disk, &sc->sc_disks, d_next, tdisk) { in g_raid_md_promise_purge_disks()
584 if (disk->d_state == G_RAID_DISK_S_SPARE) in g_raid_md_promise_purge_disks()
586 pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; in g_raid_md_promise_purge_disks()
589 for (i = 0; i < pd->pd_subdisks; ) { in g_raid_md_promise_purge_disks()
591 pd->pd_meta[i]->volume_id); in g_raid_md_promise_purge_disks()
592 if (vol != NULL && !vol->v_stopping) { in g_raid_md_promise_purge_disks()
596 free(pd->pd_meta[i], M_MD_PROMISE); in g_raid_md_promise_purge_disks()
597 for (j = i; j < pd->pd_subdisks - 1; j++) in g_raid_md_promise_purge_disks()
598 pd->pd_meta[j] = pd->pd_meta[j + 1]; in g_raid_md_promise_purge_disks()
599 pd->pd_meta[pd->pd_subdisks - 1] = NULL; in g_raid_md_promise_purge_disks()
600 pd->pd_subdisks--; in g_raid_md_promise_purge_disks()
601 pd->pd_updated = 1; in g_raid_md_promise_purge_disks()
604 /* If there is no metadata left - erase and delete disk. */ in g_raid_md_promise_purge_disks()
605 if (pd->pd_subdisks == 0) { in g_raid_md_promise_purge_disks()
606 promise_meta_erase(disk->d_consumer); in g_raid_md_promise_purge_disks()
669 struct g_raid_md_promise_perdisk *pd; in g_raid_md_promise_start_disk() local
675 sc = disk->d_softc; in g_raid_md_promise_start_disk()
676 pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; in g_raid_md_promise_start_disk()
678 pv = vol->v_md_data; in g_raid_md_promise_start_disk()
679 meta = pv->pv_meta; in g_raid_md_promise_start_disk()
683 md_disk_pos = promise_meta_find_disk(meta, pd->pd_meta[sdn]->disk.id); in g_raid_md_promise_start_disk()
687 md_disk_pos = -1; in g_raid_md_promise_start_disk()
688 disk_pos = -1; in g_raid_md_promise_start_disk()
692 g_raid_get_diskname(disk), vol->v_name); in g_raid_md_promise_start_disk()
695 pd->pd_meta[sdn]->disk.flags & PROMISE_F_DOWN) { in g_raid_md_promise_start_disk()
699 /* If we were given specific metadata subdisk - erase it. */ in g_raid_md_promise_start_disk()
701 free(pd->pd_meta[sdn], M_MD_PROMISE); in g_raid_md_promise_start_disk()
702 for (i = sdn; i < pd->pd_subdisks - 1; i++) in g_raid_md_promise_start_disk()
703 pd->pd_meta[i] = pd->pd_meta[i + 1]; in g_raid_md_promise_start_disk()
704 pd->pd_meta[pd->pd_subdisks - 1] = NULL; in g_raid_md_promise_start_disk()
705 pd->pd_subdisks--; in g_raid_md_promise_start_disk()
708 if (!pv->pv_started) in g_raid_md_promise_start_disk()
711 * If we have already started - try to get use of the disk. in g_raid_md_promise_start_disk()
714 promise_meta_unused_range(pd->pd_meta, pd->pd_subdisks, in g_raid_md_promise_start_disk()
715 disk->d_consumer->provider->mediasize / in g_raid_md_promise_start_disk()
716 disk->d_consumer->provider->sectorsize, in g_raid_md_promise_start_disk()
724 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_promise_start_disk()
725 sd = &vol->v_subdisks[i]; in g_raid_md_promise_start_disk()
726 if (sd->sd_state != G_RAID_SUBDISK_S_NONE) in g_raid_md_promise_start_disk()
727 size = sd->sd_size; in g_raid_md_promise_start_disk()
728 if (sd->sd_state <= G_RAID_SUBDISK_S_FAILED && in g_raid_md_promise_start_disk()
730 vol->v_subdisks[i].sd_state < sd->sd_state)) in g_raid_md_promise_start_disk()
734 vol->v_raid_level != G_RAID_VOLUME_RL_CONCAT && in g_raid_md_promise_start_disk()
740 disk_pos = -1; in g_raid_md_promise_start_disk()
743 if (vol->v_raid_level != G_RAID_VOLUME_RL_CONCAT) in g_raid_md_promise_start_disk()
749 if (pd->pd_subdisks == 0) { in g_raid_md_promise_start_disk()
756 g_raid_get_diskname(disk), disk_pos, vol->v_name); in g_raid_md_promise_start_disk()
760 sd = &vol->v_subdisks[disk_pos]; in g_raid_md_promise_start_disk()
762 if (resurrection && sd->sd_disk != NULL) { in g_raid_md_promise_start_disk()
763 g_raid_change_disk_state(sd->sd_disk, in g_raid_md_promise_start_disk()
765 TAILQ_REMOVE(&sd->sd_disk->d_subdisks, in g_raid_md_promise_start_disk()
768 vol->v_subdisks[disk_pos].sd_disk = disk; in g_raid_md_promise_start_disk()
769 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_promise_start_disk()
774 else if (meta->disks[md_disk_pos].flags & PROMISE_F_DOWN) in g_raid_md_promise_start_disk()
780 sd->sd_offset = (off_t)eoff * 512; in g_raid_md_promise_start_disk()
781 sd->sd_size = (off_t)esize * 512; in g_raid_md_promise_start_disk()
783 sd->sd_offset = (((off_t)pd->pd_meta[sdn]->disk_offset_high in g_raid_md_promise_start_disk()
784 << 32) + pd->pd_meta[sdn]->disk_offset) * 512; in g_raid_md_promise_start_disk()
785 sd->sd_size = (((off_t)pd->pd_meta[sdn]->disk_sectors_high in g_raid_md_promise_start_disk()
786 << 32) + pd->pd_meta[sdn]->disk_sectors) * 512; in g_raid_md_promise_start_disk()
793 } else if (meta->disks[md_disk_pos].flags & PROMISE_F_DOWN) { in g_raid_md_promise_start_disk()
797 } else if (meta->disks[md_disk_pos].flags & PROMISE_F_REDIR) { in g_raid_md_promise_start_disk()
801 if (pd->pd_meta[sdn]->generation != meta->generation) in g_raid_md_promise_start_disk()
802 sd->sd_rebuild_pos = 0; in g_raid_md_promise_start_disk()
804 sd->sd_rebuild_pos = in g_raid_md_promise_start_disk()
805 (((off_t)pd->pd_meta[sdn]->disk_rebuild_high << 32) + in g_raid_md_promise_start_disk()
806 pd->pd_meta[sdn]->disk_rebuild) * 512; in g_raid_md_promise_start_disk()
808 } else if (!(meta->disks[md_disk_pos].flags & PROMISE_F_ONLINE)) { in g_raid_md_promise_start_disk()
812 } else if (pd->pd_meta[sdn]->generation != meta->generation || in g_raid_md_promise_start_disk()
813 (meta->status & PROMISE_S_MARKED)) { in g_raid_md_promise_start_disk()
835 struct g_raid_md_promise_perdisk *pd; in g_raid_md_promise_refill() local
839 md = sc->sc_md; in g_raid_md_promise_refill()
842 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_promise_refill()
843 pv = vol->v_md_data; in g_raid_md_promise_refill()
844 if (!pv->pv_started || vol->v_stopping) in g_raid_md_promise_refill()
849 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_promise_refill()
850 sd = &vol->v_subdisks[i]; in g_raid_md_promise_refill()
851 if (sd->sd_state == G_RAID_SUBDISK_S_NONE || in g_raid_md_promise_refill()
852 sd->sd_state == G_RAID_SUBDISK_S_FAILED) in g_raid_md_promise_refill()
859 "trying to refill.", vol->v_name); in g_raid_md_promise_refill()
861 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_promise_refill()
863 if (disk->d_state < G_RAID_DISK_S_SPARE) in g_raid_md_promise_refill()
866 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_promise_refill()
867 sd = &vol->v_subdisks[i]; in g_raid_md_promise_refill()
868 if (sd->sd_disk == disk) in g_raid_md_promise_refill()
871 if (i < vol->v_disks_count) in g_raid_md_promise_refill()
875 pd = disk->d_md_data; in g_raid_md_promise_refill()
876 if (pd->pd_subdisks < PROMISE_MAX_SUBDISKS) { in g_raid_md_promise_refill()
878 g_raid_md_promise_start_disk(disk, -1, vol); in g_raid_md_promise_refill()
899 struct g_raid_md_promise_perdisk *pd; in g_raid_md_promise_start() local
904 sc = vol->v_softc; in g_raid_md_promise_start()
905 md = sc->sc_md; in g_raid_md_promise_start()
906 pv = vol->v_md_data; in g_raid_md_promise_start()
907 meta = pv->pv_meta; in g_raid_md_promise_start()
909 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE; in g_raid_md_promise_start()
910 if (meta->type == PROMISE_T_RAID0) in g_raid_md_promise_start()
911 vol->v_raid_level = G_RAID_VOLUME_RL_RAID0; in g_raid_md_promise_start()
912 else if (meta->type == PROMISE_T_RAID1) { in g_raid_md_promise_start()
913 if (meta->array_width == 1) in g_raid_md_promise_start()
914 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1; in g_raid_md_promise_start()
916 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; in g_raid_md_promise_start()
917 } else if (meta->type == PROMISE_T_RAID3) in g_raid_md_promise_start()
918 vol->v_raid_level = G_RAID_VOLUME_RL_RAID3; in g_raid_md_promise_start()
919 else if (meta->type == PROMISE_T_RAID5) { in g_raid_md_promise_start()
920 vol->v_raid_level = G_RAID_VOLUME_RL_RAID5; in g_raid_md_promise_start()
921 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_R5LA; in g_raid_md_promise_start()
922 } else if (meta->type == PROMISE_T_SPAN) in g_raid_md_promise_start()
923 vol->v_raid_level = G_RAID_VOLUME_RL_CONCAT; in g_raid_md_promise_start()
924 else if (meta->type == PROMISE_T_JBOD) in g_raid_md_promise_start()
925 vol->v_raid_level = G_RAID_VOLUME_RL_SINGLE; in g_raid_md_promise_start()
927 vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; in g_raid_md_promise_start()
928 vol->v_strip_size = 512 << meta->stripe_shift; //ZZZ in g_raid_md_promise_start()
929 vol->v_disks_count = meta->total_disks; in g_raid_md_promise_start()
930 vol->v_mediasize = (off_t)meta->total_sectors * 512; //ZZZ in g_raid_md_promise_start()
931 if (meta->total_sectors_high < 256) /* If value looks sane. */ in g_raid_md_promise_start()
932 vol->v_mediasize += in g_raid_md_promise_start()
933 ((off_t)meta->total_sectors_high << 32) * 512; //ZZZ in g_raid_md_promise_start()
934 vol->v_sectorsize = 512 * meta->sector_size; in g_raid_md_promise_start()
935 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_promise_start()
936 sd = &vol->v_subdisks[i]; in g_raid_md_promise_start()
937 sd->sd_offset = (((off_t)meta->disk_offset_high << 32) + in g_raid_md_promise_start()
938 meta->disk_offset) * 512; in g_raid_md_promise_start()
939 sd->sd_size = (((off_t)meta->disk_sectors_high << 32) + in g_raid_md_promise_start()
940 meta->disk_sectors) * 512; in g_raid_md_promise_start()
945 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_promise_start()
946 pd = disk->d_md_data; in g_raid_md_promise_start()
947 for (i = 0; i < pd->pd_subdisks; i++) { in g_raid_md_promise_start()
948 if (pd->pd_meta[i]->volume_id == meta->volume_id) in g_raid_md_promise_start()
953 pv->pv_started = 1; in g_raid_md_promise_start()
954 callout_stop(&pv->pv_start_co); in g_raid_md_promise_start()
972 pv = vol->v_md_data; in g_raid_promise_go()
973 sc = vol->v_softc; in g_raid_promise_go()
974 if (!pv->pv_started) { in g_raid_promise_go()
987 struct g_raid_md_promise_perdisk *pd; in g_raid_md_promise_new_disk() local
993 sc = disk->d_softc; in g_raid_md_promise_new_disk()
994 md = sc->sc_md; in g_raid_md_promise_new_disk()
995 pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; in g_raid_md_promise_new_disk()
997 if (pd->pd_subdisks == 0) { in g_raid_md_promise_new_disk()
1003 for (i = 0; i < pd->pd_subdisks; i++) { in g_raid_md_promise_new_disk()
1004 pdmeta = pd->pd_meta[i]; in g_raid_md_promise_new_disk()
1007 vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); in g_raid_md_promise_new_disk()
1010 vol = g_raid_create_volume(sc, buf, pdmeta->array_number); in g_raid_md_promise_new_disk()
1012 pv->pv_id = pdmeta->volume_id; in g_raid_md_promise_new_disk()
1013 vol->v_md_data = pv; in g_raid_md_promise_new_disk()
1014 callout_init(&pv->pv_start_co, 1); in g_raid_md_promise_new_disk()
1015 callout_reset(&pv->pv_start_co, in g_raid_md_promise_new_disk()
1019 pv = vol->v_md_data; in g_raid_md_promise_new_disk()
1021 /* If we haven't started yet - check metadata freshness. */ in g_raid_md_promise_new_disk()
1022 if (pv->pv_meta == NULL || !pv->pv_started) { in g_raid_md_promise_new_disk()
1023 if (pv->pv_meta == NULL || in g_raid_md_promise_new_disk()
1024 ((int16_t)(pdmeta->generation - pv->pv_generation)) > 0) { in g_raid_md_promise_new_disk()
1026 if (pv->pv_meta != NULL) in g_raid_md_promise_new_disk()
1027 free(pv->pv_meta, M_MD_PROMISE); in g_raid_md_promise_new_disk()
1028 pv->pv_meta = promise_meta_copy(pdmeta); in g_raid_md_promise_new_disk()
1029 pv->pv_generation = pv->pv_meta->generation; in g_raid_md_promise_new_disk()
1030 pv->pv_disks_present = 1; in g_raid_md_promise_new_disk()
1031 } else if (pdmeta->generation == pv->pv_generation) { in g_raid_md_promise_new_disk()
1032 pv->pv_disks_present++; in g_raid_md_promise_new_disk()
1034 pv->pv_disks_present, in g_raid_md_promise_new_disk()
1035 pv->pv_meta->total_disks); in g_raid_md_promise_new_disk()
1042 for (i = 0; i < pd->pd_subdisks; i++) { in g_raid_md_promise_new_disk()
1043 pdmeta = pd->pd_meta[i]; in g_raid_md_promise_new_disk()
1046 vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); in g_raid_md_promise_new_disk()
1049 pv = vol->v_md_data; in g_raid_md_promise_new_disk()
1051 if (pv->pv_started) { in g_raid_md_promise_new_disk()
1055 /* If we collected all needed disks - start array. */ in g_raid_md_promise_new_disk()
1056 if (pv->pv_disks_present == pv->pv_meta->total_disks) in g_raid_md_promise_new_disk()
1069 /* Search for existing node. */ in g_raid_md_create_promise()
1070 LIST_FOREACH(geom, &mp->geom, geom) { in g_raid_md_create_promise()
1071 sc = geom->softc; in g_raid_md_create_promise()
1074 if (sc->sc_stopping != 0) in g_raid_md_create_promise()
1076 if (sc->sc_md->mdo_class != md->mdo_class) in g_raid_md_create_promise()
1089 md->mdo_softc = sc; in g_raid_md_create_promise()
1090 *gp = sc->sc_geom; in g_raid_md_create_promise()
1103 struct g_raid_md_promise_perdisk *pd; in g_raid_md_taste_promise() local
1109 G_RAID_DEBUG(1, "Tasting Promise on %s", cp->provider->name); in g_raid_md_taste_promise()
1110 pp = cp->provider; in g_raid_md_taste_promise()
1116 if (pp->geom->rank == 1) in g_raid_md_taste_promise()
1142 if (metaarr[i]->disk.flags & PROMISE_F_ASSIGNED) { in g_raid_md_taste_promise()
1147 for (j = i; j < subdisks - 1; j++) in g_raid_md_taste_promise()
1149 metaarr[subdisks - 1] = NULL; in g_raid_md_taste_promise()
1150 subdisks--; in g_raid_md_taste_promise()
1154 /* Search for matching node. */ in g_raid_md_taste_promise()
1156 LIST_FOREACH(geom, &mp->geom, geom) { in g_raid_md_taste_promise()
1157 sc = geom->softc; in g_raid_md_taste_promise()
1160 if (sc->sc_stopping != 0) in g_raid_md_taste_promise()
1162 if (sc->sc_md->mdo_class != md->mdo_class) in g_raid_md_taste_promise()
1167 /* Found matching node. */ in g_raid_md_taste_promise()
1169 G_RAID_DEBUG(1, "Found matching array %s", sc->sc_name); in g_raid_md_taste_promise()
1172 } else { /* Not found matching node -- create one. */ in g_raid_md_taste_promise()
1176 md->mdo_softc = sc; in g_raid_md_taste_promise()
1177 geom = sc->sc_geom; in g_raid_md_taste_promise()
1181 g_access(cp, -1, 0, 0); in g_raid_md_taste_promise()
1184 rcp->flags |= G_CF_DIRECT_RECEIVE; in g_raid_md_taste_promise()
1190 sx_xlock(&sc->sc_lock); in g_raid_md_taste_promise()
1192 pd = malloc(sizeof(*pd), M_MD_PROMISE, M_WAITOK | M_ZERO); in g_raid_md_taste_promise()
1193 pd->pd_subdisks = subdisks; in g_raid_md_taste_promise()
1195 pd->pd_meta[i] = metaarr[i]; in g_raid_md_taste_promise()
1197 disk->d_md_data = (void *)pd; in g_raid_md_taste_promise()
1198 disk->d_consumer = rcp; in g_raid_md_taste_promise()
1199 rcp->private = disk; in g_raid_md_taste_promise()
1205 sx_xunlock(&sc->sc_lock); in g_raid_md_taste_promise()
1217 sc = md->mdo_softc; in g_raid_md_event_promise()
1219 return (-1); in g_raid_md_event_promise()
1231 if (g_raid_ndisks(sc, -1) == 0) in g_raid_md_event_promise()
1237 return (-2); in g_raid_md_event_promise()
1246 pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; in g_raid_md_volume_event_promise()
1249 if (!pv->pv_started) in g_raid_md_volume_event_promise()
1253 return (-2); in g_raid_md_volume_event_promise()
1264 struct g_raid_md_promise_perdisk *pd; in g_raid_md_ctl_promise() local
1277 sc = md->mdo_softc; in g_raid_md_ctl_promise()
1284 return (-1); in g_raid_md_ctl_promise()
1289 return (-2); in g_raid_md_ctl_promise()
1294 return (-3); in g_raid_md_ctl_promise()
1297 levelname = "RAID5-LA"; in g_raid_md_ctl_promise()
1300 return (-4); in g_raid_md_ctl_promise()
1302 numdisks = *nargs - 3; in g_raid_md_ctl_promise()
1309 return (-5); in g_raid_md_ctl_promise()
1322 error = -6; in g_raid_md_ctl_promise()
1328 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_promise()
1329 if (disk->d_consumer != NULL && in g_raid_md_ctl_promise()
1330 disk->d_consumer->provider != NULL && in g_raid_md_ctl_promise()
1331 strcmp(disk->d_consumer->provider->name, in g_raid_md_ctl_promise()
1336 if (disk->d_state != G_RAID_DISK_S_ACTIVE) { in g_raid_md_ctl_promise()
1339 g_raid_disk_state2str(disk->d_state)); in g_raid_md_ctl_promise()
1340 error = -7; in g_raid_md_ctl_promise()
1343 pd = disk->d_md_data; in g_raid_md_ctl_promise()
1344 if (pd->pd_subdisks >= PROMISE_MAX_SUBDISKS) { in g_raid_md_ctl_promise()
1347 diskname, pd->pd_subdisks); in g_raid_md_ctl_promise()
1348 error = -7; in g_raid_md_ctl_promise()
1351 pp = disk->d_consumer->provider; in g_raid_md_ctl_promise()
1353 promise_meta_unused_range(pd->pd_meta, in g_raid_md_ctl_promise()
1354 pd->pd_subdisks, in g_raid_md_ctl_promise()
1355 pp->mediasize / pp->sectorsize, in g_raid_md_ctl_promise()
1357 size = MIN(size, (off_t)esize * pp->sectorsize); in g_raid_md_ctl_promise()
1358 sectorsize = MAX(sectorsize, pp->sectorsize); in g_raid_md_ctl_promise()
1368 error = -8; in g_raid_md_ctl_promise()
1371 pp = cp->provider; in g_raid_md_ctl_promise()
1372 pd = malloc(sizeof(*pd), M_MD_PROMISE, M_WAITOK | M_ZERO); in g_raid_md_ctl_promise()
1374 disk->d_md_data = (void *)pd; in g_raid_md_ctl_promise()
1375 disk->d_consumer = cp; in g_raid_md_ctl_promise()
1377 cp->private = disk; in g_raid_md_ctl_promise()
1383 size = MIN(size, pp->mediasize - 131072llu * pp->sectorsize); in g_raid_md_ctl_promise()
1384 sectorsize = MAX(sectorsize, pp->sectorsize); in g_raid_md_ctl_promise()
1389 disks[i]->d_state == G_RAID_DISK_S_NONE) in g_raid_md_ctl_promise()
1397 return (-8); in g_raid_md_ctl_promise()
1408 return (-9); in g_raid_md_ctl_promise()
1421 return (-10); in g_raid_md_ctl_promise()
1425 return (-11); in g_raid_md_ctl_promise()
1434 size -= (size % sectorsize); in g_raid_md_ctl_promise()
1437 size -= (size % (2 * strip)); in g_raid_md_ctl_promise()
1439 size -= (size % strip); in g_raid_md_ctl_promise()
1442 return (-13); in g_raid_md_ctl_promise()
1447 arc4rand(&pv->pv_id, sizeof(pv->pv_id), 0); in g_raid_md_ctl_promise()
1448 pv->pv_generation = 0; in g_raid_md_ctl_promise()
1449 pv->pv_started = 1; in g_raid_md_ctl_promise()
1450 vol = g_raid_create_volume(sc, volname, -1); in g_raid_md_ctl_promise()
1451 vol->v_md_data = pv; in g_raid_md_ctl_promise()
1452 vol->v_raid_level = level; in g_raid_md_ctl_promise()
1453 vol->v_raid_level_qualifier = qual; in g_raid_md_ctl_promise()
1454 vol->v_strip_size = strip; in g_raid_md_ctl_promise()
1455 vol->v_disks_count = numdisks; in g_raid_md_ctl_promise()
1459 vol->v_mediasize = size * numdisks; in g_raid_md_ctl_promise()
1461 vol->v_mediasize = size; in g_raid_md_ctl_promise()
1464 vol->v_mediasize = size * (numdisks - 1); in g_raid_md_ctl_promise()
1466 vol->v_mediasize = ((size * numdisks) / strip / 2) * in g_raid_md_ctl_promise()
1469 vol->v_sectorsize = sectorsize; in g_raid_md_ctl_promise()
1475 sd = &vol->v_subdisks[i]; in g_raid_md_ctl_promise()
1476 sd->sd_disk = disk; in g_raid_md_ctl_promise()
1477 sd->sd_offset = (off_t)offs[i] * 512; in g_raid_md_ctl_promise()
1478 sd->sd_size = size; in g_raid_md_ctl_promise()
1481 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_ctl_promise()
1504 return (-99); in g_raid_md_ctl_promise()
1508 if (nodename != NULL && strcasecmp(sc->sc_name, nodename) != 0) in g_raid_md_ctl_promise()
1511 /* Full node destruction. */ in g_raid_md_ctl_promise()
1518 return (-4); in g_raid_md_ctl_promise()
1521 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_promise()
1522 if (disk->d_consumer) in g_raid_md_ctl_promise()
1523 promise_meta_erase(disk->d_consumer); in g_raid_md_ctl_promise()
1529 /* Destroy specified volume. If it was last - all node. */ in g_raid_md_ctl_promise()
1532 return (-1); in g_raid_md_ctl_promise()
1538 return (-2); in g_raid_md_ctl_promise()
1542 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_ctl_promise()
1543 if (strcmp(vol->v_name, volname) == 0) in g_raid_md_ctl_promise()
1545 pp = vol->v_provider; in g_raid_md_ctl_promise()
1548 if (strcmp(pp->name, volname) == 0) in g_raid_md_ctl_promise()
1550 if (strncmp(pp->name, "raid/", 5) == 0 && in g_raid_md_ctl_promise()
1551 strcmp(pp->name + 5, volname) == 0) in g_raid_md_ctl_promise()
1557 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_ctl_promise()
1558 if (vol->v_global_id == i) in g_raid_md_ctl_promise()
1565 return (-3); in g_raid_md_ctl_promise()
1571 vol->v_provider_open != 0) { in g_raid_md_ctl_promise()
1573 return (-4); in g_raid_md_ctl_promise()
1576 /* Destroy volume and potentially node. */ in g_raid_md_ctl_promise()
1578 TAILQ_FOREACH(vol1, &sc->sc_volumes, v_next) in g_raid_md_ctl_promise()
1585 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_promise()
1586 if (disk->d_consumer) in g_raid_md_ctl_promise()
1587 promise_meta_erase(disk->d_consumer); in g_raid_md_ctl_promise()
1597 return (-1); in g_raid_md_ctl_promise()
1604 error = -2; in g_raid_md_ctl_promise()
1610 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_promise()
1611 if (disk->d_consumer != NULL && in g_raid_md_ctl_promise()
1612 disk->d_consumer->provider != NULL && in g_raid_md_ctl_promise()
1613 strcmp(disk->d_consumer->provider->name, in g_raid_md_ctl_promise()
1620 error = -3; in g_raid_md_ctl_promise()
1630 promise_meta_erase(disk->d_consumer); in g_raid_md_ctl_promise()
1639 if (g_raid_ndisks(sc, -1) == 0) in g_raid_md_ctl_promise()
1648 return (-1); in g_raid_md_ctl_promise()
1656 error = -3; in g_raid_md_ctl_promise()
1667 error = -4; in g_raid_md_ctl_promise()
1670 pp = cp->provider; in g_raid_md_ctl_promise()
1673 pd = malloc(sizeof(*pd), M_MD_PROMISE, M_WAITOK | M_ZERO); in g_raid_md_ctl_promise()
1676 disk->d_consumer = cp; in g_raid_md_ctl_promise()
1677 disk->d_md_data = (void *)pd; in g_raid_md_ctl_promise()
1678 cp->private = disk; in g_raid_md_ctl_promise()
1689 return (-100); in g_raid_md_ctl_promise()
1700 struct g_raid_md_promise_perdisk *pd; in g_raid_md_write_promise() local
1706 sc = md->mdo_softc; in g_raid_md_write_promise()
1708 if (sc->sc_stopping == G_RAID_DESTROY_HARD) in g_raid_md_write_promise()
1711 /* Generate new per-volume metadata for affected volumes. */ in g_raid_md_write_promise()
1712 TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { in g_raid_md_write_promise()
1713 if (vol->v_stopping) in g_raid_md_write_promise()
1719 if (tsd != NULL && vol != tsd->sd_volume) in g_raid_md_write_promise()
1722 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_write_promise()
1723 if (vol->v_subdisks[i].sd_disk == tdisk) in g_raid_md_write_promise()
1726 if (i >= vol->v_disks_count) in g_raid_md_write_promise()
1730 pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; in g_raid_md_write_promise()
1731 pv->pv_generation++; in g_raid_md_write_promise()
1734 if (pv->pv_meta != NULL) in g_raid_md_write_promise()
1735 memcpy(meta, pv->pv_meta, sizeof(*meta)); in g_raid_md_write_promise()
1736 memcpy(meta->promise_id, PROMISE_MAGIC, in g_raid_md_write_promise()
1737 sizeof(PROMISE_MAGIC) - 1); in g_raid_md_write_promise()
1738 meta->dummy_0 = 0x00020000; in g_raid_md_write_promise()
1739 meta->integrity = PROMISE_I_VALID; in g_raid_md_write_promise()
1741 meta->generation = pv->pv_generation; in g_raid_md_write_promise()
1742 meta->status = PROMISE_S_VALID | PROMISE_S_ONLINE | in g_raid_md_write_promise()
1744 if (vol->v_state <= G_RAID_VOLUME_S_DEGRADED) in g_raid_md_write_promise()
1745 meta->status |= PROMISE_S_DEGRADED; in g_raid_md_write_promise()
1746 if (vol->v_dirty) in g_raid_md_write_promise()
1747 meta->status |= PROMISE_S_MARKED; /* XXX: INVENTED! */ in g_raid_md_write_promise()
1748 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0 || in g_raid_md_write_promise()
1749 vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE) in g_raid_md_write_promise()
1750 meta->type = PROMISE_T_RAID0; in g_raid_md_write_promise()
1751 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 || in g_raid_md_write_promise()
1752 vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) in g_raid_md_write_promise()
1753 meta->type = PROMISE_T_RAID1; in g_raid_md_write_promise()
1754 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID3) in g_raid_md_write_promise()
1755 meta->type = PROMISE_T_RAID3; in g_raid_md_write_promise()
1756 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID5) in g_raid_md_write_promise()
1757 meta->type = PROMISE_T_RAID5; in g_raid_md_write_promise()
1758 else if (vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT) in g_raid_md_write_promise()
1759 meta->type = PROMISE_T_SPAN; in g_raid_md_write_promise()
1761 meta->type = PROMISE_T_JBOD; in g_raid_md_write_promise()
1762 meta->total_disks = vol->v_disks_count; in g_raid_md_write_promise()
1763 meta->stripe_shift = ffs(vol->v_strip_size / 1024); in g_raid_md_write_promise()
1764 meta->array_width = vol->v_disks_count; in g_raid_md_write_promise()
1765 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) in g_raid_md_write_promise()
1766 meta->array_width = 1; in g_raid_md_write_promise()
1767 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) in g_raid_md_write_promise()
1768 meta->array_width /= 2; in g_raid_md_write_promise()
1769 meta->array_number = vol->v_global_id; in g_raid_md_write_promise()
1770 meta->total_sectors = vol->v_mediasize / 512; in g_raid_md_write_promise()
1771 meta->total_sectors_high = (vol->v_mediasize / 512) >> 32; in g_raid_md_write_promise()
1772 meta->sector_size = vol->v_sectorsize / 512; in g_raid_md_write_promise()
1773 meta->cylinders = meta->total_sectors / (255 * 63) - 1; in g_raid_md_write_promise()
1774 meta->heads = 254; in g_raid_md_write_promise()
1775 meta->sectors = 63; in g_raid_md_write_promise()
1776 meta->volume_id = pv->pv_id; in g_raid_md_write_promise()
1779 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_write_promise()
1780 sd = &vol->v_subdisks[i]; in g_raid_md_write_promise()
1783 meta->disks[pos].flags = PROMISE_F_VALID | in g_raid_md_write_promise()
1785 if (sd->sd_state == G_RAID_SUBDISK_S_NONE) { in g_raid_md_write_promise()
1786 meta->disks[pos].flags |= 0; in g_raid_md_write_promise()
1787 } else if (sd->sd_state == G_RAID_SUBDISK_S_FAILED) { in g_raid_md_write_promise()
1788 meta->disks[pos].flags |= in g_raid_md_write_promise()
1790 } else if (sd->sd_state <= G_RAID_SUBDISK_S_REBUILD) { in g_raid_md_write_promise()
1791 meta->disks[pos].flags |= in g_raid_md_write_promise()
1793 if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD) { in g_raid_md_write_promise()
1795 sd->sd_rebuild_pos / 512); in g_raid_md_write_promise()
1800 meta->disks[pos].flags |= PROMISE_F_ONLINE; in g_raid_md_write_promise()
1801 if (sd->sd_state < G_RAID_SUBDISK_S_ACTIVE) { in g_raid_md_write_promise()
1802 meta->status |= PROMISE_S_MARKED; in g_raid_md_write_promise()
1803 if (sd->sd_state == G_RAID_SUBDISK_S_RESYNC) { in g_raid_md_write_promise()
1805 sd->sd_rebuild_pos / 512); in g_raid_md_write_promise()
1810 if (pv->pv_meta != NULL) { in g_raid_md_write_promise()
1811 meta->disks[pos].id = pv->pv_meta->disks[pos].id; in g_raid_md_write_promise()
1813 meta->disks[pos].number = i * 2; in g_raid_md_write_promise()
1814 arc4rand(&meta->disks[pos].id, in g_raid_md_write_promise()
1815 sizeof(meta->disks[pos].id), 0); in g_raid_md_write_promise()
1818 promise_meta_put_name(meta, vol->v_name); in g_raid_md_write_promise()
1823 meta->magic_3 = 0x03040010UL; /* Rebuild? */ in g_raid_md_write_promise()
1825 meta->magic_3 = 0x03040008UL; /* Resync? */ in g_raid_md_write_promise()
1826 /* Translate from per-disk to per-volume LBA. */ in g_raid_md_write_promise()
1827 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 || in g_raid_md_write_promise()
1828 vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) { in g_raid_md_write_promise()
1829 rebuild_lba64 *= meta->array_width; in g_raid_md_write_promise()
1830 } else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID3 || in g_raid_md_write_promise()
1831 vol->v_raid_level == G_RAID_VOLUME_RL_RAID5) { in g_raid_md_write_promise()
1832 rebuild_lba64 *= meta->array_width - 1; in g_raid_md_write_promise()
1836 meta->magic_3 = 0x03000000UL; in g_raid_md_write_promise()
1837 meta->rebuild_lba64 = rebuild_lba64; in g_raid_md_write_promise()
1838 meta->magic_4 = 0x04010101UL; in g_raid_md_write_promise()
1840 /* Replace per-volume metadata with new. */ in g_raid_md_write_promise()
1841 if (pv->pv_meta != NULL) in g_raid_md_write_promise()
1842 free(pv->pv_meta, M_MD_PROMISE); in g_raid_md_write_promise()
1843 pv->pv_meta = meta; in g_raid_md_write_promise()
1846 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_write_promise()
1847 sd = &vol->v_subdisks[i]; in g_raid_md_write_promise()
1848 disk = sd->sd_disk; in g_raid_md_write_promise()
1853 pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; in g_raid_md_write_promise()
1854 for (j = 0; j < pd->pd_subdisks; j++) { in g_raid_md_write_promise()
1855 if (pd->pd_meta[j]->volume_id == meta->volume_id) in g_raid_md_write_promise()
1858 if (j == pd->pd_subdisks) in g_raid_md_write_promise()
1859 pd->pd_subdisks++; in g_raid_md_write_promise()
1860 if (pd->pd_meta[j] != NULL) in g_raid_md_write_promise()
1861 free(pd->pd_meta[j], M_MD_PROMISE); in g_raid_md_write_promise()
1862 pd->pd_meta[j] = promise_meta_copy(meta); in g_raid_md_write_promise()
1863 pd->pd_meta[j]->disk = meta->disks[pos]; in g_raid_md_write_promise()
1864 pd->pd_meta[j]->disk.number = pos; in g_raid_md_write_promise()
1865 pd->pd_meta[j]->disk_offset_high = in g_raid_md_write_promise()
1866 (sd->sd_offset / 512) >> 32; in g_raid_md_write_promise()
1867 pd->pd_meta[j]->disk_offset = sd->sd_offset / 512; in g_raid_md_write_promise()
1868 pd->pd_meta[j]->disk_sectors_high = in g_raid_md_write_promise()
1869 (sd->sd_size / 512) >> 32; in g_raid_md_write_promise()
1870 pd->pd_meta[j]->disk_sectors = sd->sd_size / 512; in g_raid_md_write_promise()
1871 if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD) { in g_raid_md_write_promise()
1872 pd->pd_meta[j]->disk_rebuild_high = in g_raid_md_write_promise()
1873 (sd->sd_rebuild_pos / 512) >> 32; in g_raid_md_write_promise()
1874 pd->pd_meta[j]->disk_rebuild = in g_raid_md_write_promise()
1875 sd->sd_rebuild_pos / 512; in g_raid_md_write_promise()
1876 } else if (sd->sd_state < G_RAID_SUBDISK_S_REBUILD) { in g_raid_md_write_promise()
1877 pd->pd_meta[j]->disk_rebuild_high = 0; in g_raid_md_write_promise()
1878 pd->pd_meta[j]->disk_rebuild = 0; in g_raid_md_write_promise()
1880 pd->pd_meta[j]->disk_rebuild_high = UINT32_MAX; in g_raid_md_write_promise()
1881 pd->pd_meta[j]->disk_rebuild = UINT32_MAX; in g_raid_md_write_promise()
1883 pd->pd_updated = 1; in g_raid_md_write_promise()
1887 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_write_promise()
1888 pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; in g_raid_md_write_promise()
1889 if (disk->d_state != G_RAID_DISK_S_ACTIVE) in g_raid_md_write_promise()
1891 if (!pd->pd_updated) in g_raid_md_write_promise()
1895 for (i = 0; i < pd->pd_subdisks; i++) in g_raid_md_write_promise()
1896 g_raid_md_promise_print(pd->pd_meta[i]); in g_raid_md_write_promise()
1897 promise_meta_write(disk->d_consumer, in g_raid_md_write_promise()
1898 pd->pd_meta, pd->pd_subdisks); in g_raid_md_write_promise()
1899 pd->pd_updated = 0; in g_raid_md_write_promise()
1910 struct g_raid_md_promise_perdisk *pd; in g_raid_md_fail_disk_promise() local
1914 sc = md->mdo_softc; in g_raid_md_fail_disk_promise()
1915 pd = (struct g_raid_md_promise_perdisk *)tdisk->d_md_data; in g_raid_md_fail_disk_promise()
1918 if (tdisk->d_state != G_RAID_DISK_S_ACTIVE) in g_raid_md_fail_disk_promise()
1919 return (-1); in g_raid_md_fail_disk_promise()
1925 if (pd->pd_subdisks > 0 && tdisk->d_consumer != NULL) in g_raid_md_fail_disk_promise()
1928 for (i = 0; i < pd->pd_subdisks; i++) { in g_raid_md_fail_disk_promise()
1929 pd->pd_meta[i]->disk.flags |= in g_raid_md_fail_disk_promise()
1931 pos = pd->pd_meta[i]->disk.number; in g_raid_md_fail_disk_promise()
1933 pd->pd_meta[i]->disks[pos].flags |= in g_raid_md_fail_disk_promise()
1936 g_raid_md_promise_print(pd->pd_meta[i]); in g_raid_md_fail_disk_promise()
1938 if (tdisk->d_consumer != NULL) in g_raid_md_fail_disk_promise()
1939 promise_meta_write(tdisk->d_consumer, in g_raid_md_fail_disk_promise()
1940 pd->pd_meta, pd->pd_subdisks); in g_raid_md_fail_disk_promise()
1944 TAILQ_FOREACH(sd, &tdisk->d_subdisks, sd_next) { in g_raid_md_fail_disk_promise()
1962 struct g_raid_md_promise_perdisk *pd; in g_raid_md_free_disk_promise() local
1965 pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; in g_raid_md_free_disk_promise()
1966 for (i = 0; i < pd->pd_subdisks; i++) { in g_raid_md_free_disk_promise()
1967 if (pd->pd_meta[i] != NULL) { in g_raid_md_free_disk_promise()
1968 free(pd->pd_meta[i], M_MD_PROMISE); in g_raid_md_free_disk_promise()
1969 pd->pd_meta[i] = NULL; in g_raid_md_free_disk_promise()
1972 free(pd, M_MD_PROMISE); in g_raid_md_free_disk_promise()
1973 disk->d_md_data = NULL; in g_raid_md_free_disk_promise()
1983 pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; in g_raid_md_free_volume_promise()
1984 if (pv && pv->pv_meta != NULL) { in g_raid_md_free_volume_promise()
1985 free(pv->pv_meta, M_MD_PROMISE); in g_raid_md_free_volume_promise()
1986 pv->pv_meta = NULL; in g_raid_md_free_volume_promise()
1988 if (pv && !pv->pv_started) { in g_raid_md_free_volume_promise()
1989 pv->pv_started = 1; in g_raid_md_free_volume_promise()
1990 callout_stop(&pv->pv_start_co); in g_raid_md_free_volume_promise()
1993 vol->v_md_data = NULL; in g_raid_md_free_volume_promise()