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