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>
160 printf("nvidia_id <%.8s>\n", meta->nvidia_id); in g_raid_md_nvidia_print()
161 printf("config_size %u\n", meta->config_size); in g_raid_md_nvidia_print()
162 printf("checksum 0x%08x\n", meta->checksum); in g_raid_md_nvidia_print()
163 printf("version 0x%04x\n", meta->version); in g_raid_md_nvidia_print()
164 printf("disk_number %d\n", meta->disk_number); in g_raid_md_nvidia_print()
165 printf("dummy_0 0x%02x\n", meta->dummy_0); in g_raid_md_nvidia_print()
166 printf("total_sectors %u\n", meta->total_sectors); in g_raid_md_nvidia_print()
167 printf("sector_size %u\n", meta->sector_size); in g_raid_md_nvidia_print()
168 printf("name <%.16s>\n", meta->name); in g_raid_md_nvidia_print()
169 printf("revision 0x%02x%02x%02x%02x\n", in g_raid_md_nvidia_print()
170 meta->revision[0], meta->revision[1], in g_raid_md_nvidia_print()
171 meta->revision[2], meta->revision[3]); in g_raid_md_nvidia_print()
172 printf("disk_status 0x%08x\n", meta->disk_status); in g_raid_md_nvidia_print()
173 printf("magic_0 0x%08x\n", meta->magic_0); in g_raid_md_nvidia_print()
174 printf("volume_id 0x%016jx%016jx\n", in g_raid_md_nvidia_print()
175 meta->volume_id[1], meta->volume_id[0]); in g_raid_md_nvidia_print()
176 printf("state 0x%02x\n", meta->state); in g_raid_md_nvidia_print()
177 printf("array_width %u\n", meta->array_width); in g_raid_md_nvidia_print()
178 printf("total_disks %u\n", meta->total_disks); in g_raid_md_nvidia_print()
179 printf("orig_array_width %u\n", meta->orig_array_width); in g_raid_md_nvidia_print()
180 printf("type 0x%04x\n", meta->type); in g_raid_md_nvidia_print()
181 printf("dummy_3 0x%04x\n", meta->dummy_3); in g_raid_md_nvidia_print()
182 printf("strip_sectors %u\n", meta->strip_sectors); in g_raid_md_nvidia_print()
183 printf("strip_bytes %u\n", meta->strip_bytes); in g_raid_md_nvidia_print()
184 printf("strip_shift %u\n", meta->strip_shift); in g_raid_md_nvidia_print()
185 printf("strip_mask 0x%08x\n", meta->strip_mask); in g_raid_md_nvidia_print()
186 printf("stripe_sectors %u\n", meta->stripe_sectors); in g_raid_md_nvidia_print()
187 printf("stripe_bytes %u\n", meta->stripe_bytes); in g_raid_md_nvidia_print()
188 printf("rebuild_lba %u\n", meta->rebuild_lba); in g_raid_md_nvidia_print()
189 printf("orig_type 0x%04x\n", meta->orig_type); in g_raid_md_nvidia_print()
190 printf("orig_total_sectors %u\n", meta->orig_total_sectors); in g_raid_md_nvidia_print()
191 printf("status 0x%08x\n", meta->status); in g_raid_md_nvidia_print()
210 if (md_disk_pos >= 0 && meta->type == NVIDIA_T_RAID01) { in nvidia_meta_translate_disk()
211 disk_pos = (md_disk_pos / meta->array_width) + in nvidia_meta_translate_disk()
212 (md_disk_pos % meta->array_width) * meta->array_width; in nvidia_meta_translate_disk()
223 strncpy(buf, meta->name, 16); in nvidia_meta_get_name()
225 for (i = 15; i >= 0; i--) { in nvidia_meta_get_name()
236 memset(meta->name, 0x20, 16); in nvidia_meta_put_name()
237 memcpy(meta->name, buf, MIN(strlen(buf), 16)); in nvidia_meta_put_name()
249 pp = cp->provider; in nvidia_meta_read()
250 if (pp->sectorsize < sizeof(*meta)) in nvidia_meta_read()
254 pp->mediasize - 2 * pp->sectorsize, pp->sectorsize, &error); in nvidia_meta_read()
257 pp->name, error); in nvidia_meta_read()
263 if (strncmp(meta->nvidia_id, NVIDIA_MAGIC, strlen(NVIDIA_MAGIC))) { in nvidia_meta_read()
264 G_RAID_DEBUG(1, "NVIDIA signature check failed on %s", pp->name); in nvidia_meta_read()
268 if (meta->config_size > 128 || in nvidia_meta_read()
269 meta->config_size < 30) { in nvidia_meta_read()
271 meta->config_size); in nvidia_meta_read()
276 memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize)); in nvidia_meta_read()
281 i = 0; i < meta->config_size; i++) in nvidia_meta_read()
284 G_RAID_DEBUG(1, "NVIDIA checksum check failed on %s", pp->name); in nvidia_meta_read()
290 if (meta->state != NVIDIA_S_IDLE && meta->state != NVIDIA_S_INIT && in nvidia_meta_read()
291 meta->state != NVIDIA_S_REBUILD && meta->state != NVIDIA_S_SYNC) { in nvidia_meta_read()
292 G_RAID_DEBUG(1, "NVIDIA unknown state on %s (0x%02x)", in nvidia_meta_read()
293 pp->name, meta->state); in nvidia_meta_read()
299 if (meta->type != NVIDIA_T_RAID0 && meta->type != NVIDIA_T_RAID1 && in nvidia_meta_read()
300 meta->type != NVIDIA_T_RAID3 && meta->type != NVIDIA_T_RAID5 && in nvidia_meta_read()
301 meta->type != NVIDIA_T_RAID5_SYM && in nvidia_meta_read()
302 meta->type != NVIDIA_T_RAID01 && meta->type != NVIDIA_T_CONCAT) { in nvidia_meta_read()
303 G_RAID_DEBUG(1, "NVIDIA unknown RAID level on %s (0x%02x)", in nvidia_meta_read()
304 pp->name, meta->type); in nvidia_meta_read()
320 pp = cp->provider; in nvidia_meta_write()
323 meta->checksum = 0; in nvidia_meta_write()
325 i = 0; i < meta->config_size; i++) in nvidia_meta_write()
327 meta->checksum -= checksum; in nvidia_meta_write()
330 buf = malloc(pp->sectorsize, M_MD_NVIDIA, M_WAITOK | M_ZERO); in nvidia_meta_write()
335 pp->mediasize - 2 * pp->sectorsize, buf, pp->sectorsize); in nvidia_meta_write()
338 pp->name, error); in nvidia_meta_write()
352 pp = cp->provider; in nvidia_meta_erase()
353 buf = malloc(pp->sectorsize, M_MD_NVIDIA, M_WAITOK | M_ZERO); in nvidia_meta_erase()
355 pp->mediasize - 2 * pp->sectorsize, buf, pp->sectorsize); in nvidia_meta_erase()
358 pp->name, error); in nvidia_meta_erase()
370 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_nvidia_get_disk()
371 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_nvidia_get_disk()
372 if (pd->pd_disk_pos == id) in g_raid_md_nvidia_get_disk()
433 struct g_raid_md_nvidia_object *mdi; in g_raid_md_nvidia_start_disk() local
438 sc = disk->d_softc; in g_raid_md_nvidia_start_disk()
439 md = sc->sc_md; in g_raid_md_nvidia_start_disk()
440 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_nvidia_start_disk()
441 meta = mdi->mdio_meta; in g_raid_md_nvidia_start_disk()
442 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_nvidia_start_disk()
446 if (pd->pd_meta != NULL) { in g_raid_md_nvidia_start_disk()
447 disk_pos = pd->pd_meta->disk_number; in g_raid_md_nvidia_start_disk()
448 if (disk_pos >= meta->total_disks || mdi->mdio_started) in g_raid_md_nvidia_start_disk()
449 disk_pos = -3; in g_raid_md_nvidia_start_disk()
451 disk_pos = -3; in g_raid_md_nvidia_start_disk()
457 if (!mdi->mdio_started) in g_raid_md_nvidia_start_disk()
460 * If we have already started - try to get use of the disk. in g_raid_md_nvidia_start_disk()
463 TAILQ_FOREACH(tmpdisk, &sc->sc_disks, d_next) { in g_raid_md_nvidia_start_disk()
464 if (tmpdisk->d_state != G_RAID_DISK_S_OFFLINE && in g_raid_md_nvidia_start_disk()
465 tmpdisk->d_state != G_RAID_DISK_S_FAILED) in g_raid_md_nvidia_start_disk()
468 TAILQ_FOREACH(sd, &tmpdisk->d_subdisks, sd_next) { in g_raid_md_nvidia_start_disk()
469 if (sd->sd_offset + sd->sd_size + 2 * 512 > in g_raid_md_nvidia_start_disk()
470 pd->pd_disk_size) { in g_raid_md_nvidia_start_disk()
473 pd->pd_disk_size, in g_raid_md_nvidia_start_disk()
474 sd->sd_offset + sd->sd_size + 512); in g_raid_md_nvidia_start_disk()
480 if (tmpdisk->d_state == G_RAID_DISK_S_OFFLINE) { in g_raid_md_nvidia_start_disk()
491 oldpd = (struct g_raid_md_nvidia_perdisk *)olddisk->d_md_data; in g_raid_md_nvidia_start_disk()
492 disk_pos = oldpd->pd_disk_pos; in g_raid_md_nvidia_start_disk()
501 if (olddisk->d_state != G_RAID_DISK_S_OFFLINE) { in g_raid_md_nvidia_start_disk()
507 oldpd = (struct g_raid_md_nvidia_perdisk *)olddisk->d_md_data; in g_raid_md_nvidia_start_disk()
511 TAILQ_FOREACH_SAFE(sd, &olddisk->d_subdisks, sd_next, tmpsd) { in g_raid_md_nvidia_start_disk()
512 TAILQ_REMOVE(&olddisk->d_subdisks, sd, sd_next); in g_raid_md_nvidia_start_disk()
513 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_nvidia_start_disk()
514 sd->sd_disk = disk; in g_raid_md_nvidia_start_disk()
516 oldpd->pd_disk_pos = -2; in g_raid_md_nvidia_start_disk()
517 pd->pd_disk_pos = disk_pos; in g_raid_md_nvidia_start_disk()
519 /* If it was placeholder -- destroy it. */ in g_raid_md_nvidia_start_disk()
520 if (olddisk->d_state == G_RAID_DISK_S_OFFLINE) { in g_raid_md_nvidia_start_disk()
530 else// if (pd->pd_meta->disk_status == NVIDIA_S_CURRENT || in g_raid_md_nvidia_start_disk()
531 //pd->pd_meta->disk_status == NVIDIA_S_REBUILD) in g_raid_md_nvidia_start_disk()
535 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_nvidia_start_disk()
540 if (meta->type == NVIDIA_T_CONCAT) in g_raid_md_nvidia_start_disk()
541 sd->sd_size = pd->pd_disk_size - 0x800 * 512; in g_raid_md_nvidia_start_disk()
544 /* New or ex-spare disk. */ in g_raid_md_nvidia_start_disk()
547 } else if (meta->state == NVIDIA_S_REBUILD && in g_raid_md_nvidia_start_disk()
548 (pd->pd_meta->disk_status & 0x100)) { in g_raid_md_nvidia_start_disk()
552 sd->sd_rebuild_pos = (off_t)pd->pd_meta->rebuild_lba / in g_raid_md_nvidia_start_disk()
553 meta->array_width * pd->pd_meta->sector_size; in g_raid_md_nvidia_start_disk()
554 } else if (meta->state == NVIDIA_S_SYNC) { in g_raid_md_nvidia_start_disk()
558 sd->sd_rebuild_pos = (off_t)pd->pd_meta->rebuild_lba / in g_raid_md_nvidia_start_disk()
559 meta->array_width * pd->pd_meta->sector_size; in g_raid_md_nvidia_start_disk()
570 if (mdi->mdio_started) { in g_raid_md_nvidia_start_disk()
571 mdi->mdio_incomplete = in g_raid_md_nvidia_start_disk()
573 mdi->mdio_total_disks); in g_raid_md_nvidia_start_disk()
592 struct g_raid_md_nvidia_object *mdi; in g_raid_md_nvidia_refill() local
597 md = sc->sc_md; in g_raid_md_nvidia_refill()
598 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_nvidia_refill()
603 if (na == mdi->mdio_total_disks) in g_raid_md_nvidia_refill()
606 G_RAID_DEBUG1(1, md->mdo_softc, in g_raid_md_nvidia_refill()
608 "trying to refill.", na, mdi->mdio_total_disks); in g_raid_md_nvidia_refill()
611 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_nvidia_refill()
612 if (disk->d_state == G_RAID_DISK_S_STALE) { in g_raid_md_nvidia_refill()
614 if (disk->d_state == G_RAID_DISK_S_ACTIVE) in g_raid_md_nvidia_refill()
622 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_nvidia_refill()
623 if (disk->d_state == G_RAID_DISK_S_SPARE) { in g_raid_md_nvidia_refill()
625 if (disk->d_state == G_RAID_DISK_S_ACTIVE) in g_raid_md_nvidia_refill()
636 mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < in g_raid_md_nvidia_refill()
637 mdi->mdio_total_disks); in g_raid_md_nvidia_refill()
640 if (mdi->mdio_incomplete) { in g_raid_md_nvidia_refill()
652 struct g_raid_md_nvidia_object *mdi; in g_raid_md_nvidia_start() local
662 md = sc->sc_md; in g_raid_md_nvidia_start()
663 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_nvidia_start()
664 meta = mdi->mdio_meta; in g_raid_md_nvidia_start()
668 vol = g_raid_create_volume(sc, buf, -1); in g_raid_md_nvidia_start()
669 vol->v_mediasize = (off_t)meta->total_sectors * 512; in g_raid_md_nvidia_start()
670 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE; in g_raid_md_nvidia_start()
671 if (meta->type == NVIDIA_T_RAID0) { in g_raid_md_nvidia_start()
672 vol->v_raid_level = G_RAID_VOLUME_RL_RAID0; in g_raid_md_nvidia_start()
673 size = vol->v_mediasize / mdi->mdio_total_disks; in g_raid_md_nvidia_start()
674 } else if (meta->type == NVIDIA_T_RAID1) { in g_raid_md_nvidia_start()
675 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1; in g_raid_md_nvidia_start()
676 size = vol->v_mediasize; in g_raid_md_nvidia_start()
677 } else if (meta->type == NVIDIA_T_RAID01) { in g_raid_md_nvidia_start()
678 vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; in g_raid_md_nvidia_start()
679 size = vol->v_mediasize / (mdi->mdio_total_disks / 2); in g_raid_md_nvidia_start()
680 } else if (meta->type == NVIDIA_T_CONCAT) { in g_raid_md_nvidia_start()
681 if (mdi->mdio_total_disks == 1) in g_raid_md_nvidia_start()
682 vol->v_raid_level = G_RAID_VOLUME_RL_SINGLE; in g_raid_md_nvidia_start()
684 vol->v_raid_level = G_RAID_VOLUME_RL_CONCAT; in g_raid_md_nvidia_start()
686 } else if (meta->type == NVIDIA_T_RAID5) { in g_raid_md_nvidia_start()
687 vol->v_raid_level = G_RAID_VOLUME_RL_RAID5; in g_raid_md_nvidia_start()
688 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_R5LA; in g_raid_md_nvidia_start()
689 size = vol->v_mediasize / (mdi->mdio_total_disks - 1); in g_raid_md_nvidia_start()
690 } else if (meta->type == NVIDIA_T_RAID5_SYM) { in g_raid_md_nvidia_start()
691 vol->v_raid_level = G_RAID_VOLUME_RL_RAID5; in g_raid_md_nvidia_start()
692 vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_R5LS; in g_raid_md_nvidia_start()
693 size = vol->v_mediasize / (mdi->mdio_total_disks - 1); in g_raid_md_nvidia_start()
695 vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; in g_raid_md_nvidia_start()
698 vol->v_strip_size = meta->strip_sectors * 512; //ZZZ in g_raid_md_nvidia_start()
699 vol->v_disks_count = mdi->mdio_total_disks; in g_raid_md_nvidia_start()
700 vol->v_sectorsize = 512; //ZZZ in g_raid_md_nvidia_start()
701 for (j = 0; j < vol->v_disks_count; j++) { in g_raid_md_nvidia_start()
702 sd = &vol->v_subdisks[j]; in g_raid_md_nvidia_start()
703 sd->sd_offset = 0; in g_raid_md_nvidia_start()
704 sd->sd_size = size; in g_raid_md_nvidia_start()
709 for (disk_pos = 0; disk_pos < mdi->mdio_total_disks; disk_pos++) { in g_raid_md_nvidia_start()
711 pd->pd_disk_pos = disk_pos; in g_raid_md_nvidia_start()
713 disk->d_md_data = (void *)pd; in g_raid_md_nvidia_start()
714 disk->d_state = G_RAID_DISK_S_OFFLINE; in g_raid_md_nvidia_start()
715 sd = &vol->v_subdisks[disk_pos]; in g_raid_md_nvidia_start()
716 sd->sd_disk = disk; in g_raid_md_nvidia_start()
717 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_nvidia_start()
722 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_nvidia_start()
723 if (disk->d_state == G_RAID_DISK_S_NONE) { in g_raid_md_nvidia_start()
730 mdi->mdio_started = 1; in g_raid_md_nvidia_start()
739 callout_stop(&mdi->mdio_start_co); in g_raid_md_nvidia_start()
740 G_RAID_DEBUG1(1, sc, "root_mount_rel %p", mdi->mdio_rootmount); in g_raid_md_nvidia_start()
741 root_mount_rel(mdi->mdio_rootmount); in g_raid_md_nvidia_start()
742 mdi->mdio_rootmount = NULL; in g_raid_md_nvidia_start()
750 struct g_raid_md_nvidia_object *mdi; in g_raid_md_nvidia_new_disk() local
754 sc = disk->d_softc; in g_raid_md_nvidia_new_disk()
755 md = sc->sc_md; in g_raid_md_nvidia_new_disk()
756 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_nvidia_new_disk()
757 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_nvidia_new_disk()
758 pdmeta = pd->pd_meta; in g_raid_md_nvidia_new_disk()
760 if (mdi->mdio_started) { in g_raid_md_nvidia_new_disk()
764 if (mdi->mdio_meta == NULL || in g_raid_md_nvidia_new_disk()
765 mdi->mdio_meta->disk_number >= mdi->mdio_meta->total_disks) { in g_raid_md_nvidia_new_disk()
767 if (mdi->mdio_meta != NULL) in g_raid_md_nvidia_new_disk()
768 free(mdi->mdio_meta, M_MD_NVIDIA); in g_raid_md_nvidia_new_disk()
769 mdi->mdio_meta = nvidia_meta_copy(pdmeta); in g_raid_md_nvidia_new_disk()
770 mdi->mdio_total_disks = pdmeta->total_disks; in g_raid_md_nvidia_new_disk()
771 mdi->mdio_disks_present = 1; in g_raid_md_nvidia_new_disk()
772 } else if (pdmeta->disk_number < mdi->mdio_meta->total_disks) { in g_raid_md_nvidia_new_disk()
773 mdi->mdio_disks_present++; in g_raid_md_nvidia_new_disk()
775 mdi->mdio_disks_present, in g_raid_md_nvidia_new_disk()
776 mdi->mdio_total_disks); in g_raid_md_nvidia_new_disk()
780 /* If we collected all needed disks - start array. */ in g_raid_md_nvidia_new_disk()
781 if (mdi->mdio_disks_present == mdi->mdio_total_disks) in g_raid_md_nvidia_new_disk()
791 struct g_raid_md_nvidia_object *mdi; in g_raid_nvidia_go() local
794 md = sc->sc_md; in g_raid_nvidia_go()
795 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_nvidia_go()
796 if (!mdi->mdio_started) { in g_raid_nvidia_go()
807 struct g_raid_md_nvidia_object *mdi; in g_raid_md_create_nvidia() local
810 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_create_nvidia()
811 arc4rand(&mdi->mdio_volume_id, 16, 0); in g_raid_md_create_nvidia()
812 snprintf(name, sizeof(name), "NVIDIA-%d", in g_raid_md_create_nvidia()
817 md->mdo_softc = sc; in g_raid_md_create_nvidia()
818 *gp = sc->sc_geom; in g_raid_md_create_nvidia()
828 struct g_raid_md_nvidia_object *mdi, *mdi1; in g_raid_md_taste_nvidia() local
838 G_RAID_DEBUG(1, "Tasting NVIDIA on %s", cp->provider->name); in g_raid_md_taste_nvidia()
839 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_taste_nvidia()
840 pp = cp->provider; in g_raid_md_taste_nvidia()
847 if (pp->geom->rank == 1) in g_raid_md_taste_nvidia()
860 "NVIDIA vendor mismatch 0x%04x != 0x10de", in g_raid_md_taste_nvidia()
869 G_RAID_DEBUG(1, "NVIDIA disk position %d", meta->disk_number); in g_raid_md_taste_nvidia()
870 spare = 0;//(meta->type == NVIDIA_T_SPARE) ? 1 : 0; in g_raid_md_taste_nvidia()
876 LIST_FOREACH(geom, &mp->geom, geom) { in g_raid_md_taste_nvidia()
877 sc = geom->softc; in g_raid_md_taste_nvidia()
880 if (sc->sc_stopping != 0) in g_raid_md_taste_nvidia()
882 if (sc->sc_md->mdo_class != md->mdo_class) in g_raid_md_taste_nvidia()
884 mdi1 = (struct g_raid_md_nvidia_object *)sc->sc_md; in g_raid_md_taste_nvidia()
886 if (mdi1->mdio_incomplete) in g_raid_md_taste_nvidia()
889 if (memcmp(&mdi1->mdio_volume_id, in g_raid_md_taste_nvidia()
890 &meta->volume_id, 16) == 0) in g_raid_md_taste_nvidia()
897 G_RAID_DEBUG(1, "Found matching array %s", sc->sc_name); in g_raid_md_taste_nvidia()
900 } else if (spare) { /* Not found needy node -- left for later. */ in g_raid_md_taste_nvidia()
904 } else { /* Not found matching node -- create one. */ in g_raid_md_taste_nvidia()
906 memcpy(&mdi->mdio_volume_id, &meta->volume_id, 16); in g_raid_md_taste_nvidia()
907 snprintf(name, sizeof(name), "NVIDIA-%d", in g_raid_md_taste_nvidia()
910 md->mdo_softc = sc; in g_raid_md_taste_nvidia()
911 geom = sc->sc_geom; in g_raid_md_taste_nvidia()
912 callout_init(&mdi->mdio_start_co, 1); in g_raid_md_taste_nvidia()
913 callout_reset(&mdi->mdio_start_co, g_raid_start_timeout * hz, in g_raid_md_taste_nvidia()
915 mdi->mdio_rootmount = root_mount_hold("GRAID-NVIDIA"); in g_raid_md_taste_nvidia()
916 G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); in g_raid_md_taste_nvidia()
920 g_access(cp, -1, 0, 0); in g_raid_md_taste_nvidia()
923 rcp->flags |= G_CF_DIRECT_RECEIVE; in g_raid_md_taste_nvidia()
929 sx_xlock(&sc->sc_lock); in g_raid_md_taste_nvidia()
932 pd->pd_meta = meta; in g_raid_md_taste_nvidia()
934 pd->pd_disk_pos = -3; in g_raid_md_taste_nvidia()
936 pd->pd_disk_pos = -1; in g_raid_md_taste_nvidia()
938 pd->pd_disk_size = pp->mediasize; in g_raid_md_taste_nvidia()
940 disk->d_md_data = (void *)pd; in g_raid_md_taste_nvidia()
941 disk->d_consumer = rcp; in g_raid_md_taste_nvidia()
942 rcp->private = disk; in g_raid_md_taste_nvidia()
948 sx_xunlock(&sc->sc_lock); in g_raid_md_taste_nvidia()
963 struct g_raid_md_nvidia_object *mdi; in g_raid_md_event_nvidia() local
966 sc = md->mdo_softc; in g_raid_md_event_nvidia()
967 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_event_nvidia()
971 if (!mdi->mdio_started) { in g_raid_md_event_nvidia()
973 arc4rand(&mdi->mdio_volume_id, 16, 0); in g_raid_md_event_nvidia()
978 return (-1); in g_raid_md_event_nvidia()
980 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_event_nvidia()
984 if (pd->pd_disk_pos >= 0) { in g_raid_md_event_nvidia()
986 if (disk->d_consumer) { in g_raid_md_event_nvidia()
987 g_raid_kill_consumer(sc, disk->d_consumer); in g_raid_md_event_nvidia()
988 disk->d_consumer = NULL; in g_raid_md_event_nvidia()
990 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_event_nvidia()
997 /* Otherwise -- delete. */ in g_raid_md_event_nvidia()
1002 if (mdi->mdio_started) { in g_raid_md_event_nvidia()
1004 if (pd->pd_disk_pos >= 0) in g_raid_md_event_nvidia()
1005 arc4rand(&mdi->mdio_volume_id, 16, 0); in g_raid_md_event_nvidia()
1012 if (g_raid_ndisks(sc, -1) == in g_raid_md_event_nvidia()
1019 return (-2); in g_raid_md_event_nvidia()
1030 struct g_raid_md_nvidia_object *mdi; in g_raid_md_ctl_nvidia() local
1042 sc = md->mdo_softc; in g_raid_md_ctl_nvidia()
1043 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_ctl_nvidia()
1050 return (-1); in g_raid_md_ctl_nvidia()
1055 return (-2); in g_raid_md_ctl_nvidia()
1060 return (-3); in g_raid_md_ctl_nvidia()
1063 levelname = "RAID5-LS"; in g_raid_md_ctl_nvidia()
1066 return (-4); in g_raid_md_ctl_nvidia()
1068 numdisks = *nargs - 3; in g_raid_md_ctl_nvidia()
1073 "(0x%02x/0x%02x), or number of disks (%d).", in g_raid_md_ctl_nvidia()
1075 return (-5); in g_raid_md_ctl_nvidia()
1086 error = -6; in g_raid_md_ctl_nvidia()
1099 error = -7; in g_raid_md_ctl_nvidia()
1102 pp = cp->provider; in g_raid_md_ctl_nvidia()
1105 pd->pd_disk_pos = i; in g_raid_md_ctl_nvidia()
1107 disk->d_md_data = (void *)pd; in g_raid_md_ctl_nvidia()
1108 disk->d_consumer = cp; in g_raid_md_ctl_nvidia()
1111 cp->private = disk; in g_raid_md_ctl_nvidia()
1116 pd->pd_disk_size = pp->mediasize; in g_raid_md_ctl_nvidia()
1117 if (size > pp->mediasize) in g_raid_md_ctl_nvidia()
1118 size = pp->mediasize; in g_raid_md_ctl_nvidia()
1119 if (sectorsize < pp->sectorsize) in g_raid_md_ctl_nvidia()
1120 sectorsize = pp->sectorsize; in g_raid_md_ctl_nvidia()
1127 return (-8); in g_raid_md_ctl_nvidia()
1131 size -= 2 * sectorsize; in g_raid_md_ctl_nvidia()
1141 return (-9); in g_raid_md_ctl_nvidia()
1154 return (-10); in g_raid_md_ctl_nvidia()
1158 return (-11); in g_raid_md_ctl_nvidia()
1162 return (-12); in g_raid_md_ctl_nvidia()
1169 size -= (size % sectorsize); in g_raid_md_ctl_nvidia()
1172 size -= (size % (2 * strip)); in g_raid_md_ctl_nvidia()
1174 size -= (size % strip); in g_raid_md_ctl_nvidia()
1177 return (-13); in g_raid_md_ctl_nvidia()
1187 volsize = size * (numdisks - 1); in g_raid_md_ctl_nvidia()
1194 return (-14); in g_raid_md_ctl_nvidia()
1198 mdi->mdio_total_disks = numdisks; in g_raid_md_ctl_nvidia()
1199 mdi->mdio_started = 1; in g_raid_md_ctl_nvidia()
1200 vol = g_raid_create_volume(sc, volname, -1); in g_raid_md_ctl_nvidia()
1201 vol->v_md_data = (void *)(intptr_t)0; in g_raid_md_ctl_nvidia()
1202 vol->v_raid_level = level; in g_raid_md_ctl_nvidia()
1203 vol->v_raid_level_qualifier = qual; in g_raid_md_ctl_nvidia()
1204 vol->v_strip_size = strip; in g_raid_md_ctl_nvidia()
1205 vol->v_disks_count = numdisks; in g_raid_md_ctl_nvidia()
1206 vol->v_mediasize = volsize; in g_raid_md_ctl_nvidia()
1207 vol->v_sectorsize = sectorsize; in g_raid_md_ctl_nvidia()
1211 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_nvidia()
1212 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_ctl_nvidia()
1213 sd = &vol->v_subdisks[pd->pd_disk_pos]; in g_raid_md_ctl_nvidia()
1214 sd->sd_disk = disk; in g_raid_md_ctl_nvidia()
1215 sd->sd_offset = 0; in g_raid_md_ctl_nvidia()
1216 sd->sd_size = size; in g_raid_md_ctl_nvidia()
1217 TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); in g_raid_md_ctl_nvidia()
1218 if (sd->sd_disk->d_consumer != NULL) { in g_raid_md_ctl_nvidia()
1247 return (-4); in g_raid_md_ctl_nvidia()
1250 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_nvidia()
1251 if (disk->d_consumer) in g_raid_md_ctl_nvidia()
1252 nvidia_meta_erase(disk->d_consumer); in g_raid_md_ctl_nvidia()
1261 return (-1); in g_raid_md_ctl_nvidia()
1268 error = -2; in g_raid_md_ctl_nvidia()
1274 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_ctl_nvidia()
1275 if (disk->d_consumer != NULL && in g_raid_md_ctl_nvidia()
1276 disk->d_consumer->provider != NULL && in g_raid_md_ctl_nvidia()
1277 strcmp(disk->d_consumer->provider->name, in g_raid_md_ctl_nvidia()
1284 error = -3; in g_raid_md_ctl_nvidia()
1293 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_ctl_nvidia()
1296 nvidia_meta_erase(disk->d_consumer); in g_raid_md_ctl_nvidia()
1299 if (pd->pd_disk_pos >= 0) { in g_raid_md_ctl_nvidia()
1301 g_raid_kill_consumer(sc, disk->d_consumer); in g_raid_md_ctl_nvidia()
1302 disk->d_consumer = NULL; in g_raid_md_ctl_nvidia()
1303 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { in g_raid_md_ctl_nvidia()
1310 /* Otherwise -- delete. */ in g_raid_md_ctl_nvidia()
1320 if (g_raid_ndisks(sc, -1) == in g_raid_md_ctl_nvidia()
1330 return (-1); in g_raid_md_ctl_nvidia()
1339 error = -3; in g_raid_md_ctl_nvidia()
1350 error = -4; in g_raid_md_ctl_nvidia()
1353 pp = cp->provider; in g_raid_md_ctl_nvidia()
1356 pd->pd_disk_pos = -3; in g_raid_md_ctl_nvidia()
1357 pd->pd_disk_size = pp->mediasize; in g_raid_md_ctl_nvidia()
1360 disk->d_consumer = cp; in g_raid_md_ctl_nvidia()
1361 disk->d_md_data = (void *)pd; in g_raid_md_ctl_nvidia()
1362 cp->private = disk; in g_raid_md_ctl_nvidia()
1369 if (disk->d_state != G_RAID_DISK_S_SPARE && in g_raid_md_ctl_nvidia()
1370 disk->d_state != G_RAID_DISK_S_ACTIVE) { in g_raid_md_ctl_nvidia()
1374 error = -8; in g_raid_md_ctl_nvidia()
1385 return (-100); in g_raid_md_ctl_nvidia()
1396 struct g_raid_md_nvidia_object *mdi; in g_raid_md_write_nvidia() local
1401 sc = md->mdo_softc; in g_raid_md_write_nvidia()
1402 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_write_nvidia()
1404 if (sc->sc_stopping == G_RAID_DESTROY_HARD) in g_raid_md_write_nvidia()
1408 vol = TAILQ_FIRST(&sc->sc_volumes); in g_raid_md_write_nvidia()
1412 if (mdi->mdio_meta) in g_raid_md_write_nvidia()
1413 memcpy(meta, mdi->mdio_meta, sizeof(*meta)); in g_raid_md_write_nvidia()
1414 memcpy(meta->nvidia_id, NVIDIA_MAGIC, sizeof(NVIDIA_MAGIC) - 1); in g_raid_md_write_nvidia()
1415 meta->config_size = 30; in g_raid_md_write_nvidia()
1416 meta->version = 0x0064; in g_raid_md_write_nvidia()
1417 meta->total_sectors = vol->v_mediasize / vol->v_sectorsize; in g_raid_md_write_nvidia()
1418 meta->sector_size = vol->v_sectorsize; in g_raid_md_write_nvidia()
1419 nvidia_meta_put_name(meta, vol->v_name); in g_raid_md_write_nvidia()
1420 meta->magic_0 = NVIDIA_MAGIC0; in g_raid_md_write_nvidia()
1421 memcpy(&meta->volume_id, &mdi->mdio_volume_id, 16); in g_raid_md_write_nvidia()
1422 meta->state = NVIDIA_S_IDLE; in g_raid_md_write_nvidia()
1423 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) in g_raid_md_write_nvidia()
1424 meta->array_width = 1; in g_raid_md_write_nvidia()
1425 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) in g_raid_md_write_nvidia()
1426 meta->array_width = vol->v_disks_count / 2; in g_raid_md_write_nvidia()
1427 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID5) in g_raid_md_write_nvidia()
1428 meta->array_width = vol->v_disks_count - 1; in g_raid_md_write_nvidia()
1430 meta->array_width = vol->v_disks_count; in g_raid_md_write_nvidia()
1431 meta->total_disks = vol->v_disks_count; in g_raid_md_write_nvidia()
1432 meta->orig_array_width = meta->array_width; in g_raid_md_write_nvidia()
1433 if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0) in g_raid_md_write_nvidia()
1434 meta->type = NVIDIA_T_RAID0; in g_raid_md_write_nvidia()
1435 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) in g_raid_md_write_nvidia()
1436 meta->type = NVIDIA_T_RAID1; in g_raid_md_write_nvidia()
1437 else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) in g_raid_md_write_nvidia()
1438 meta->type = NVIDIA_T_RAID01; in g_raid_md_write_nvidia()
1439 else if (vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT || in g_raid_md_write_nvidia()
1440 vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE) in g_raid_md_write_nvidia()
1441 meta->type = NVIDIA_T_CONCAT; in g_raid_md_write_nvidia()
1442 else if (vol->v_raid_level_qualifier == G_RAID_VOLUME_RLQ_R5LA) in g_raid_md_write_nvidia()
1443 meta->type = NVIDIA_T_RAID5; in g_raid_md_write_nvidia()
1445 meta->type = NVIDIA_T_RAID5_SYM; in g_raid_md_write_nvidia()
1446 meta->strip_sectors = vol->v_strip_size / vol->v_sectorsize; in g_raid_md_write_nvidia()
1447 meta->strip_bytes = vol->v_strip_size; in g_raid_md_write_nvidia()
1448 meta->strip_shift = ffs(meta->strip_sectors) - 1; in g_raid_md_write_nvidia()
1449 meta->strip_mask = meta->strip_sectors - 1; in g_raid_md_write_nvidia()
1450 meta->stripe_sectors = meta->strip_sectors * meta->orig_array_width; in g_raid_md_write_nvidia()
1451 meta->stripe_bytes = meta->stripe_sectors * vol->v_sectorsize; in g_raid_md_write_nvidia()
1452 meta->rebuild_lba = 0; in g_raid_md_write_nvidia()
1453 meta->orig_type = meta->type; in g_raid_md_write_nvidia()
1454 meta->orig_total_sectors = meta->total_sectors; in g_raid_md_write_nvidia()
1455 meta->status = 0; in g_raid_md_write_nvidia()
1457 for (i = 0; i < vol->v_disks_count; i++) { in g_raid_md_write_nvidia()
1458 sd = &vol->v_subdisks[i]; in g_raid_md_write_nvidia()
1459 if ((sd->sd_state == G_RAID_SUBDISK_S_STALE || in g_raid_md_write_nvidia()
1460 sd->sd_state == G_RAID_SUBDISK_S_RESYNC || in g_raid_md_write_nvidia()
1461 vol->v_dirty) && in g_raid_md_write_nvidia()
1462 meta->state != NVIDIA_S_REBUILD) in g_raid_md_write_nvidia()
1463 meta->state = NVIDIA_S_SYNC; in g_raid_md_write_nvidia()
1464 else if (sd->sd_state == G_RAID_SUBDISK_S_NEW || in g_raid_md_write_nvidia()
1465 sd->sd_state == G_RAID_SUBDISK_S_REBUILD) in g_raid_md_write_nvidia()
1466 meta->state = NVIDIA_S_REBUILD; in g_raid_md_write_nvidia()
1470 if (mdi->mdio_meta != NULL) in g_raid_md_write_nvidia()
1471 free(mdi->mdio_meta, M_MD_NVIDIA); in g_raid_md_write_nvidia()
1472 mdi->mdio_meta = meta; in g_raid_md_write_nvidia()
1474 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { in g_raid_md_write_nvidia()
1475 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_write_nvidia()
1476 if (disk->d_state != G_RAID_DISK_S_ACTIVE && in g_raid_md_write_nvidia()
1477 disk->d_state != G_RAID_DISK_S_SPARE) in g_raid_md_write_nvidia()
1479 if (pd->pd_meta != NULL) { in g_raid_md_write_nvidia()
1480 free(pd->pd_meta, M_MD_NVIDIA); in g_raid_md_write_nvidia()
1481 pd->pd_meta = NULL; in g_raid_md_write_nvidia()
1483 pd->pd_meta = nvidia_meta_copy(meta); in g_raid_md_write_nvidia()
1484 if ((sd = TAILQ_FIRST(&disk->d_subdisks)) != NULL) { in g_raid_md_write_nvidia()
1486 pd->pd_meta->disk_number = in g_raid_md_write_nvidia()
1487 nvidia_meta_translate_disk(meta, sd->sd_pos); in g_raid_md_write_nvidia()
1488 if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE) { in g_raid_md_write_nvidia()
1489 pd->pd_meta->disk_status = 0x100; in g_raid_md_write_nvidia()
1490 pd->pd_meta->rebuild_lba = in g_raid_md_write_nvidia()
1491 sd->sd_rebuild_pos / vol->v_sectorsize * in g_raid_md_write_nvidia()
1492 meta->array_width; in g_raid_md_write_nvidia()
1495 pd->pd_meta->disk_number = meta->total_disks + spares++; in g_raid_md_write_nvidia()
1498 g_raid_md_nvidia_print(pd->pd_meta); in g_raid_md_write_nvidia()
1499 nvidia_meta_write(disk->d_consumer, pd->pd_meta); in g_raid_md_write_nvidia()
1512 sc = md->mdo_softc; in g_raid_md_fail_disk_nvidia()
1513 pd = (struct g_raid_md_nvidia_perdisk *)tdisk->d_md_data; in g_raid_md_fail_disk_nvidia()
1516 if (pd->pd_disk_pos < 0) in g_raid_md_fail_disk_nvidia()
1517 return (-1); in g_raid_md_fail_disk_nvidia()
1520 if (tdisk->d_consumer) in g_raid_md_fail_disk_nvidia()
1521 nvidia_meta_erase(tdisk->d_consumer); in g_raid_md_fail_disk_nvidia()
1525 TAILQ_FOREACH(sd, &tdisk->d_subdisks, sd_next) { in g_raid_md_fail_disk_nvidia()
1536 if (g_raid_ndisks(sc, -1) == in g_raid_md_fail_disk_nvidia()
1550 pd = (struct g_raid_md_nvidia_perdisk *)disk->d_md_data; in g_raid_md_free_disk_nvidia()
1551 if (pd->pd_meta != NULL) { in g_raid_md_free_disk_nvidia()
1552 free(pd->pd_meta, M_MD_NVIDIA); in g_raid_md_free_disk_nvidia()
1553 pd->pd_meta = NULL; in g_raid_md_free_disk_nvidia()
1556 disk->d_md_data = NULL; in g_raid_md_free_disk_nvidia()
1563 struct g_raid_md_nvidia_object *mdi; in g_raid_md_free_nvidia() local
1565 mdi = (struct g_raid_md_nvidia_object *)md; in g_raid_md_free_nvidia()
1566 if (!mdi->mdio_started) { in g_raid_md_free_nvidia()
1567 mdi->mdio_started = 0; in g_raid_md_free_nvidia()
1568 callout_stop(&mdi->mdio_start_co); in g_raid_md_free_nvidia()
1569 G_RAID_DEBUG1(1, md->mdo_softc, in g_raid_md_free_nvidia()
1570 "root_mount_rel %p", mdi->mdio_rootmount); in g_raid_md_free_nvidia()
1571 root_mount_rel(mdi->mdio_rootmount); in g_raid_md_free_nvidia()
1572 mdi->mdio_rootmount = NULL; in g_raid_md_free_nvidia()
1574 if (mdi->mdio_meta != NULL) { in g_raid_md_free_nvidia()
1575 free(mdi->mdio_meta, M_MD_NVIDIA); in g_raid_md_free_nvidia()
1576 mdi->mdio_meta = NULL; in g_raid_md_free_nvidia()