Lines Matching +full:mdi +full:- +full:x

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2000 - 2008 Søren Schmidt <sos@FreeBSD.org>
50 uint64_t total_sectors; /* 54 - 57 */
56 uint8_t timestamp[6]; /* 134 - 136 */
74 uint64_t rebuild_lba; /* 142 - 145 */
75 uint32_t generation; /* 146 - 147 */
93 uint8_t name[16]; /* 151 - 158 */
156 (long long unsigned)meta->total_sectors); in g_raid_md_sii_print()
157 printf("product_id 0x%04x\n", meta->product_id); in g_raid_md_sii_print()
158 printf("vendor_id 0x%04x\n", meta->vendor_id); in g_raid_md_sii_print()
159 printf("version_minor 0x%04x\n", meta->version_minor); in g_raid_md_sii_print()
160 printf("version_major 0x%04x\n", meta->version_major); in g_raid_md_sii_print()
161 printf("timestamp 0x%02x%02x%02x%02x%02x%02x\n", in g_raid_md_sii_print()
162 meta->timestamp[5], meta->timestamp[4], meta->timestamp[3], in g_raid_md_sii_print()
163 meta->timestamp[2], meta->timestamp[1], meta->timestamp[0]); in g_raid_md_sii_print()
164 printf("strip_sectors %d\n", meta->strip_sectors); in g_raid_md_sii_print()
165 printf("disk_number %d\n", meta->disk_number); in g_raid_md_sii_print()
166 printf("type 0x%02x\n", meta->type); in g_raid_md_sii_print()
167 printf("raid0_disks %d\n", meta->raid0_disks); in g_raid_md_sii_print()
168 printf("raid0_ident %d\n", meta->raid0_ident); in g_raid_md_sii_print()
169 printf("raid1_disks %d\n", meta->raid1_disks); in g_raid_md_sii_print()
170 printf("raid1_ident %d\n", meta->raid1_ident); in g_raid_md_sii_print()
172 (long long unsigned)meta->rebuild_lba); in g_raid_md_sii_print()
173 printf("generation %d\n", meta->generation); in g_raid_md_sii_print()
174 printf("disk_status %d\n", meta->disk_status); in g_raid_md_sii_print()
175 printf("raid_status %d\n", meta->raid_status); in g_raid_md_sii_print()
176 printf("raid_location %d\n", meta->raid_location); in g_raid_md_sii_print()
177 printf("disk_location %d\n", meta->disk_location); in g_raid_md_sii_print()
178 printf("auto_rebuild %d\n", meta->auto_rebuild); in g_raid_md_sii_print()
179 printf("name <%.16s>\n", meta->name); in g_raid_md_sii_print()
180 printf("checksum 0x%04x\n", meta->checksum); in g_raid_md_sii_print()
198 switch (meta->type) { in sii_meta_total_disks()
202 return (meta->raid0_disks); in sii_meta_total_disks()
204 return (meta->raid1_disks); in sii_meta_total_disks()
206 return (meta->raid0_disks * meta->raid1_disks); in sii_meta_total_disks()
218 if (pdmeta->type == SII_T_SPARE) in sii_meta_disk_pos()
219 return (-3); in sii_meta_disk_pos()
221 if (memcmp(&meta->timestamp, &pdmeta->timestamp, 6) != 0) in sii_meta_disk_pos()
222 return (-1); in sii_meta_disk_pos()
224 switch (pdmeta->type) { in sii_meta_disk_pos()
229 return (pdmeta->disk_number); in sii_meta_disk_pos()
231 return (pdmeta->raid1_ident * pdmeta->raid1_disks + in sii_meta_disk_pos()
232 pdmeta->raid0_ident); in sii_meta_disk_pos()
236 return (-1); in sii_meta_disk_pos()
244 strncpy(buf, meta->name, 16); in sii_meta_get_name()
246 for (i = 15; i >= 0; i--) { in sii_meta_get_name()
257 memset(meta->name, 0x20, 16); in sii_meta_put_name()
258 memcpy(meta->name, buf, MIN(strlen(buf), 16)); in sii_meta_put_name()
270 pp = cp->provider; in sii_meta_read()
271 if (pp->sectorsize < sizeof(*meta)) in sii_meta_read()
275 pp->mediasize - pp->sectorsize, pp->sectorsize, &error); in sii_meta_read()
278 pp->name, error); in sii_meta_read()
284 if (meta->vendor_id != 0x1095) { in sii_meta_read()
285 G_RAID_DEBUG(1, "SiI vendor ID check failed on %s (0x%04x)", in sii_meta_read()
286 pp->name, meta->vendor_id); in sii_meta_read()
292 if (meta->version_major != 2) { in sii_meta_read()
294 pp->name, meta->version_major, meta->version_minor); in sii_meta_read()
299 memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize)); in sii_meta_read()
306 G_RAID_DEBUG(1, "SiI checksum check failed on %s", pp->name); in sii_meta_read()
312 if (meta->type != SII_T_RAID0 && meta->type != SII_T_RAID1 && in sii_meta_read()
313 meta->type != SII_T_RAID01 && meta->type != SII_T_SPARE && in sii_meta_read()
314 meta->type != SII_T_RAID5 && meta->type != SII_T_CONCAT && in sii_meta_read()
315 meta->type != SII_T_JBOD) { in sii_meta_read()
316 G_RAID_DEBUG(1, "SiI unknown RAID level on %s (0x%02x)", in sii_meta_read()
317 pp->name, meta->type); in sii_meta_read()
333 pp = cp->provider; in sii_meta_write()
336 meta->checksum = 0; in sii_meta_write()
339 meta->checksum -= checksum; in sii_meta_write()
342 buf = malloc(pp->sectorsize, M_MD_SII, M_WAITOK | M_ZERO); in sii_meta_write()
348 pp->mediasize - (pp->sectorsize * (1 + 0x200 * i)), in sii_meta_write()
349 buf, pp->sectorsize); in sii_meta_write()
352 pp->name, error); in sii_meta_write()
368 pp = cp->provider; in sii_meta_erase()
369 buf = malloc(pp->sectorsize, M_MD_SII, M_WAITOK | M_ZERO); in sii_meta_erase()
373 pp->mediasize - (pp->sectorsize * (1 + 0x200 * i)), in sii_meta_erase()
374 buf, pp->sectorsize); in sii_meta_erase()
377 pp->name, error); in sii_meta_erase()
391 meta->total_sectors = cp->provider->mediasize / in sii_meta_write_spare()
392 cp->provider->sectorsize - 0x800; in sii_meta_write_spare()
393 meta->vendor_id = 0x1095; in sii_meta_write_spare()
394 meta->version_minor = 0; in sii_meta_write_spare()
395 meta->version_major = 2; in sii_meta_write_spare()
396 meta->timestamp[0] = arc4random(); in sii_meta_write_spare()
397 meta->timestamp[1] = arc4random(); in sii_meta_write_spare()
398 meta->timestamp[2] = arc4random(); in sii_meta_write_spare()
399 meta->timestamp[3] = arc4random(); in sii_meta_write_spare()
400 meta->timestamp[4] = arc4random(); in sii_meta_write_spare()
401 meta->timestamp[5] = arc4random(); in sii_meta_write_spare()
402 meta->type = SII_T_SPARE; in sii_meta_write_spare()
403 meta->generation = 1; in sii_meta_write_spare()
404 meta->raid1_ident = 0xff; in sii_meta_write_spare()
405 meta->raid_location = arc4random(); in sii_meta_write_spare()
417 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_sii_get_disk()
418 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_sii_get_disk()
419 if (pd->pd_disk_pos == id) in g_raid_md_sii_get_disk()
481 struct g_raid_md_sii_object *mdi; in g_raid_md_sii_start_disk() local
486 sc = disk->d_softc; in g_raid_md_sii_start_disk()
487 md = sc->sc_md; in g_raid_md_sii_start_disk()
488 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_sii_start_disk()
489 meta = mdi->mdio_meta; in g_raid_md_sii_start_disk()
490 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_sii_start_disk()
494 if (pd->pd_meta != NULL) in g_raid_md_sii_start_disk()
495 disk_pos = sii_meta_disk_pos(meta, pd->pd_meta); in g_raid_md_sii_start_disk()
497 disk_pos = -3; in g_raid_md_sii_start_disk()
501 if (!mdi->mdio_started) in g_raid_md_sii_start_disk()
504 * If we have already started - try to get use of the disk. in g_raid_md_sii_start_disk()
507 TAILQ_FOREACH(tmpdisk, &sc->sc_disks, d_next) { in g_raid_md_sii_start_disk()
508 if (tmpdisk->d_state != G_RAID_DISK_S_OFFLINE && in g_raid_md_sii_start_disk()
509 tmpdisk->d_state != G_RAID_DISK_S_FAILED) in g_raid_md_sii_start_disk()
512 TAILQ_FOREACH(sd, &tmpdisk->d_subdisks, sd_next) { in g_raid_md_sii_start_disk()
513 if (sd->sd_offset + sd->sd_size + 512 > in g_raid_md_sii_start_disk()
514 pd->pd_disk_size) { in g_raid_md_sii_start_disk()
517 pd->pd_disk_size, in g_raid_md_sii_start_disk()
518 sd->sd_offset + sd->sd_size + 512); in g_raid_md_sii_start_disk()
524 if (tmpdisk->d_state == G_RAID_DISK_S_OFFLINE) { in g_raid_md_sii_start_disk()
532 if (disk_pos == -3 || pd->pd_disk_pos == -3) { in g_raid_md_sii_start_disk()
542 oldpd = (struct g_raid_md_sii_perdisk *)olddisk->d_md_data; in g_raid_md_sii_start_disk()
543 disk_pos = oldpd->pd_disk_pos; in g_raid_md_sii_start_disk()
552 if (olddisk->d_state != G_RAID_DISK_S_OFFLINE) { in g_raid_md_sii_start_disk()
558 oldpd = (struct g_raid_md_sii_perdisk *)olddisk->d_md_data; in g_raid_md_sii_start_disk()
562 TAILQ_FOREACH_SAFE(sd, &olddisk->d_subdisks, sd_next, tmpsd) { in g_raid_md_sii_start_disk()
563 TAILQ_REMOVE(&olddisk->d_subdisks, sd, sd_next); in g_raid_md_sii_start_disk()
564 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_sii_start_disk()
565 sd->sd_disk = disk; in g_raid_md_sii_start_disk()
567 oldpd->pd_disk_pos = -2; in g_raid_md_sii_start_disk()
568 pd->pd_disk_pos = disk_pos; in g_raid_md_sii_start_disk()
570 /* If it was placeholder -- destroy it. */ in g_raid_md_sii_start_disk()
571 if (olddisk->d_state == G_RAID_DISK_S_OFFLINE) { in g_raid_md_sii_start_disk()
581 else if (pd->pd_meta->disk_status == SII_S_CURRENT || in g_raid_md_sii_start_disk()
582 pd->pd_meta->disk_status == SII_S_REBUILD) in g_raid_md_sii_start_disk()
586 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_sii_start_disk()
591 if (meta->type == SII_T_CONCAT || meta->type == SII_T_JBOD) in g_raid_md_sii_start_disk()
592 sd->sd_size = pd->pd_disk_size - 0x800 * 512; in g_raid_md_sii_start_disk()
595 /* New or ex-spare disk. */ in g_raid_md_sii_start_disk()
598 } else if (pd->pd_meta->disk_status == SII_S_REBUILD) { in g_raid_md_sii_start_disk()
602 if (pd->pd_meta->generation == meta->generation) in g_raid_md_sii_start_disk()
603 sd->sd_rebuild_pos = pd->pd_meta->rebuild_lba * 512; in g_raid_md_sii_start_disk()
605 sd->sd_rebuild_pos = 0; in g_raid_md_sii_start_disk()
606 } else if (pd->pd_meta->disk_status == SII_S_CURRENT) { in g_raid_md_sii_start_disk()
607 if (pd->pd_meta->raid_status == SII_S_ONLINE || in g_raid_md_sii_start_disk()
608 pd->pd_meta->generation != meta->generation) { in g_raid_md_sii_start_disk()
626 if (mdi->mdio_started) { in g_raid_md_sii_start_disk()
627 mdi->mdio_incomplete = in g_raid_md_sii_start_disk()
629 mdi->mdio_total_disks); in g_raid_md_sii_start_disk()
648 struct g_raid_md_sii_object *mdi; in g_raid_md_sii_refill() local
653 md = sc->sc_md; in g_raid_md_sii_refill()
654 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_sii_refill()
659 if (na == mdi->mdio_total_disks) in g_raid_md_sii_refill()
662 G_RAID_DEBUG1(1, md->mdo_softc, in g_raid_md_sii_refill()
664 "trying to refill.", na, mdi->mdio_total_disks); in g_raid_md_sii_refill()
667 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_sii_refill()
668 if (disk->d_state == G_RAID_DISK_S_STALE) { in g_raid_md_sii_refill()
670 if (disk->d_state == G_RAID_DISK_S_ACTIVE) in g_raid_md_sii_refill()
678 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_sii_refill()
679 if (disk->d_state == G_RAID_DISK_S_SPARE) { in g_raid_md_sii_refill()
681 if (disk->d_state == G_RAID_DISK_S_ACTIVE) in g_raid_md_sii_refill()
692 mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < in g_raid_md_sii_refill()
693 mdi->mdio_total_disks); in g_raid_md_sii_refill()
696 if (mdi->mdio_incomplete) { in g_raid_md_sii_refill()
708 struct g_raid_md_sii_object *mdi; in g_raid_md_sii_start() local
719 md = sc->sc_md; in g_raid_md_sii_start()
720 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_sii_start()
721 meta = mdi->mdio_meta; in g_raid_md_sii_start()
725 vol = g_raid_create_volume(sc, buf, -1); in g_raid_md_sii_start()
726 vol->v_mediasize = (off_t)meta->total_sectors * 512; in g_raid_md_sii_start()
727 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE; in g_raid_md_sii_start()
728 if (meta->type == SII_T_RAID0) { in g_raid_md_sii_start()
729 vol->v_raid_level = G_RAID_VOLUME_RL_RAID0; in g_raid_md_sii_start()
730 size = vol->v_mediasize / mdi->mdio_total_disks; in g_raid_md_sii_start()
731 } else if (meta->type == SII_T_RAID1) { in g_raid_md_sii_start()
732 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1; in g_raid_md_sii_start()
733 size = vol->v_mediasize; in g_raid_md_sii_start()
734 } else if (meta->type == SII_T_RAID01) { in g_raid_md_sii_start()
735 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; in g_raid_md_sii_start()
736 size = vol->v_mediasize / (mdi->mdio_total_disks / 2); in g_raid_md_sii_start()
737 } else if (meta->type == SII_T_CONCAT) { in g_raid_md_sii_start()
738 if (mdi->mdio_total_disks == 1) in g_raid_md_sii_start()
739 vol->v_raid_level = G_RAID_VOLUME_RL_SINGLE; in g_raid_md_sii_start()
741 vol->v_raid_level = G_RAID_VOLUME_RL_CONCAT; in g_raid_md_sii_start()
743 } else if (meta->type == SII_T_RAID5) { in g_raid_md_sii_start()
744 vol->v_raid_level = G_RAID_VOLUME_RL_RAID5; in g_raid_md_sii_start()
745 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_R5LS; in g_raid_md_sii_start()
746 size = vol->v_mediasize / (mdi->mdio_total_disks - 1); in g_raid_md_sii_start()
747 } else if (meta->type == SII_T_JBOD) { in g_raid_md_sii_start()
748 vol->v_raid_level = G_RAID_VOLUME_RL_SINGLE; in g_raid_md_sii_start()
751 vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; in g_raid_md_sii_start()
754 vol->v_strip_size = meta->strip_sectors * 512; //ZZZ in g_raid_md_sii_start()
755 vol->v_disks_count = mdi->mdio_total_disks; in g_raid_md_sii_start()
756 vol->v_sectorsize = 512; //ZZZ in g_raid_md_sii_start()
757 for (j = 0; j < vol->v_disks_count; j++) { in g_raid_md_sii_start()
758 sd = &vol->v_subdisks[j]; in g_raid_md_sii_start()
759 sd->sd_offset = 0; in g_raid_md_sii_start()
760 sd->sd_size = size; in g_raid_md_sii_start()
765 for (disk_pos = 0; disk_pos < mdi->mdio_total_disks; disk_pos++) { in g_raid_md_sii_start()
767 pd->pd_disk_pos = disk_pos; in g_raid_md_sii_start()
769 disk->d_md_data = (void *)pd; in g_raid_md_sii_start()
770 disk->d_state = G_RAID_DISK_S_OFFLINE; in g_raid_md_sii_start()
771 sd = &vol->v_subdisks[disk_pos]; in g_raid_md_sii_start()
772 sd->sd_disk = disk; in g_raid_md_sii_start()
773 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_sii_start()
783 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_sii_start()
784 if (disk->d_state != G_RAID_DISK_S_NONE) in g_raid_md_sii_start()
786 pd = disk->d_md_data; in g_raid_md_sii_start()
787 if (pd->pd_meta == NULL) in g_raid_md_sii_start()
790 gendiff = meta->generation - in g_raid_md_sii_start()
791 pd->pd_meta->generation; in g_raid_md_sii_start()
801 mdi->mdio_started = 1; in g_raid_md_sii_start()
810 callout_stop(&mdi->mdio_start_co); in g_raid_md_sii_start()
811 G_RAID_DEBUG1(1, sc, "root_mount_rel %p", mdi->mdio_rootmount); in g_raid_md_sii_start()
812 root_mount_rel(mdi->mdio_rootmount); in g_raid_md_sii_start()
813 mdi->mdio_rootmount = NULL; in g_raid_md_sii_start()
821 struct g_raid_md_sii_object *mdi; in g_raid_md_sii_new_disk() local
825 sc = disk->d_softc; in g_raid_md_sii_new_disk()
826 md = sc->sc_md; in g_raid_md_sii_new_disk()
827 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_sii_new_disk()
828 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_sii_new_disk()
829 pdmeta = pd->pd_meta; in g_raid_md_sii_new_disk()
831 if (mdi->mdio_started) { in g_raid_md_sii_new_disk()
835 if (mdi->mdio_meta == NULL || in g_raid_md_sii_new_disk()
836 ((int32_t)(pdmeta->generation - mdi->mdio_generation)) > 0) { in g_raid_md_sii_new_disk()
838 if (mdi->mdio_meta != NULL) in g_raid_md_sii_new_disk()
839 free(mdi->mdio_meta, M_MD_SII); in g_raid_md_sii_new_disk()
840 mdi->mdio_meta = sii_meta_copy(pdmeta); in g_raid_md_sii_new_disk()
841 mdi->mdio_generation = mdi->mdio_meta->generation; in g_raid_md_sii_new_disk()
842 mdi->mdio_total_disks = sii_meta_total_disks(pdmeta); in g_raid_md_sii_new_disk()
843 mdi->mdio_disks_present = 1; in g_raid_md_sii_new_disk()
844 } else if (pdmeta->generation == mdi->mdio_generation) { in g_raid_md_sii_new_disk()
845 mdi->mdio_disks_present++; in g_raid_md_sii_new_disk()
847 mdi->mdio_disks_present, in g_raid_md_sii_new_disk()
848 mdi->mdio_total_disks); in g_raid_md_sii_new_disk()
853 /* If we collected all needed disks - start array. */ in g_raid_md_sii_new_disk()
854 if (mdi->mdio_disks_present == mdi->mdio_total_disks) in g_raid_md_sii_new_disk()
864 struct g_raid_md_sii_object *mdi; in g_raid_sii_go() local
867 md = sc->sc_md; in g_raid_sii_go()
868 mdi = (struct g_raid_md_sii_object *)md; in g_raid_sii_go()
869 if (!mdi->mdio_started) { in g_raid_sii_go()
880 struct g_raid_md_sii_object *mdi; in g_raid_md_create_sii() local
883 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_create_sii()
884 mdi->mdio_timestamp[5] = arc4random(); in g_raid_md_create_sii()
885 mdi->mdio_timestamp[4] = arc4random(); in g_raid_md_create_sii()
886 mdi->mdio_timestamp[3] = arc4random(); in g_raid_md_create_sii()
887 mdi->mdio_timestamp[2] = arc4random(); in g_raid_md_create_sii()
888 mdi->mdio_timestamp[1] = arc4random(); in g_raid_md_create_sii()
889 mdi->mdio_timestamp[0] = arc4random(); in g_raid_md_create_sii()
890 mdi->mdio_location = arc4random(); in g_raid_md_create_sii()
891 mdi->mdio_generation = 0; in g_raid_md_create_sii()
892 snprintf(name, sizeof(name), "SiI-%02x%02x%02x%02x%02x%02x", in g_raid_md_create_sii()
893 mdi->mdio_timestamp[5], mdi->mdio_timestamp[4], in g_raid_md_create_sii()
894 mdi->mdio_timestamp[3], mdi->mdio_timestamp[2], in g_raid_md_create_sii()
895 mdi->mdio_timestamp[1], mdi->mdio_timestamp[0]); in g_raid_md_create_sii()
899 md->mdo_softc = sc; in g_raid_md_create_sii()
900 *gp = sc->sc_geom; in g_raid_md_create_sii()
910 struct g_raid_md_sii_object *mdi, *mdi1; in g_raid_md_taste_sii() local
920 G_RAID_DEBUG(1, "Tasting SiI on %s", cp->provider->name); in g_raid_md_taste_sii()
921 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_taste_sii()
922 pp = cp->provider; in g_raid_md_taste_sii()
929 if (pp->geom->rank == 1) in g_raid_md_taste_sii()
942 "SiI vendor mismatch 0x%04x != 0x1095", in g_raid_md_taste_sii()
951 if (disk_pos == -1) { in g_raid_md_taste_sii()
959 spare = (meta->type == SII_T_SPARE) ? 1 : 0; in g_raid_md_taste_sii()
965 LIST_FOREACH(geom, &mp->geom, geom) { in g_raid_md_taste_sii()
966 sc = geom->softc; in g_raid_md_taste_sii()
969 if (sc->sc_stopping != 0) in g_raid_md_taste_sii()
971 if (sc->sc_md->mdo_class != md->mdo_class) in g_raid_md_taste_sii()
973 mdi1 = (struct g_raid_md_sii_object *)sc->sc_md; in g_raid_md_taste_sii()
975 if (mdi1->mdio_incomplete) in g_raid_md_taste_sii()
978 if (mdi1->mdio_location == meta->raid_location && in g_raid_md_taste_sii()
979 memcmp(&mdi1->mdio_timestamp, in g_raid_md_taste_sii()
980 &meta->timestamp, 6) == 0) in g_raid_md_taste_sii()
987 G_RAID_DEBUG(1, "Found matching array %s", sc->sc_name); in g_raid_md_taste_sii()
990 } else if (spare) { /* Not found needy node -- left for later. */ in g_raid_md_taste_sii()
994 } else { /* Not found matching node -- create one. */ in g_raid_md_taste_sii()
996 memcpy(&mdi->mdio_timestamp, &meta->timestamp, 6); in g_raid_md_taste_sii()
997 mdi->mdio_location = meta->raid_location; in g_raid_md_taste_sii()
998 snprintf(name, sizeof(name), "SiI-%02x%02x%02x%02x%02x%02x", in g_raid_md_taste_sii()
999 mdi->mdio_timestamp[5], mdi->mdio_timestamp[4], in g_raid_md_taste_sii()
1000 mdi->mdio_timestamp[3], mdi->mdio_timestamp[2], in g_raid_md_taste_sii()
1001 mdi->mdio_timestamp[1], mdi->mdio_timestamp[0]); in g_raid_md_taste_sii()
1003 md->mdo_softc = sc; in g_raid_md_taste_sii()
1004 geom = sc->sc_geom; in g_raid_md_taste_sii()
1005 callout_init(&mdi->mdio_start_co, 1); in g_raid_md_taste_sii()
1006 callout_reset(&mdi->mdio_start_co, g_raid_start_timeout * hz, in g_raid_md_taste_sii()
1008 mdi->mdio_rootmount = root_mount_hold("GRAID-SiI"); in g_raid_md_taste_sii()
1009 G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); in g_raid_md_taste_sii()
1013 g_access(cp, -1, 0, 0); in g_raid_md_taste_sii()
1016 rcp->flags |= G_CF_DIRECT_RECEIVE; in g_raid_md_taste_sii()
1022 sx_xlock(&sc->sc_lock); in g_raid_md_taste_sii()
1025 pd->pd_meta = meta; in g_raid_md_taste_sii()
1027 pd->pd_disk_pos = -3; in g_raid_md_taste_sii()
1029 pd->pd_disk_pos = -1; in g_raid_md_taste_sii()
1031 pd->pd_disk_size = pp->mediasize; in g_raid_md_taste_sii()
1033 disk->d_md_data = (void *)pd; in g_raid_md_taste_sii()
1034 disk->d_consumer = rcp; in g_raid_md_taste_sii()
1035 rcp->private = disk; in g_raid_md_taste_sii()
1041 sx_xunlock(&sc->sc_lock); in g_raid_md_taste_sii()
1056 struct g_raid_md_sii_object *mdi; in g_raid_md_event_sii() local
1059 sc = md->mdo_softc; in g_raid_md_event_sii()
1060 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_event_sii()
1064 if (!mdi->mdio_started) in g_raid_md_event_sii()
1068 return (-1); in g_raid_md_event_sii()
1070 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_event_sii()
1074 if (pd->pd_disk_pos >= 0) { in g_raid_md_event_sii()
1076 if (disk->d_consumer) { in g_raid_md_event_sii()
1077 g_raid_kill_consumer(sc, disk->d_consumer); in g_raid_md_event_sii()
1078 disk->d_consumer = NULL; in g_raid_md_event_sii()
1080 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_event_sii()
1087 /* Otherwise -- delete. */ in g_raid_md_event_sii()
1096 if (g_raid_ndisks(sc, -1) == in g_raid_md_event_sii()
1103 return (-2); in g_raid_md_event_sii()
1114 struct g_raid_md_sii_object *mdi; in g_raid_md_ctl_sii() local
1126 sc = md->mdo_softc; in g_raid_md_ctl_sii()
1127 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_ctl_sii()
1134 return (-1); in g_raid_md_ctl_sii()
1139 return (-2); in g_raid_md_ctl_sii()
1144 return (-3); in g_raid_md_ctl_sii()
1147 levelname = "RAID5-LS"; in g_raid_md_ctl_sii()
1150 return (-4); in g_raid_md_ctl_sii()
1152 numdisks = *nargs - 3; in g_raid_md_ctl_sii()
1157 "(0x%02x/0x%02x), or number of disks (%d).", in g_raid_md_ctl_sii()
1159 return (-5); in g_raid_md_ctl_sii()
1170 error = -6; in g_raid_md_ctl_sii()
1183 error = -7; in g_raid_md_ctl_sii()
1186 pp = cp->provider; in g_raid_md_ctl_sii()
1189 pd->pd_disk_pos = i; in g_raid_md_ctl_sii()
1191 disk->d_md_data = (void *)pd; in g_raid_md_ctl_sii()
1192 disk->d_consumer = cp; in g_raid_md_ctl_sii()
1195 cp->private = disk; in g_raid_md_ctl_sii()
1200 pd->pd_disk_size = pp->mediasize; in g_raid_md_ctl_sii()
1201 if (size > pp->mediasize) in g_raid_md_ctl_sii()
1202 size = pp->mediasize; in g_raid_md_ctl_sii()
1203 if (sectorsize < pp->sectorsize) in g_raid_md_ctl_sii()
1204 sectorsize = pp->sectorsize; in g_raid_md_ctl_sii()
1211 return (-8); in g_raid_md_ctl_sii()
1215 size -= 0x800 * sectorsize; in g_raid_md_ctl_sii()
1225 return (-9); in g_raid_md_ctl_sii()
1238 return (-10); in g_raid_md_ctl_sii()
1242 return (-11); in g_raid_md_ctl_sii()
1246 return (-12); in g_raid_md_ctl_sii()
1253 size -= (size % sectorsize); in g_raid_md_ctl_sii()
1256 size -= (size % (2 * strip)); in g_raid_md_ctl_sii()
1258 size -= (size % strip); in g_raid_md_ctl_sii()
1261 return (-13); in g_raid_md_ctl_sii()
1265 return (-14); in g_raid_md_ctl_sii()
1269 mdi->mdio_total_disks = numdisks; in g_raid_md_ctl_sii()
1270 mdi->mdio_started = 1; in g_raid_md_ctl_sii()
1271 vol = g_raid_create_volume(sc, volname, -1); in g_raid_md_ctl_sii()
1272 vol->v_md_data = (void *)(intptr_t)0; in g_raid_md_ctl_sii()
1273 vol->v_raid_level = level; in g_raid_md_ctl_sii()
1274 vol->v_raid_level_qualifier = qual; in g_raid_md_ctl_sii()
1275 vol->v_strip_size = strip; in g_raid_md_ctl_sii()
1276 vol->v_disks_count = numdisks; in g_raid_md_ctl_sii()
1280 vol->v_mediasize = size * numdisks; in g_raid_md_ctl_sii()
1282 vol->v_mediasize = size; in g_raid_md_ctl_sii()
1284 vol->v_mediasize = size * (numdisks - 1); in g_raid_md_ctl_sii()
1286 vol->v_mediasize = ((size * numdisks) / strip / 2) * in g_raid_md_ctl_sii()
1289 vol->v_sectorsize = sectorsize; in g_raid_md_ctl_sii()
1293 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_sii()
1294 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_ctl_sii()
1295 sd = &vol->v_subdisks[pd->pd_disk_pos]; in g_raid_md_ctl_sii()
1296 sd->sd_disk = disk; in g_raid_md_ctl_sii()
1297 sd->sd_offset = 0; in g_raid_md_ctl_sii()
1298 sd->sd_size = size; in g_raid_md_ctl_sii()
1299 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_ctl_sii()
1300 if (sd->sd_disk->d_consumer != NULL) { in g_raid_md_ctl_sii()
1329 return (-4); in g_raid_md_ctl_sii()
1332 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_sii()
1333 if (disk->d_consumer) in g_raid_md_ctl_sii()
1334 sii_meta_erase(disk->d_consumer); in g_raid_md_ctl_sii()
1343 return (-1); in g_raid_md_ctl_sii()
1350 error = -2; in g_raid_md_ctl_sii()
1356 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_sii()
1357 if (disk->d_consumer != NULL && in g_raid_md_ctl_sii()
1358 disk->d_consumer->provider != NULL && in g_raid_md_ctl_sii()
1359 strcmp(disk->d_consumer->provider->name, in g_raid_md_ctl_sii()
1366 error = -3; in g_raid_md_ctl_sii()
1375 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_ctl_sii()
1378 sii_meta_erase(disk->d_consumer); in g_raid_md_ctl_sii()
1381 if (pd->pd_disk_pos >= 0) { in g_raid_md_ctl_sii()
1383 g_raid_kill_consumer(sc, disk->d_consumer); in g_raid_md_ctl_sii()
1384 disk->d_consumer = NULL; in g_raid_md_ctl_sii()
1385 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_ctl_sii()
1392 /* Otherwise -- delete. */ in g_raid_md_ctl_sii()
1402 if (g_raid_ndisks(sc, -1) == in g_raid_md_ctl_sii()
1412 return (-1); in g_raid_md_ctl_sii()
1421 error = -3; in g_raid_md_ctl_sii()
1432 error = -4; in g_raid_md_ctl_sii()
1435 pp = cp->provider; in g_raid_md_ctl_sii()
1438 pd->pd_disk_pos = -3; in g_raid_md_ctl_sii()
1439 pd->pd_disk_size = pp->mediasize; in g_raid_md_ctl_sii()
1442 disk->d_consumer = cp; in g_raid_md_ctl_sii()
1443 disk->d_md_data = (void *)pd; in g_raid_md_ctl_sii()
1444 cp->private = disk; in g_raid_md_ctl_sii()
1451 if (disk->d_state == G_RAID_DISK_S_SPARE) { in g_raid_md_ctl_sii()
1454 } else if (disk->d_state != G_RAID_DISK_S_ACTIVE) { in g_raid_md_ctl_sii()
1458 error = -8; in g_raid_md_ctl_sii()
1469 return (-100); in g_raid_md_ctl_sii()
1480 struct g_raid_md_sii_object *mdi; in g_raid_md_write_sii() local
1485 sc = md->mdo_softc; in g_raid_md_write_sii()
1486 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_write_sii()
1488 if (sc->sc_stopping == G_RAID_DESTROY_HARD) in g_raid_md_write_sii()
1492 mdi->mdio_generation++; in g_raid_md_write_sii()
1495 vol = TAILQ_FIRST(&sc->sc_volumes); in g_raid_md_write_sii()
1499 if (mdi->mdio_meta) in g_raid_md_write_sii()
1500 memcpy(meta, mdi->mdio_meta, sizeof(*meta)); in g_raid_md_write_sii()
1501 meta->total_sectors = vol->v_mediasize / vol->v_sectorsize; in g_raid_md_write_sii()
1502 meta->vendor_id = 0x1095; in g_raid_md_write_sii()
1503 meta->version_minor = 0; in g_raid_md_write_sii()
1504 meta->version_major = 2; in g_raid_md_write_sii()
1505 memcpy(&meta->timestamp, &mdi->mdio_timestamp, 6); in g_raid_md_write_sii()
1506 meta->strip_sectors = vol->v_strip_size / vol->v_sectorsize; in g_raid_md_write_sii()
1507 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0) { in g_raid_md_write_sii()
1508 meta->type = SII_T_RAID0; in g_raid_md_write_sii()
1509 meta->raid0_disks = vol->v_disks_count; in g_raid_md_write_sii()
1510 meta->raid1_disks = 0xff; in g_raid_md_write_sii()
1511 } else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) { in g_raid_md_write_sii()
1512 meta->type = SII_T_RAID1; in g_raid_md_write_sii()
1513 meta->raid0_disks = 0xff; in g_raid_md_write_sii()
1514 meta->raid1_disks = vol->v_disks_count; in g_raid_md_write_sii()
1515 } else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) { in g_raid_md_write_sii()
1516 meta->type = SII_T_RAID01; in g_raid_md_write_sii()
1517 meta->raid0_disks = vol->v_disks_count / 2; in g_raid_md_write_sii()
1518 meta->raid1_disks = 2; in g_raid_md_write_sii()
1519 } else if (vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT || in g_raid_md_write_sii()
1520 vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE) { in g_raid_md_write_sii()
1521 meta->type = SII_T_JBOD; in g_raid_md_write_sii()
1522 meta->raid0_disks = vol->v_disks_count; in g_raid_md_write_sii()
1523 meta->raid1_disks = 0xff; in g_raid_md_write_sii()
1525 meta->type = SII_T_RAID5; in g_raid_md_write_sii()
1526 meta->raid0_disks = vol->v_disks_count; in g_raid_md_write_sii()
1527 meta->raid1_disks = 0xff; in g_raid_md_write_sii()
1529 meta->generation = mdi->mdio_generation; in g_raid_md_write_sii()
1530 meta->raid_status = vol->v_dirty ? SII_S_ONLINE : SII_S_AVAILABLE; in g_raid_md_write_sii()
1531 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_write_sii()
1532 sd = &vol->v_subdisks[i]; in g_raid_md_write_sii()
1533 if (sd->sd_state == G_RAID_SUBDISK_S_STALE || in g_raid_md_write_sii()
1534 sd->sd_state == G_RAID_SUBDISK_S_RESYNC) in g_raid_md_write_sii()
1535 meta->raid_status = SII_S_ONLINE; in g_raid_md_write_sii()
1537 meta->raid_location = mdi->mdio_location; in g_raid_md_write_sii()
1538 sii_meta_put_name(meta, vol->v_name); in g_raid_md_write_sii()
1541 if (mdi->mdio_meta != NULL) in g_raid_md_write_sii()
1542 free(mdi->mdio_meta, M_MD_SII); in g_raid_md_write_sii()
1543 mdi->mdio_meta = meta; in g_raid_md_write_sii()
1544 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_write_sii()
1545 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_write_sii()
1546 if (disk->d_state != G_RAID_DISK_S_ACTIVE) in g_raid_md_write_sii()
1548 if (pd->pd_meta != NULL) { in g_raid_md_write_sii()
1549 free(pd->pd_meta, M_MD_SII); in g_raid_md_write_sii()
1550 pd->pd_meta = NULL; in g_raid_md_write_sii()
1552 pd->pd_meta = sii_meta_copy(meta); in g_raid_md_write_sii()
1553 if ((sd = TAILQ_FIRST(&disk->d_subdisks)) != NULL) { in g_raid_md_write_sii()
1554 if (sd->sd_state < G_RAID_SUBDISK_S_NEW) in g_raid_md_write_sii()
1555 pd->pd_meta->disk_status = SII_S_DROPPED; in g_raid_md_write_sii()
1556 else if (sd->sd_state < G_RAID_SUBDISK_S_STALE) { in g_raid_md_write_sii()
1557 pd->pd_meta->disk_status = SII_S_REBUILD; in g_raid_md_write_sii()
1558 pd->pd_meta->rebuild_lba = in g_raid_md_write_sii()
1559 sd->sd_rebuild_pos / vol->v_sectorsize; in g_raid_md_write_sii()
1561 pd->pd_meta->disk_status = SII_S_CURRENT; in g_raid_md_write_sii()
1562 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) { in g_raid_md_write_sii()
1563 pd->pd_meta->disk_number = sd->sd_pos; in g_raid_md_write_sii()
1564 pd->pd_meta->raid0_ident = 0xff; in g_raid_md_write_sii()
1565 pd->pd_meta->raid1_ident = 0; in g_raid_md_write_sii()
1566 } else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) { in g_raid_md_write_sii()
1567 pd->pd_meta->disk_number = sd->sd_pos / meta->raid1_disks; in g_raid_md_write_sii()
1568 pd->pd_meta->raid0_ident = sd->sd_pos % meta->raid1_disks; in g_raid_md_write_sii()
1569 pd->pd_meta->raid1_ident = sd->sd_pos / meta->raid1_disks; in g_raid_md_write_sii()
1571 pd->pd_meta->disk_number = sd->sd_pos; in g_raid_md_write_sii()
1572 pd->pd_meta->raid0_ident = 0; in g_raid_md_write_sii()
1573 pd->pd_meta->raid1_ident = 0xff; in g_raid_md_write_sii()
1578 g_raid_md_sii_print(pd->pd_meta); in g_raid_md_write_sii()
1579 sii_meta_write(disk->d_consumer, pd->pd_meta); in g_raid_md_write_sii()
1592 sc = md->mdo_softc; in g_raid_md_fail_disk_sii()
1593 pd = (struct g_raid_md_sii_perdisk *)tdisk->d_md_data; in g_raid_md_fail_disk_sii()
1596 if (pd->pd_disk_pos < 0) in g_raid_md_fail_disk_sii()
1597 return (-1); in g_raid_md_fail_disk_sii()
1603 if (tdisk->d_consumer) { in g_raid_md_fail_disk_sii()
1604 if (pd->pd_meta) { in g_raid_md_fail_disk_sii()
1605 pd->pd_meta->disk_status = SII_S_REMOVED; in g_raid_md_fail_disk_sii()
1606 sii_meta_write(tdisk->d_consumer, pd->pd_meta); in g_raid_md_fail_disk_sii()
1608 sii_meta_erase(tdisk->d_consumer); in g_raid_md_fail_disk_sii()
1613 TAILQ_FOREACH(sd, &tdisk->d_subdisks, sd_next) { in g_raid_md_fail_disk_sii()
1624 if (g_raid_ndisks(sc, -1) == in g_raid_md_fail_disk_sii()
1638 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; in g_raid_md_free_disk_sii()
1639 if (pd->pd_meta != NULL) { in g_raid_md_free_disk_sii()
1640 free(pd->pd_meta, M_MD_SII); in g_raid_md_free_disk_sii()
1641 pd->pd_meta = NULL; in g_raid_md_free_disk_sii()
1644 disk->d_md_data = NULL; in g_raid_md_free_disk_sii()
1651 struct g_raid_md_sii_object *mdi; in g_raid_md_free_sii() local
1653 mdi = (struct g_raid_md_sii_object *)md; in g_raid_md_free_sii()
1654 if (!mdi->mdio_started) { in g_raid_md_free_sii()
1655 mdi->mdio_started = 0; in g_raid_md_free_sii()
1656 callout_stop(&mdi->mdio_start_co); in g_raid_md_free_sii()
1657 G_RAID_DEBUG1(1, md->mdo_softc, in g_raid_md_free_sii()
1658 "root_mount_rel %p", mdi->mdio_rootmount); in g_raid_md_free_sii()
1659 root_mount_rel(mdi->mdio_rootmount); in g_raid_md_free_sii()
1660 mdi->mdio_rootmount = NULL; in g_raid_md_free_sii()
1662 if (mdi->mdio_meta != NULL) { in g_raid_md_free_sii()
1663 free(mdi->mdio_meta, M_MD_SII); in g_raid_md_free_sii()
1664 mdi->mdio_meta = NULL; in g_raid_md_free_sii()