Lines Matching refs:disk
123 static int g_raid3_update_disk(struct g_raid3_disk *disk, u_int state);
173 g_raid3_get_diskname(struct g_raid3_disk *disk)
176 if (disk->d_consumer == NULL || disk->d_consumer->provider == NULL)
178 return (disk->d_name);
296 struct g_raid3_disk *disk;
301 disk = NULL;
304 disk = arg;
305 sc = disk->d_softc;
307 ep->e_disk = disk;
365 g_raid3_event_cancel(struct g_raid3_disk *disk)
370 sc = disk->d_softc;
377 if (ep->e_disk != disk)
397 struct g_raid3_disk *disk;
403 disk = &sc->sc_disks[n];
404 if (disk->d_state == G_RAID3_DISK_STATE_NODISK)
406 if (state == -1 || disk->d_state == state)
500 g_raid3_connect_disk(struct g_raid3_disk *disk, struct g_provider *pp)
506 KASSERT(disk->d_consumer == NULL,
507 ("Disk already connected (device %s).", disk->d_softc->sc_name));
510 cp = g_new_consumer(disk->d_softc->sc_geom);
526 disk->d_consumer = cp;
527 disk->d_consumer->private = disk;
528 disk->d_consumer->index = 0;
529 G_RAID3_DEBUG(2, "Disk %s connected.", g_raid3_get_diskname(disk));
548 * Initialize disk. This means allocate memory, create consumer, attach it
555 struct g_raid3_disk *disk;
558 disk = &sc->sc_disks[md->md_no];
559 error = g_raid3_connect_disk(disk, pp);
565 disk->d_state = G_RAID3_DISK_STATE_NONE;
566 disk->d_flags = md->md_dflags;
568 disk->d_flags |= G_RAID3_DISK_FLAG_HARDCODED;
569 disk->d_sync.ds_consumer = NULL;
570 disk->d_sync.ds_offset = md->md_sync_offset;
571 disk->d_sync.ds_offset_done = md->md_sync_offset;
572 disk->d_genid = md->md_genid;
573 disk->d_sync.ds_syncid = md->md_syncid;
576 return (disk);
580 g_raid3_destroy_disk(struct g_raid3_disk *disk)
585 sc = disk->d_softc;
588 if (disk->d_state == G_RAID3_DISK_STATE_NODISK)
590 g_raid3_event_cancel(disk);
591 switch (disk->d_state) {
600 g_raid3_disconnect_consumer(sc, disk->d_consumer);
602 disk->d_consumer = NULL;
605 KASSERT(0 == 1, ("Wrong disk state (%s, %s).",
606 g_raid3_get_diskname(disk),
607 g_raid3_disk_state2str(disk->d_state)));
609 disk->d_state = G_RAID3_DISK_STATE_NODISK;
644 struct g_raid3_disk *disk;
656 disk = &sc->sc_disks[n];
657 if (disk->d_state != G_RAID3_DISK_STATE_NODISK) {
658 disk->d_flags &= ~G_RAID3_DISK_FLAG_DIRTY;
659 g_raid3_update_metadata(disk);
660 g_raid3_destroy_disk(disk);
692 struct g_raid3_disk *disk;
696 disk = cp->private;
697 if (disk == NULL)
699 disk->d_softc->sc_bump_id = G_RAID3_BUMP_SYNCID;
700 g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED,
705 g_raid3_write_metadata(struct g_raid3_disk *disk, struct g_raid3_metadata *md)
714 sc = disk->d_softc;
717 cp = disk->d_consumer;
731 if ((disk->d_flags & G_RAID3_DISK_FLAG_BROKEN) == 0) {
734 g_raid3_get_diskname(disk), sc->sc_name, error);
735 disk->d_flags |= G_RAID3_DISK_FLAG_BROKEN;
739 g_raid3_get_diskname(disk), sc->sc_name, error);
744 g_raid3_event_send(disk,
753 g_raid3_clear_metadata(struct g_raid3_disk *disk)
758 sx_assert(&disk->d_softc->sc_lock, SX_LOCKED);
760 error = g_raid3_write_metadata(disk, NULL);
763 g_raid3_get_diskname(disk));
766 "Cannot clear metadata on disk %s (error=%d).",
767 g_raid3_get_diskname(disk), error);
773 g_raid3_fill_metadata(struct g_raid3_disk *disk, struct g_raid3_metadata *md)
779 sc = disk->d_softc;
789 md->md_no = disk->d_no;
790 md->md_syncid = disk->d_sync.ds_syncid;
791 md->md_dflags = (disk->d_flags & G_RAID3_DISK_FLAG_MASK);
792 if (disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING) {
794 disk->d_sync.ds_offset_done / (sc->sc_ndisks - 1);
796 if (disk->d_consumer != NULL && disk->d_consumer->provider != NULL)
797 pp = disk->d_consumer->provider;
800 if ((disk->d_flags & G_RAID3_DISK_FLAG_HARDCODED) != 0 && pp != NULL)
807 g_raid3_update_metadata(struct g_raid3_disk *disk)
814 sc = disk->d_softc;
817 g_raid3_fill_metadata(disk, &md);
818 error = g_raid3_write_metadata(disk, &md);
821 g_raid3_get_diskname(disk));
824 "Cannot update metadata on disk %s (error=%d).",
825 g_raid3_get_diskname(disk), error);
832 struct g_raid3_disk *disk;
845 disk = &sc->sc_disks[n];
846 if (disk->d_state == G_RAID3_DISK_STATE_ACTIVE ||
847 disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING) {
848 disk->d_sync.ds_syncid = sc->sc_syncid;
849 g_raid3_update_metadata(disk);
857 struct g_raid3_disk *disk;
870 disk = &sc->sc_disks[n];
871 if (disk->d_state == G_RAID3_DISK_STATE_ACTIVE ||
872 disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING) {
873 disk->d_genid = sc->sc_genid;
874 g_raid3_update_metadata(disk);
882 struct g_raid3_disk *disk;
904 disk = &sc->sc_disks[i];
905 if (disk->d_state != G_RAID3_DISK_STATE_ACTIVE)
908 g_raid3_get_diskname(disk), sc->sc_name);
909 disk->d_flags &= ~G_RAID3_DISK_FLAG_DIRTY;
910 g_raid3_update_metadata(disk);
918 struct g_raid3_disk *disk;
929 disk = &sc->sc_disks[i];
930 if (disk->d_state != G_RAID3_DISK_STATE_ACTIVE)
933 g_raid3_get_diskname(disk), sc->sc_name);
934 disk->d_flags |= G_RAID3_DISK_FLAG_DIRTY;
935 g_raid3_update_metadata(disk);
1072 struct g_raid3_disk *disk;
1125 disk = cbp->bio_caller2;
1126 cp = disk->d_consumer;
1142 struct g_raid3_disk *disk;
1184 disk = cbp->bio_caller2;
1185 if (disk == NULL)
1187 if ((disk->d_flags & G_RAID3_DISK_FLAG_BROKEN) == 0) {
1188 disk->d_flags |= G_RAID3_DISK_FLAG_BROKEN;
1198 g_raid3_event_send(disk,
1217 disk = pbp->bio_driver2;
1218 if (disk->d_state != G_RAID3_DISK_STATE_ACTIVE) {
1225 if (disk->d_no == sc->sc_ndisks - 1)
1231 cp = disk->d_consumer;
1232 fbp->bio_caller2 = disk;
1306 struct g_raid3_disk *disk;
1316 disk = cbp->bio_from->private;
1317 if (disk == NULL) {
1355 disk = cbp->bio_caller2;
1356 if (disk == NULL) {
1361 if ((disk->d_flags & G_RAID3_DISK_FLAG_BROKEN) == 0) {
1362 disk->d_flags |= G_RAID3_DISK_FLAG_BROKEN;
1374 g_raid3_event_send(disk,
1414 struct g_raid3_disk *disk;
1421 disk = &sc->sc_disks[i];
1422 if (disk->d_state != G_RAID3_DISK_STATE_ACTIVE)
1438 cbp->bio_caller1 = disk;
1439 cbp->bio_to = disk->d_consumer->provider;
1444 disk = cbp->bio_caller1;
1446 cp = disk->d_consumer;
1450 g_io_request(cbp, disk->d_consumer);
1498 struct g_raid3_disk *disk;
1503 disk = sc->sc_syncdisk;
1504 if (disk == NULL)
1509 sbp = disk->d_sync.ds_bios[i];
1627 struct g_raid3_disk *disk;
1631 disk = bp->bio_from->private;
1632 if (disk == NULL) {
1664 if (disk->d_no == sc->sc_ndisks - 1) {
1680 src += atom * disk->d_no;
1695 cp = disk->d_consumer;
1716 g_raid3_event_send(disk,
1722 sync = &disk->d_sync;
1743 g_raid3_event_send(disk, G_RAID3_DISK_STATE_ACTIVE,
1785 g_raid3_update_metadata(disk);
1800 struct g_raid3_disk *disk;
1859 disk = &sc->sc_disks[n];
1882 if (disk->d_state != G_RAID3_DISK_STATE_ACTIVE) {
1887 disk = &sc->sc_disks[sc->sc_ndisks - 1];
1891 disk->d_no == sc->sc_round_robin) {
1896 pbp->bio_driver2 = disk;
1897 disk = &sc->sc_disks[sc->sc_ndisks - 1];
1901 } else if (verify && disk->d_no == sc->sc_ndisks - 1) {
1907 if (disk->d_state == G_RAID3_DISK_STATE_ACTIVE ||
1908 disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING) {
1930 disk = NULL;
1936 cbp->bio_caller2 = disk;
1949 disk = cbp->bio_caller2;
1950 cp = disk->d_consumer;
2075 /* Update disk status. */
2076 G_RAID3_DEBUG(3, "Running event for disk %s.",
2190 g_raid3_update_idle(struct g_raid3_softc *sc, struct g_raid3_disk *disk)
2196 if (!sc->sc_idle && (disk->d_flags & G_RAID3_DISK_FLAG_DIRTY) == 0) {
2198 g_raid3_get_diskname(disk), sc->sc_name);
2199 disk->d_flags |= G_RAID3_DISK_FLAG_DIRTY;
2201 (disk->d_flags & G_RAID3_DISK_FLAG_DIRTY) != 0) {
2203 g_raid3_get_diskname(disk), sc->sc_name);
2204 disk->d_flags &= ~G_RAID3_DISK_FLAG_DIRTY;
2211 struct g_raid3_disk *disk;
2225 disk = NULL;
2229 disk = &sc->sc_disks[n];
2232 if (disk == NULL)
2247 g_raid3_get_diskname(disk));
2249 disk->d_flags |= G_RAID3_DISK_FLAG_DIRTY;
2250 KASSERT(disk->d_sync.ds_consumer == NULL,
2251 ("Sync consumer already exists (device=%s, disk=%s).",
2252 sc->sc_name, g_raid3_get_diskname(disk)));
2254 disk->d_sync.ds_consumer = cp;
2255 disk->d_sync.ds_consumer->private = disk;
2256 disk->d_sync.ds_consumer->index = 0;
2257 sc->sc_syncdisk = disk;
2262 disk->d_sync.ds_bios = malloc(sizeof(struct bio *) * g_raid3_syncreqs,
2266 disk->d_sync.ds_bios[n] = bp;
2271 bp->bio_offset = disk->d_sync.ds_offset * (sc->sc_ndisks - 1);
2273 disk->d_sync.ds_offset += bp->bio_length / (sc->sc_ndisks - 1);
2275 bp->bio_from = disk->d_sync.ds_consumer;
2281 disk->d_sync.ds_inflight = g_raid3_syncreqs;
2287 bp = disk->d_sync.ds_bios[n];
2289 disk->d_sync.ds_consumer->index++;
2296 g_io_request(bp, disk->d_sync.ds_consumer);
2308 struct g_raid3_disk *disk;
2317 disk = sc->sc_syncdisk;
2319 KASSERT(disk != NULL, ("No disk was synchronized (%s).", sc->sc_name));
2320 KASSERT(disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING,
2321 ("Wrong disk state (%s, %s).", g_raid3_get_diskname(disk),
2322 g_raid3_disk_state2str(disk->d_state)));
2323 if (disk->d_sync.ds_consumer == NULL)
2328 sc->sc_name, g_raid3_get_diskname(disk));
2331 sc->sc_name, g_raid3_get_diskname(disk));
2333 free(disk->d_sync.ds_bios, M_RAID3);
2334 disk->d_sync.ds_bios = NULL;
2335 cp = disk->d_sync.ds_consumer;
2336 disk->d_sync.ds_consumer = NULL;
2337 disk->d_flags &= ~G_RAID3_DISK_FLAG_DIRTY;
2349 struct g_raid3_disk *disk;
2361 disk = &sc->sc_disks[n];
2362 if (disk->d_consumer && disk->d_consumer->provider &&
2363 disk->d_consumer->provider->stripesize > pp->stripesize) {
2364 pp->stripesize = disk->d_consumer->provider->stripesize;
2365 pp->stripeoffset = disk->d_consumer->provider->stripeoffset;
2433 g_raid3_determine_state(struct g_raid3_disk *disk)
2438 sc = disk->d_softc;
2439 if (sc->sc_syncid == disk->d_sync.ds_syncid) {
2440 if ((disk->d_flags &
2447 (disk->d_flags &
2458 } else if (disk->d_sync.ds_syncid < sc->sc_syncid) {
2460 * Reset all synchronization data for this disk,
2464 disk->d_flags |= G_RAID3_DISK_FLAG_SYNCHRONIZING;
2465 disk->d_sync.ds_offset = 0;
2466 disk->d_sync.ds_offset_done = 0;
2467 disk->d_sync.ds_syncid = sc->sc_syncid;
2469 (disk->d_flags & G_RAID3_DISK_FLAG_FORCE_SYNC) != 0) {
2474 } else /* if (sc->sc_syncid < disk->d_sync.ds_syncid) */ {
2478 * and more fresh disk just arrive.
2481 * this disk and inform the user loudly.
2484 "disk (%s) arrives!! It will not be connected to the "
2486 g_raid3_get_diskname(disk));
2487 g_raid3_destroy_disk(disk);
2489 /* Return immediately, because disk was destroyed. */
2492 G_RAID3_DEBUG(3, "State for %s disk: %s.",
2493 g_raid3_get_diskname(disk), g_raid3_disk_state2str(state));
2503 struct g_raid3_disk *disk;
2517 * one disk is missing and 'force' is true.
2541 disk = &sc->sc_disks[n];
2542 if (disk->d_state == G_RAID3_DISK_STATE_NODISK)
2544 if (disk->d_genid > genid)
2545 genid = disk->d_genid;
2552 disk = &sc->sc_disks[n];
2553 if (disk->d_state == G_RAID3_DISK_STATE_NODISK)
2555 if (disk->d_genid < genid) {
2558 g_raid3_get_diskname(disk), sc->sc_name);
2559 g_raid3_destroy_disk(disk);
2574 disk = &sc->sc_disks[n];
2575 if (disk->d_state == G_RAID3_DISK_STATE_NODISK)
2577 if ((disk->d_flags & G_RAID3_DISK_FLAG_DIRTY) != 0)
2579 if (disk->d_sync.ds_syncid > syncid) {
2580 syncid = disk->d_sync.ds_syncid;
2582 } else if (disk->d_sync.ds_syncid < syncid) {
2585 if ((disk->d_flags &
2608 disk = &sc->sc_disks[n];
2609 if ((disk->d_flags &
2613 disk->d_flags |=
2617 disk = &sc->sc_disks[sc->sc_ndisks - 1];
2618 disk->d_flags |= G_RAID3_DISK_FLAG_SYNCHRONIZING;
2635 disk = &sc->sc_disks[n];
2636 if (disk->d_state == G_RAID3_DISK_STATE_NODISK)
2638 state = g_raid3_determine_state(disk);
2639 g_raid3_event_send(disk, state, G_RAID3_EVENT_DONTWAIT);
2722 * Update disk state and device state if needed.
2726 g_raid3_get_diskname(disk), \
2727 g_raid3_disk_state2str(disk->d_state), \
2730 g_raid3_update_disk(struct g_raid3_disk *disk, u_int state)
2734 sc = disk->d_softc;
2738 G_RAID3_DEBUG(3, "Changing disk %s state from %s to %s.",
2739 g_raid3_get_diskname(disk), g_raid3_disk_state2str(disk->d_state),
2745 * 1. New disk arrive.
2748 KASSERT(disk->d_state == G_RAID3_DISK_STATE_NONE,
2749 ("Wrong disk state (%s, %s).", g_raid3_get_diskname(disk),
2750 g_raid3_disk_state2str(disk->d_state)));
2753 disk->d_state = state;
2755 sc->sc_name, g_raid3_get_diskname(disk));
2762 g_raid3_get_diskname(disk),
2763 g_raid3_disk_state2str(disk->d_state)));
2764 state = g_raid3_determine_state(disk);
2771 * 1. New disk does not need synchronization.
2778 g_raid3_get_diskname(disk),
2779 g_raid3_disk_state2str(disk->d_state)));
2781 KASSERT(disk->d_state == G_RAID3_DISK_STATE_NEW ||
2782 disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING,
2783 ("Wrong disk state (%s, %s).", g_raid3_get_diskname(disk),
2784 g_raid3_disk_state2str(disk->d_state)));
2787 if (disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING) {
2788 disk->d_flags &= ~G_RAID3_DISK_FLAG_SYNCHRONIZING;
2789 disk->d_flags &= ~G_RAID3_DISK_FLAG_FORCE_SYNC;
2792 disk->d_state = state;
2793 disk->d_sync.ds_offset = 0;
2794 disk->d_sync.ds_offset_done = 0;
2795 g_raid3_update_idle(sc, disk);
2796 g_raid3_update_metadata(disk);
2798 sc->sc_name, g_raid3_get_diskname(disk));
2803 * 1. Stale disk was connected.
2806 KASSERT(disk->d_state == G_RAID3_DISK_STATE_NEW,
2807 ("Wrong disk state (%s, %s).", g_raid3_get_diskname(disk),
2808 g_raid3_disk_state2str(disk->d_state)));
2813 g_raid3_get_diskname(disk),
2814 g_raid3_disk_state2str(disk->d_state)));
2822 g_raid3_get_diskname(disk),
2823 g_raid3_disk_state2str(disk->d_state)));
2826 disk->d_flags &= ~G_RAID3_DISK_FLAG_DIRTY;
2827 disk->d_state = state;
2828 g_raid3_update_metadata(disk);
2830 sc->sc_name, g_raid3_get_diskname(disk));
2838 KASSERT(disk->d_state == G_RAID3_DISK_STATE_NEW,
2839 ("Wrong disk state (%s, %s).", g_raid3_get_diskname(disk),
2840 g_raid3_disk_state2str(disk->d_state)));
2845 g_raid3_get_diskname(disk),
2846 g_raid3_disk_state2str(disk->d_state)));
2849 if (disk->d_state == G_RAID3_DISK_STATE_NEW)
2850 disk->d_flags &= ~G_RAID3_DISK_FLAG_DIRTY;
2851 disk->d_state = state;
2854 g_raid3_update_metadata(disk);
2860 * 1. Device wasn't running yet, but disk disappear.
2870 KASSERT(disk->d_state == G_RAID3_DISK_STATE_ACTIVE ||
2871 disk->d_state == G_RAID3_DISK_STATE_STALE ||
2872 disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING,
2873 ("Wrong disk state (%s, %s).",
2874 g_raid3_get_diskname(disk),
2875 g_raid3_disk_state2str(disk->d_state)));
2878 KASSERT(disk->d_state == G_RAID3_DISK_STATE_NEW,
2879 ("Wrong disk state (%s, %s).",
2880 g_raid3_get_diskname(disk),
2881 g_raid3_disk_state2str(disk->d_state)));
2883 * Reset bumping syncid if disk disappeared in STARTING
2893 g_raid3_get_diskname(disk),
2894 g_raid3_disk_state2str(disk->d_state)));
2899 sc->sc_name, g_raid3_get_diskname(disk));
2901 g_raid3_destroy_disk(disk);
2966 G_RAID3_DEBUG(1, "Invalid disk %s number (no=%u), skipping.",
2977 "Invalid '%s' field on disk %s (device %s), skipping.",
2983 "0) on disk %s (device %s), skipping.", pp->name,
2989 "Invalid '%s' field on disk %s (device %s), skipping.",
2995 "Invalid '%s' field on disk %s (device %s), skipping.",
3001 "Invalid size of disk %s (device %s), skipping.", pp->name,
3007 "Invalid '%s' field on disk %s (device %s), skipping.",
3013 "Invalid '%s' field on disk %s (device %s), skipping.",
3019 "Invalid sector size of disk %s (device %s), skipping.",
3025 "Invalid device flags on disk %s (device %s), skipping.",
3035 "disk %s (device %s), skipping.", pp->name, sc->sc_name);
3040 "Invalid disk flags on disk %s (device %s), skipping.",
3051 struct g_raid3_disk *disk;
3055 G_RAID3_DEBUG(2, "Adding disk %s.", pp->name);
3066 disk = g_raid3_init_disk(sc, pp, md, &error);
3067 if (disk == NULL)
3069 error = g_raid3_event_send(disk, G_RAID3_DISK_STATE_NEW,
3076 g_raid3_update_metadata(disk);
3161 /* One disk is minimum. */
3393 G_RAID3_DEBUG(1, "Adding disk %s to %s.", pp->name, gp->name);
3398 G_RAID3_DEBUG(0, "Cannot add disk %s to %s (error=%d).",
3449 struct g_raid3_disk *disk;
3451 disk = cp->private;
3452 if (disk == NULL)
3457 if (disk->d_no == sc->sc_ndisks - 1)
3463 (u_int)disk->d_no);
3464 if (disk->d_state == G_RAID3_DISK_STATE_SYNCHRONIZING) {
3466 if (disk->d_sync.ds_offset == 0)
3470 (u_int)((disk->d_sync.ds_offset * 100) /
3474 if (disk->d_sync.ds_offset > 0) {
3477 (intmax_t)disk->d_sync.ds_offset);
3481 disk->d_sync.ds_syncid);
3482 sbuf_printf(sb, "%s<GenID>%u</GenID>\n", indent, disk->d_genid);
3484 if (disk->d_flags == 0)
3490 if ((disk->d_flags & (flag)) != 0) { \
3508 g_raid3_disk_state2str(disk->d_state));