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>
148 printf("signature <%c%c>\n", meta->signature[0], meta->signature[1]); in g_raid_md_jmicron_print()
149 printf("version %04x\n", meta->version); in g_raid_md_jmicron_print()
150 printf("checksum 0x%04x\n", meta->checksum); in g_raid_md_jmicron_print()
151 printf("disk_id 0x%08x\n", meta->disk_id); in g_raid_md_jmicron_print()
152 printf("offset 0x%08x\n", meta->offset); in g_raid_md_jmicron_print()
153 printf("disk_sectors_high 0x%08x\n", meta->disk_sectors_high); in g_raid_md_jmicron_print()
154 printf("disk_sectors_low 0x%04x\n", meta->disk_sectors_low); in g_raid_md_jmicron_print()
155 printf("name <%.16s>\n", meta->name); in g_raid_md_jmicron_print()
156 printf("type %d\n", meta->type); in g_raid_md_jmicron_print()
157 printf("stripe_shift %d\n", meta->stripe_shift); in g_raid_md_jmicron_print()
158 printf("flags %04x\n", meta->flags); in g_raid_md_jmicron_print()
161 printf(" 0x%08x", meta->spare[k]); in g_raid_md_jmicron_print()
165 printf(" 0x%08x", meta->disks[k]); in g_raid_md_jmicron_print()
186 if (meta->disks[pos] == 0) in jmicron_meta_total_disks()
199 if (meta->spare[pos] != 0) in jmicron_meta_total_spare()
217 config_id += meta->disks[pos] << pos; in jmicron_meta_config_id()
226 strncpy(buf, meta->name, 16); in jmicron_meta_get_name()
228 for (i = 15; i >= 0; i--) { in jmicron_meta_get_name()
239 memset(meta->name, 0x20, 16); in jmicron_meta_put_name()
240 memcpy(meta->name, buf, MIN(strlen(buf), 16)); in jmicron_meta_put_name()
250 if ((meta->disks[pos] & JMICRON_DISK_MASK) == id) in jmicron_meta_find_disk()
254 if ((meta->spare[pos] & JMICRON_DISK_MASK) == id) in jmicron_meta_find_disk()
255 return (-3); in jmicron_meta_find_disk()
257 return (-1); in jmicron_meta_find_disk()
269 pp = cp->provider; in jmicron_meta_read()
270 if (pp->sectorsize < sizeof(*meta)) in jmicron_meta_read()
274 pp->mediasize - pp->sectorsize, pp->sectorsize, &error); in jmicron_meta_read()
277 pp->name, error); in jmicron_meta_read()
283 if (strncmp(meta->signature, JMICRON_MAGIC, strlen(JMICRON_MAGIC))) { in jmicron_meta_read()
284 G_RAID_DEBUG(1, "JMicron signature check failed on %s", pp->name); in jmicron_meta_read()
289 memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize)); in jmicron_meta_read()
296 G_RAID_DEBUG(1, "JMicron checksum check failed on %s", pp->name); in jmicron_meta_read()
312 pp = cp->provider; in jmicron_meta_write()
315 meta->checksum = 0; in jmicron_meta_write()
318 meta->checksum -= checksum; in jmicron_meta_write()
321 buf = malloc(pp->sectorsize, M_MD_JMICRON, M_WAITOK | M_ZERO); in jmicron_meta_write()
325 pp->mediasize - pp->sectorsize, buf, pp->sectorsize); in jmicron_meta_write()
328 pp->name, error); in jmicron_meta_write()
342 pp = cp->provider; in jmicron_meta_erase()
343 buf = malloc(pp->sectorsize, M_MD_JMICRON, M_WAITOK | M_ZERO); in jmicron_meta_erase()
345 pp->mediasize - pp->sectorsize, buf, pp->sectorsize); in jmicron_meta_erase()
348 pp->name, error); in jmicron_meta_erase()
358 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_jmicron_get_disk() local
360 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_jmicron_get_disk()
361 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_jmicron_get_disk()
362 if (pd->pd_disk_pos == id) in g_raid_md_jmicron_get_disk()
427 struct g_raid_md_jmicron_perdisk *pd, *oldpd; in g_raid_md_jmicron_start_disk() local
431 sc = disk->d_softc; in g_raid_md_jmicron_start_disk()
432 md = sc->sc_md; in g_raid_md_jmicron_start_disk()
434 meta = mdi->mdio_meta; in g_raid_md_jmicron_start_disk()
435 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_jmicron_start_disk()
439 if (pd->pd_meta != NULL) in g_raid_md_jmicron_start_disk()
440 disk_pos = jmicron_meta_find_disk(meta, pd->pd_disk_id); in g_raid_md_jmicron_start_disk()
442 disk_pos = -1; in g_raid_md_jmicron_start_disk()
446 if (!mdi->mdio_started) in g_raid_md_jmicron_start_disk()
449 * If we have already started - try to get use of the disk. in g_raid_md_jmicron_start_disk()
452 TAILQ_FOREACH(tmpdisk, &sc->sc_disks, d_next) { in g_raid_md_jmicron_start_disk()
453 if (tmpdisk->d_state != G_RAID_DISK_S_OFFLINE && in g_raid_md_jmicron_start_disk()
454 tmpdisk->d_state != G_RAID_DISK_S_FAILED) in g_raid_md_jmicron_start_disk()
457 TAILQ_FOREACH(sd, &tmpdisk->d_subdisks, sd_next) { in g_raid_md_jmicron_start_disk()
458 if (sd->sd_offset + sd->sd_size + 512 > in g_raid_md_jmicron_start_disk()
459 pd->pd_disk_size) { in g_raid_md_jmicron_start_disk()
462 pd->pd_disk_size, in g_raid_md_jmicron_start_disk()
463 sd->sd_offset + sd->sd_size + 512); in g_raid_md_jmicron_start_disk()
469 if (tmpdisk->d_state == G_RAID_DISK_S_OFFLINE) { in g_raid_md_jmicron_start_disk()
477 if (disk_pos == -3 || pd->pd_disk_pos == -3) { in g_raid_md_jmicron_start_disk()
487 oldpd = (struct g_raid_md_jmicron_perdisk *)olddisk->d_md_data; in g_raid_md_jmicron_start_disk()
488 disk_pos = oldpd->pd_disk_pos; in g_raid_md_jmicron_start_disk()
497 if (olddisk->d_state != G_RAID_DISK_S_OFFLINE) { in g_raid_md_jmicron_start_disk()
503 oldpd = (struct g_raid_md_jmicron_perdisk *)olddisk->d_md_data; in g_raid_md_jmicron_start_disk()
507 TAILQ_FOREACH_SAFE(sd, &olddisk->d_subdisks, sd_next, tmpsd) { in g_raid_md_jmicron_start_disk()
508 TAILQ_REMOVE(&olddisk->d_subdisks, sd, sd_next); in g_raid_md_jmicron_start_disk()
509 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_jmicron_start_disk()
510 sd->sd_disk = disk; in g_raid_md_jmicron_start_disk()
512 oldpd->pd_disk_pos = -2; in g_raid_md_jmicron_start_disk()
513 pd->pd_disk_pos = disk_pos; in g_raid_md_jmicron_start_disk()
515 meta->disks[disk_pos] = pd->pd_disk_id; in g_raid_md_jmicron_start_disk()
517 /* If it was placeholder -- destroy it. */ in g_raid_md_jmicron_start_disk()
518 if (olddisk->d_state == G_RAID_DISK_S_OFFLINE) { in g_raid_md_jmicron_start_disk()
527 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_jmicron_start_disk()
533 sd->sd_offset = in g_raid_md_jmicron_start_disk()
534 (off_t)pd->pd_meta->offset * 16 * 512; //ZZZ in g_raid_md_jmicron_start_disk()
535 sd->sd_size = in g_raid_md_jmicron_start_disk()
536 (((off_t)pd->pd_meta->disk_sectors_high << 16) + in g_raid_md_jmicron_start_disk()
537 pd->pd_meta->disk_sectors_low) * 512; in g_raid_md_jmicron_start_disk()
544 } else if ((meta->flags & JMICRON_F_BADSEC) != 0 && in g_raid_md_jmicron_start_disk()
545 (pd->pd_meta->flags & JMICRON_F_BADSEC) == 0) { in g_raid_md_jmicron_start_disk()
546 /* Cold-inserted or rebuilding disk. */ in g_raid_md_jmicron_start_disk()
549 } else if (pd->pd_meta->flags & JMICRON_F_UNSYNC) { in g_raid_md_jmicron_start_disk()
563 if (mdi->mdio_started) { in g_raid_md_jmicron_start_disk()
564 mdi->mdio_incomplete = in g_raid_md_jmicron_start_disk()
566 mdi->mdio_total_disks); in g_raid_md_jmicron_start_disk()
590 md = sc->sc_md; in g_raid_md_jmicron_refill()
596 if (na == mdi->mdio_total_disks) in g_raid_md_jmicron_refill()
599 G_RAID_DEBUG1(1, md->mdo_softc, in g_raid_md_jmicron_refill()
601 "trying to refill.", na, mdi->mdio_total_disks); in g_raid_md_jmicron_refill()
604 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_jmicron_refill()
605 if (disk->d_state == G_RAID_DISK_S_STALE) { in g_raid_md_jmicron_refill()
607 if (disk->d_state == G_RAID_DISK_S_ACTIVE) in g_raid_md_jmicron_refill()
615 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_jmicron_refill()
616 if (disk->d_state == G_RAID_DISK_S_SPARE) { in g_raid_md_jmicron_refill()
618 if (disk->d_state == G_RAID_DISK_S_ACTIVE) in g_raid_md_jmicron_refill()
629 mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < in g_raid_md_jmicron_refill()
630 mdi->mdio_total_disks); in g_raid_md_jmicron_refill()
633 if (mdi->mdio_incomplete) { in g_raid_md_jmicron_refill()
646 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_jmicron_start() local
655 md = sc->sc_md; in g_raid_md_jmicron_start()
657 meta = mdi->mdio_meta; in g_raid_md_jmicron_start()
661 vol = g_raid_create_volume(sc, buf, -1); in g_raid_md_jmicron_start()
662 size = ((off_t)meta->disk_sectors_high << 16) + meta->disk_sectors_low; in g_raid_md_jmicron_start()
664 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE; in g_raid_md_jmicron_start()
665 if (meta->type == JMICRON_T_RAID0) { in g_raid_md_jmicron_start()
666 vol->v_raid_level = G_RAID_VOLUME_RL_RAID0; in g_raid_md_jmicron_start()
667 vol->v_mediasize = size * mdi->mdio_total_disks; in g_raid_md_jmicron_start()
668 } else if (meta->type == JMICRON_T_RAID1) { in g_raid_md_jmicron_start()
669 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1; in g_raid_md_jmicron_start()
670 vol->v_mediasize = size; in g_raid_md_jmicron_start()
671 } else if (meta->type == JMICRON_T_RAID01) { in g_raid_md_jmicron_start()
672 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; in g_raid_md_jmicron_start()
673 vol->v_mediasize = size * mdi->mdio_total_disks / 2; in g_raid_md_jmicron_start()
674 } else if (meta->type == JMICRON_T_CONCAT) { in g_raid_md_jmicron_start()
675 if (mdi->mdio_total_disks == 1) in g_raid_md_jmicron_start()
676 vol->v_raid_level = G_RAID_VOLUME_RL_SINGLE; in g_raid_md_jmicron_start()
678 vol->v_raid_level = G_RAID_VOLUME_RL_CONCAT; in g_raid_md_jmicron_start()
679 vol->v_mediasize = 0; in g_raid_md_jmicron_start()
680 } else if (meta->type == JMICRON_T_RAID5) { in g_raid_md_jmicron_start()
681 vol->v_raid_level = G_RAID_VOLUME_RL_RAID5; in g_raid_md_jmicron_start()
682 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_R5LA; in g_raid_md_jmicron_start()
683 vol->v_mediasize = size * (mdi->mdio_total_disks - 1); in g_raid_md_jmicron_start()
685 vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; in g_raid_md_jmicron_start()
686 vol->v_mediasize = 0; in g_raid_md_jmicron_start()
688 vol->v_strip_size = 1024 << meta->stripe_shift; //ZZZ in g_raid_md_jmicron_start()
689 vol->v_disks_count = mdi->mdio_total_disks; in g_raid_md_jmicron_start()
690 vol->v_sectorsize = 512; //ZZZ in g_raid_md_jmicron_start()
691 for (j = 0; j < vol->v_disks_count; j++) { in g_raid_md_jmicron_start()
692 sd = &vol->v_subdisks[j]; in g_raid_md_jmicron_start()
693 sd->sd_offset = (off_t)meta->offset * 16 * 512; //ZZZ in g_raid_md_jmicron_start()
694 sd->sd_size = size; in g_raid_md_jmicron_start()
699 for (disk_pos = 0; disk_pos < mdi->mdio_total_disks; disk_pos++) { in g_raid_md_jmicron_start()
700 pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO); in g_raid_md_jmicron_start()
701 pd->pd_disk_pos = disk_pos; in g_raid_md_jmicron_start()
702 pd->pd_disk_id = meta->disks[disk_pos]; in g_raid_md_jmicron_start()
704 disk->d_md_data = (void *)pd; in g_raid_md_jmicron_start()
705 disk->d_state = G_RAID_DISK_S_OFFLINE; in g_raid_md_jmicron_start()
706 sd = &vol->v_subdisks[disk_pos]; in g_raid_md_jmicron_start()
707 sd->sd_disk = disk; in g_raid_md_jmicron_start()
708 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_jmicron_start()
713 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_jmicron_start()
714 if (disk->d_state == G_RAID_DISK_S_NONE) { in g_raid_md_jmicron_start()
721 mdi->mdio_started = 1; in g_raid_md_jmicron_start()
730 callout_stop(&mdi->mdio_start_co); in g_raid_md_jmicron_start()
731 G_RAID_DEBUG1(1, sc, "root_mount_rel %p", mdi->mdio_rootmount); in g_raid_md_jmicron_start()
732 root_mount_rel(mdi->mdio_rootmount); in g_raid_md_jmicron_start()
733 mdi->mdio_rootmount = NULL; in g_raid_md_jmicron_start()
743 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_jmicron_new_disk() local
745 sc = disk->d_softc; in g_raid_md_jmicron_new_disk()
746 md = sc->sc_md; in g_raid_md_jmicron_new_disk()
748 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_jmicron_new_disk()
749 pdmeta = pd->pd_meta; in g_raid_md_jmicron_new_disk()
751 if (mdi->mdio_started) { in g_raid_md_jmicron_new_disk()
756 * If we haven't started yet - update common metadata in g_raid_md_jmicron_new_disk()
759 if (mdi->mdio_meta == NULL || in g_raid_md_jmicron_new_disk()
760 jmicron_meta_find_disk(mdi->mdio_meta, in g_raid_md_jmicron_new_disk()
761 mdi->mdio_meta->disk_id) == -3) { in g_raid_md_jmicron_new_disk()
762 if (mdi->mdio_meta != NULL) in g_raid_md_jmicron_new_disk()
763 free(mdi->mdio_meta, M_MD_JMICRON); in g_raid_md_jmicron_new_disk()
764 mdi->mdio_meta = jmicron_meta_copy(pdmeta); in g_raid_md_jmicron_new_disk()
765 mdi->mdio_total_disks = jmicron_meta_total_disks(pdmeta); in g_raid_md_jmicron_new_disk()
767 mdi->mdio_meta->flags |= pdmeta->flags & JMICRON_F_BADSEC; in g_raid_md_jmicron_new_disk()
769 mdi->mdio_disks_present++; in g_raid_md_jmicron_new_disk()
771 mdi->mdio_disks_present, in g_raid_md_jmicron_new_disk()
772 mdi->mdio_total_disks, in g_raid_md_jmicron_new_disk()
773 jmicron_meta_total_spare(mdi->mdio_meta)); in g_raid_md_jmicron_new_disk()
775 /* If we collected all needed disks - start array. */ in g_raid_md_jmicron_new_disk()
776 if (mdi->mdio_disks_present == mdi->mdio_total_disks + in g_raid_md_jmicron_new_disk()
777 jmicron_meta_total_spare(mdi->mdio_meta)) in g_raid_md_jmicron_new_disk()
790 md = sc->sc_md; in g_raid_jmicron_go()
792 if (!mdi->mdio_started) { in g_raid_jmicron_go()
807 mdi->mdio_config_id = arc4random(); in g_raid_md_create_jmicron()
808 snprintf(name, sizeof(name), "JMicron-%08x", mdi->mdio_config_id); in g_raid_md_create_jmicron()
812 md->mdo_softc = sc; in g_raid_md_create_jmicron()
813 *gp = sc->sc_geom; in g_raid_md_create_jmicron()
827 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_taste_jmicron() local
833 G_RAID_DEBUG(1, "Tasting JMicron on %s", cp->provider->name); in g_raid_md_taste_jmicron()
835 pp = cp->provider; in g_raid_md_taste_jmicron()
842 if (pp->geom->rank == 1) in g_raid_md_taste_jmicron()
863 disk_pos = jmicron_meta_find_disk(meta, meta->disk_id); in g_raid_md_taste_jmicron()
864 if (disk_pos == -1) { in g_raid_md_taste_jmicron()
866 meta->disk_id); in g_raid_md_taste_jmicron()
873 spare = (disk_pos == -2) ? 1 : 0; in g_raid_md_taste_jmicron()
876 /* Search for matching node. */ in g_raid_md_taste_jmicron()
879 LIST_FOREACH(geom, &mp->geom, geom) { in g_raid_md_taste_jmicron()
880 sc = geom->softc; in g_raid_md_taste_jmicron()
883 if (sc->sc_stopping != 0) in g_raid_md_taste_jmicron()
885 if (sc->sc_md->mdo_class != md->mdo_class) in g_raid_md_taste_jmicron()
887 mdi1 = (struct g_raid_md_jmicron_object *)sc->sc_md; in g_raid_md_taste_jmicron()
889 if (mdi1->mdio_incomplete) in g_raid_md_taste_jmicron()
892 if (mdi1->mdio_config_id == in g_raid_md_taste_jmicron()
898 /* Found matching node. */ in g_raid_md_taste_jmicron()
900 G_RAID_DEBUG(1, "Found matching array %s", sc->sc_name); in g_raid_md_taste_jmicron()
903 } else if (spare) { /* Not found needy node -- left for later. */ in g_raid_md_taste_jmicron()
907 } else { /* Not found matching node -- create one. */ in g_raid_md_taste_jmicron()
909 mdi->mdio_config_id = jmicron_meta_config_id(meta); in g_raid_md_taste_jmicron()
910 snprintf(name, sizeof(name), "JMicron-%08x", in g_raid_md_taste_jmicron()
911 mdi->mdio_config_id); in g_raid_md_taste_jmicron()
913 md->mdo_softc = sc; in g_raid_md_taste_jmicron()
914 geom = sc->sc_geom; in g_raid_md_taste_jmicron()
915 callout_init(&mdi->mdio_start_co, 1); in g_raid_md_taste_jmicron()
916 callout_reset(&mdi->mdio_start_co, g_raid_start_timeout * hz, in g_raid_md_taste_jmicron()
918 mdi->mdio_rootmount = root_mount_hold("GRAID-JMicron"); in g_raid_md_taste_jmicron()
919 G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); in g_raid_md_taste_jmicron()
923 g_access(cp, -1, 0, 0); in g_raid_md_taste_jmicron()
926 rcp->flags |= G_CF_DIRECT_RECEIVE; in g_raid_md_taste_jmicron()
932 sx_xlock(&sc->sc_lock); in g_raid_md_taste_jmicron()
934 pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO); in g_raid_md_taste_jmicron()
935 pd->pd_meta = meta; in g_raid_md_taste_jmicron()
937 pd->pd_disk_pos = -3; in g_raid_md_taste_jmicron()
938 pd->pd_disk_id = arc4random() & JMICRON_DISK_MASK; in g_raid_md_taste_jmicron()
940 pd->pd_disk_pos = -1; in g_raid_md_taste_jmicron()
941 pd->pd_disk_id = meta->disk_id; in g_raid_md_taste_jmicron()
943 pd->pd_disk_size = pp->mediasize; in g_raid_md_taste_jmicron()
945 disk->d_md_data = (void *)pd; in g_raid_md_taste_jmicron()
946 disk->d_consumer = rcp; in g_raid_md_taste_jmicron()
947 rcp->private = disk; in g_raid_md_taste_jmicron()
953 sx_xunlock(&sc->sc_lock); in g_raid_md_taste_jmicron()
969 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_event_jmicron() local
971 sc = md->mdo_softc; in g_raid_md_event_jmicron()
976 if (!mdi->mdio_started) in g_raid_md_event_jmicron()
980 return (-1); in g_raid_md_event_jmicron()
982 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_event_jmicron()
986 if (pd->pd_disk_pos >= 0) { in g_raid_md_event_jmicron()
988 if (disk->d_consumer) { in g_raid_md_event_jmicron()
989 g_raid_kill_consumer(sc, disk->d_consumer); in g_raid_md_event_jmicron()
990 disk->d_consumer = NULL; in g_raid_md_event_jmicron()
992 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_event_jmicron()
999 /* Otherwise -- delete. */ in g_raid_md_event_jmicron()
1008 if (g_raid_ndisks(sc, -1) == in g_raid_md_event_jmicron()
1015 return (-2); in g_raid_md_event_jmicron()
1027 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_ctl_jmicron() local
1038 sc = md->mdo_softc; in g_raid_md_ctl_jmicron()
1046 return (-1); in g_raid_md_ctl_jmicron()
1051 return (-2); in g_raid_md_ctl_jmicron()
1056 return (-3); in g_raid_md_ctl_jmicron()
1059 levelname = "RAID5-LA"; in g_raid_md_ctl_jmicron()
1062 return (-4); in g_raid_md_ctl_jmicron()
1064 numdisks = *nargs - 3; in g_raid_md_ctl_jmicron()
1071 return (-5); in g_raid_md_ctl_jmicron()
1082 error = -6; in g_raid_md_ctl_jmicron()
1095 error = -7; in g_raid_md_ctl_jmicron()
1098 pp = cp->provider; in g_raid_md_ctl_jmicron()
1100 pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO); in g_raid_md_ctl_jmicron()
1101 pd->pd_disk_pos = i; in g_raid_md_ctl_jmicron()
1102 pd->pd_disk_id = arc4random() & JMICRON_DISK_MASK; in g_raid_md_ctl_jmicron()
1104 disk->d_md_data = (void *)pd; in g_raid_md_ctl_jmicron()
1105 disk->d_consumer = cp; in g_raid_md_ctl_jmicron()
1108 cp->private = disk; in g_raid_md_ctl_jmicron()
1113 pd->pd_disk_size = pp->mediasize; in g_raid_md_ctl_jmicron()
1114 if (size > pp->mediasize) in g_raid_md_ctl_jmicron()
1115 size = pp->mediasize; in g_raid_md_ctl_jmicron()
1116 if (sectorsize < pp->sectorsize) in g_raid_md_ctl_jmicron()
1117 sectorsize = pp->sectorsize; in g_raid_md_ctl_jmicron()
1124 return (-8); in g_raid_md_ctl_jmicron()
1128 size -= sectorsize; in g_raid_md_ctl_jmicron()
1138 return (-9); in g_raid_md_ctl_jmicron()
1151 return (-10); in g_raid_md_ctl_jmicron()
1155 return (-11); in g_raid_md_ctl_jmicron()
1159 return (-12); in g_raid_md_ctl_jmicron()
1166 size -= (size % sectorsize); in g_raid_md_ctl_jmicron()
1169 size -= (size % (2 * strip)); in g_raid_md_ctl_jmicron()
1171 size -= (size % strip); in g_raid_md_ctl_jmicron()
1174 return (-13); in g_raid_md_ctl_jmicron()
1178 return (-14); in g_raid_md_ctl_jmicron()
1182 mdi->mdio_total_disks = numdisks; in g_raid_md_ctl_jmicron()
1183 mdi->mdio_started = 1; in g_raid_md_ctl_jmicron()
1184 vol = g_raid_create_volume(sc, volname, -1); in g_raid_md_ctl_jmicron()
1185 vol->v_md_data = (void *)(intptr_t)0; in g_raid_md_ctl_jmicron()
1186 vol->v_raid_level = level; in g_raid_md_ctl_jmicron()
1187 vol->v_raid_level_qualifier = qual; in g_raid_md_ctl_jmicron()
1188 vol->v_strip_size = strip; in g_raid_md_ctl_jmicron()
1189 vol->v_disks_count = numdisks; in g_raid_md_ctl_jmicron()
1193 vol->v_mediasize = size * numdisks; in g_raid_md_ctl_jmicron()
1195 vol->v_mediasize = size; in g_raid_md_ctl_jmicron()
1197 vol->v_mediasize = size * (numdisks - 1); in g_raid_md_ctl_jmicron()
1199 vol->v_mediasize = ((size * numdisks) / strip / 2) * in g_raid_md_ctl_jmicron()
1202 vol->v_sectorsize = sectorsize; in g_raid_md_ctl_jmicron()
1206 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_jmicron()
1207 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_ctl_jmicron()
1208 sd = &vol->v_subdisks[pd->pd_disk_pos]; in g_raid_md_ctl_jmicron()
1209 sd->sd_disk = disk; in g_raid_md_ctl_jmicron()
1210 sd->sd_offset = 0; in g_raid_md_ctl_jmicron()
1211 sd->sd_size = size; in g_raid_md_ctl_jmicron()
1212 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_ctl_jmicron()
1213 if (sd->sd_disk->d_consumer != NULL) { in g_raid_md_ctl_jmicron()
1242 return (-4); in g_raid_md_ctl_jmicron()
1245 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_jmicron()
1246 if (disk->d_consumer) in g_raid_md_ctl_jmicron()
1247 jmicron_meta_erase(disk->d_consumer); in g_raid_md_ctl_jmicron()
1256 return (-1); in g_raid_md_ctl_jmicron()
1263 error = -2; in g_raid_md_ctl_jmicron()
1269 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_jmicron()
1270 if (disk->d_consumer != NULL && in g_raid_md_ctl_jmicron()
1271 disk->d_consumer->provider != NULL && in g_raid_md_ctl_jmicron()
1272 strcmp(disk->d_consumer->provider->name, in g_raid_md_ctl_jmicron()
1279 error = -3; in g_raid_md_ctl_jmicron()
1288 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_ctl_jmicron()
1291 jmicron_meta_erase(disk->d_consumer); in g_raid_md_ctl_jmicron()
1294 if (pd->pd_disk_pos >= 0) { in g_raid_md_ctl_jmicron()
1296 g_raid_kill_consumer(sc, disk->d_consumer); in g_raid_md_ctl_jmicron()
1297 disk->d_consumer = NULL; in g_raid_md_ctl_jmicron()
1298 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_ctl_jmicron()
1305 /* Otherwise -- delete. */ in g_raid_md_ctl_jmicron()
1315 if (g_raid_ndisks(sc, -1) == in g_raid_md_ctl_jmicron()
1325 return (-1); in g_raid_md_ctl_jmicron()
1334 error = -3; in g_raid_md_ctl_jmicron()
1345 error = -4; in g_raid_md_ctl_jmicron()
1348 pp = cp->provider; in g_raid_md_ctl_jmicron()
1350 pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO); in g_raid_md_ctl_jmicron()
1351 pd->pd_disk_pos = -3; in g_raid_md_ctl_jmicron()
1352 pd->pd_disk_id = arc4random() & JMICRON_DISK_MASK; in g_raid_md_ctl_jmicron()
1353 pd->pd_disk_size = pp->mediasize; in g_raid_md_ctl_jmicron()
1356 disk->d_consumer = cp; in g_raid_md_ctl_jmicron()
1357 disk->d_md_data = (void *)pd; in g_raid_md_ctl_jmicron()
1358 cp->private = disk; in g_raid_md_ctl_jmicron()
1365 if (disk->d_state != G_RAID_DISK_S_ACTIVE && in g_raid_md_ctl_jmicron()
1366 disk->d_state != G_RAID_DISK_S_SPARE) { in g_raid_md_ctl_jmicron()
1370 error = -8; in g_raid_md_ctl_jmicron()
1381 return (-100); in g_raid_md_ctl_jmicron()
1393 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_write_jmicron() local
1397 sc = md->mdo_softc; in g_raid_md_write_jmicron()
1400 if (sc->sc_stopping == G_RAID_DESTROY_HARD) in g_raid_md_write_jmicron()
1404 vol = TAILQ_FIRST(&sc->sc_volumes); in g_raid_md_write_jmicron()
1408 strncpy(meta->signature, JMICRON_MAGIC, 2); in g_raid_md_write_jmicron()
1409 meta->version = JMICRON_VERSION; in g_raid_md_write_jmicron()
1410 jmicron_meta_put_name(meta, vol->v_name); in g_raid_md_write_jmicron()
1411 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0) in g_raid_md_write_jmicron()
1412 meta->type = JMICRON_T_RAID0; in g_raid_md_write_jmicron()
1413 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) in g_raid_md_write_jmicron()
1414 meta->type = JMICRON_T_RAID1; in g_raid_md_write_jmicron()
1415 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) in g_raid_md_write_jmicron()
1416 meta->type = JMICRON_T_RAID01; in g_raid_md_write_jmicron()
1417 else if (vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT || in g_raid_md_write_jmicron()
1418 vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE) in g_raid_md_write_jmicron()
1419 meta->type = JMICRON_T_CONCAT; in g_raid_md_write_jmicron()
1421 meta->type = JMICRON_T_RAID5; in g_raid_md_write_jmicron()
1422 meta->stripe_shift = fls(vol->v_strip_size / 2048); in g_raid_md_write_jmicron()
1423 meta->flags = JMICRON_F_READY | JMICRON_F_BOOTABLE; in g_raid_md_write_jmicron()
1424 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_write_jmicron()
1425 sd = &vol->v_subdisks[i]; in g_raid_md_write_jmicron()
1426 if (sd->sd_disk == NULL || sd->sd_disk->d_md_data == NULL) in g_raid_md_write_jmicron()
1427 meta->disks[i] = 0xffffffff; in g_raid_md_write_jmicron()
1429 pd = (struct g_raid_md_jmicron_perdisk *) in g_raid_md_write_jmicron()
1430 sd->sd_disk->d_md_data; in g_raid_md_write_jmicron()
1431 meta->disks[i] = pd->pd_disk_id; in g_raid_md_write_jmicron()
1433 if (sd->sd_state < G_RAID_SUBDISK_S_STALE) in g_raid_md_write_jmicron()
1434 meta->flags |= JMICRON_F_BADSEC; in g_raid_md_write_jmicron()
1435 if (vol->v_dirty) in g_raid_md_write_jmicron()
1436 meta->flags |= JMICRON_F_UNSYNC; in g_raid_md_write_jmicron()
1441 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_write_jmicron()
1442 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_write_jmicron()
1443 if (disk->d_state != G_RAID_DISK_S_SPARE) in g_raid_md_write_jmicron()
1445 meta->spare[spares] = pd->pd_disk_id; in g_raid_md_write_jmicron()
1451 if (mdi->mdio_meta != NULL) in g_raid_md_write_jmicron()
1452 free(mdi->mdio_meta, M_MD_JMICRON); in g_raid_md_write_jmicron()
1453 mdi->mdio_meta = meta; in g_raid_md_write_jmicron()
1454 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_write_jmicron()
1455 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_write_jmicron()
1456 if (disk->d_state != G_RAID_DISK_S_ACTIVE && in g_raid_md_write_jmicron()
1457 disk->d_state != G_RAID_DISK_S_SPARE) in g_raid_md_write_jmicron()
1459 if (pd->pd_meta != NULL) { in g_raid_md_write_jmicron()
1460 free(pd->pd_meta, M_MD_JMICRON); in g_raid_md_write_jmicron()
1461 pd->pd_meta = NULL; in g_raid_md_write_jmicron()
1463 pd->pd_meta = jmicron_meta_copy(meta); in g_raid_md_write_jmicron()
1464 pd->pd_meta->disk_id = pd->pd_disk_id; in g_raid_md_write_jmicron()
1465 if ((sd = TAILQ_FIRST(&disk->d_subdisks)) != NULL) { in g_raid_md_write_jmicron()
1466 pd->pd_meta->offset = in g_raid_md_write_jmicron()
1467 (sd->sd_offset / 512) / 16; in g_raid_md_write_jmicron()
1468 pd->pd_meta->disk_sectors_high = in g_raid_md_write_jmicron()
1469 (sd->sd_size / 512) >> 16; in g_raid_md_write_jmicron()
1470 pd->pd_meta->disk_sectors_low = in g_raid_md_write_jmicron()
1471 (sd->sd_size / 512) & 0xffff; in g_raid_md_write_jmicron()
1472 if (sd->sd_state < G_RAID_SUBDISK_S_STALE) in g_raid_md_write_jmicron()
1473 pd->pd_meta->flags &= ~JMICRON_F_BADSEC; in g_raid_md_write_jmicron()
1474 else if (sd->sd_state < G_RAID_SUBDISK_S_ACTIVE) in g_raid_md_write_jmicron()
1475 pd->pd_meta->flags |= JMICRON_F_UNSYNC; in g_raid_md_write_jmicron()
1479 g_raid_md_jmicron_print(pd->pd_meta); in g_raid_md_write_jmicron()
1480 jmicron_meta_write(disk->d_consumer, pd->pd_meta); in g_raid_md_write_jmicron()
1490 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_fail_disk_jmicron() local
1493 sc = md->mdo_softc; in g_raid_md_fail_disk_jmicron()
1494 pd = (struct g_raid_md_jmicron_perdisk *)tdisk->d_md_data; in g_raid_md_fail_disk_jmicron()
1497 if (pd->pd_disk_pos < 0) in g_raid_md_fail_disk_jmicron()
1498 return (-1); in g_raid_md_fail_disk_jmicron()
1500 if (tdisk->d_consumer) in g_raid_md_fail_disk_jmicron()
1501 jmicron_meta_erase(tdisk->d_consumer); in g_raid_md_fail_disk_jmicron()
1505 TAILQ_FOREACH(sd, &tdisk->d_subdisks, sd_next) { in g_raid_md_fail_disk_jmicron()
1516 if (g_raid_ndisks(sc, -1) == in g_raid_md_fail_disk_jmicron()
1528 struct g_raid_md_jmicron_perdisk *pd; in g_raid_md_free_disk_jmicron() local
1530 pd = (struct g_raid_md_jmicron_perdisk *)disk->d_md_data; in g_raid_md_free_disk_jmicron()
1531 if (pd->pd_meta != NULL) { in g_raid_md_free_disk_jmicron()
1532 free(pd->pd_meta, M_MD_JMICRON); in g_raid_md_free_disk_jmicron()
1533 pd->pd_meta = NULL; in g_raid_md_free_disk_jmicron()
1535 free(pd, M_MD_JMICRON); in g_raid_md_free_disk_jmicron()
1536 disk->d_md_data = NULL; in g_raid_md_free_disk_jmicron()
1546 if (!mdi->mdio_started) { in g_raid_md_free_jmicron()
1547 mdi->mdio_started = 0; in g_raid_md_free_jmicron()
1548 callout_stop(&mdi->mdio_start_co); in g_raid_md_free_jmicron()
1549 G_RAID_DEBUG1(1, md->mdo_softc, in g_raid_md_free_jmicron()
1550 "root_mount_rel %p", mdi->mdio_rootmount); in g_raid_md_free_jmicron()
1551 root_mount_rel(mdi->mdio_rootmount); in g_raid_md_free_jmicron()
1552 mdi->mdio_rootmount = NULL; in g_raid_md_free_jmicron()
1554 if (mdi->mdio_meta != NULL) { in g_raid_md_free_jmicron()
1555 free(mdi->mdio_meta, M_MD_JMICRON); in g_raid_md_free_jmicron()
1556 mdi->mdio_meta = NULL; in g_raid_md_free_jmicron()