diff options
author | pjd <pjd@FreeBSD.org> | 2005-01-04 12:15:21 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2005-01-04 12:15:21 +0000 |
commit | 589a9682ce2f41d12724fc0d82575eeac5f45938 (patch) | |
tree | 5c4d40c02fb91b990742df9b839337d75591a247 /sys/geom | |
parent | c1f23c6a62860ae177fdb27b66a767a67eba3980 (diff) | |
download | FreeBSD-src-589a9682ce2f41d12724fc0d82575eeac5f45938.zip FreeBSD-src-589a9682ce2f41d12724fc0d82575eeac5f45938.tar.gz |
- Fix 'rebuild' command - it can no longer relay on retaste event
(we ignore it).
- Remove code used for handling spoil events, as spoiling is not possible
anymore, because we keep consumers open for writing all the time.
MFC after: 4 days
Diffstat (limited to 'sys/geom')
-rw-r--r-- | sys/geom/raid3/g_raid3.c | 57 | ||||
-rw-r--r-- | sys/geom/raid3/g_raid3.h | 12 | ||||
-rw-r--r-- | sys/geom/raid3/g_raid3_ctl.c | 15 |
3 files changed, 34 insertions, 50 deletions
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c index 2a97462..e65cf43 100644 --- a/sys/geom/raid3/g_raid3.c +++ b/sys/geom/raid3/g_raid3.c @@ -611,22 +611,7 @@ g_raid3_orphan(struct g_consumer *cp) disk = cp->private; if (disk == NULL) return; - disk->d_softc->sc_bump_id = G_RAID3_BUMP_SYNCID_OFW; - g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED, - G_RAID3_EVENT_DONTWAIT); -} - -static void -g_raid3_spoiled(struct g_consumer *cp) -{ - struct g_raid3_disk *disk; - - g_topology_assert(); - - disk = cp->private; - if (disk == NULL) - return; - disk->d_softc->sc_bump_id = G_RAID3_BUMP_SYNCID_IMM; + disk->d_softc->sc_bump_id = G_RAID3_BUMP_SYNCID; g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED, G_RAID3_EVENT_DONTWAIT); } @@ -659,7 +644,7 @@ g_raid3_write_metadata(struct g_raid3_disk *disk, struct g_raid3_metadata *md) g_topology_lock(); free(sector, M_RAID3); if (error != 0) { - disk->d_softc->sc_bump_id = G_RAID3_BUMP_GENID_IMM; + disk->d_softc->sc_bump_id = G_RAID3_BUMP_GENID; g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED, G_RAID3_EVENT_DONTWAIT); } @@ -1093,7 +1078,7 @@ g_raid3_gather(struct bio *pbp) * Actually this is pointless to bump genid, * because whole device is fucked up. */ - sc->sc_bump_id |= G_RAID3_BUMP_GENID_IMM; + sc->sc_bump_id |= G_RAID3_BUMP_GENID; g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED, G_RAID3_EVENT_DONTWAIT); @@ -1256,8 +1241,7 @@ g_raid3_regular_request(struct bio *cbp) if (cbp->bio_error != 0) { disk = cbp->bio_caller2; if (disk != NULL) { - sc->sc_bump_id |= - G_RAID3_BUMP_GENID_IMM; + sc->sc_bump_id |= G_RAID3_BUMP_GENID; g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED, G_RAID3_EVENT_DONTWAIT); @@ -1457,7 +1441,7 @@ g_raid3_sync_request(struct bio *bp) "Synchronization request failed (error=%d).", bp->bio_error); g_destroy_bio(bp); - sc->sc_bump_id |= G_RAID3_BUMP_GENID_IMM; + sc->sc_bump_id |= G_RAID3_BUMP_GENID; g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED, G_RAID3_EVENT_DONTWAIT); @@ -1657,7 +1641,7 @@ g_raid3_register_request(struct bio *pbp) /* * Bump syncid on first write. */ - if ((sc->sc_bump_id & G_RAID3_BUMP_SYNCID_OFW) != 0) { + if ((sc->sc_bump_id & G_RAID3_BUMP_SYNCID) != 0) { sc->sc_bump_id &= ~G_RAID3_BUMP_SYNCID; g_topology_lock(); g_raid3_bump_syncid(sc); @@ -2248,7 +2232,7 @@ g_raid3_update_device(struct g_raid3_softc *sc, boolean_t force) sc->sc_syncid = syncid; if (force) { /* Remember to bump syncid on first write. */ - sc->sc_bump_id |= G_RAID3_BUMP_SYNCID_OFW; + sc->sc_bump_id |= G_RAID3_BUMP_SYNCID; } if (ndisks == sc->sc_ndisks) state = G_RAID3_DEVICE_STATE_COMPLETE; @@ -2265,20 +2249,15 @@ g_raid3_update_device(struct g_raid3_softc *sc, boolean_t force) state = g_raid3_determine_state(disk); g_raid3_event_send(disk, state, G_RAID3_EVENT_DONTWAIT); if (state == G_RAID3_DISK_STATE_STALE) - sc->sc_bump_id |= G_RAID3_BUMP_SYNCID_OFW; + sc->sc_bump_id |= G_RAID3_BUMP_SYNCID; } break; } case G_RAID3_DEVICE_STATE_DEGRADED: /* - * Bump syncid and/or genid here, if we need to do it - * immediately. + * Genid need to be bumped immediately, so do it here. */ - if ((sc->sc_bump_id & G_RAID3_BUMP_SYNCID_IMM) != 0) { - sc->sc_bump_id &= ~G_RAID3_BUMP_SYNCID; - g_raid3_bump_syncid(sc); - } - if ((sc->sc_bump_id & G_RAID3_BUMP_GENID_IMM) != 0) { + if ((sc->sc_bump_id & G_RAID3_BUMP_GENID) != 0) { sc->sc_bump_id &= ~G_RAID3_BUMP_GENID; g_raid3_bump_genid(sc); } @@ -2306,14 +2285,9 @@ g_raid3_update_device(struct g_raid3_softc *sc, boolean_t force) break; case G_RAID3_DEVICE_STATE_COMPLETE: /* - * Bump syncid and/or genid here, if we need to do it - * immediately. + * Genid need to be bumped immediately, so do it here. */ - if ((sc->sc_bump_id & G_RAID3_BUMP_SYNCID_IMM) != 0) { - sc->sc_bump_id &= ~G_RAID3_BUMP_SYNCID; - g_raid3_bump_syncid(sc); - } - if ((sc->sc_bump_id & G_RAID3_BUMP_GENID_IMM) != 0) { + if ((sc->sc_bump_id & G_RAID3_BUMP_GENID) != 0) { sc->sc_bump_id &= ~G_RAID3_BUMP_GENID; g_raid3_bump_genid(sc); } @@ -2510,7 +2484,7 @@ again: * Reset bumping syncid if disk disappeared in STARTING * state. */ - if ((sc->sc_bump_id & G_RAID3_BUMP_SYNCID_OFW) != 0) + if ((sc->sc_bump_id & G_RAID3_BUMP_SYNCID) != 0) sc->sc_bump_id &= ~G_RAID3_BUMP_SYNCID; #ifdef INVARIANTS } else { @@ -2535,7 +2509,7 @@ again: } #undef DISK_STATE_CHANGED -static int +int g_raid3_read_metadata(struct g_consumer *cp, struct g_raid3_metadata *md) { struct g_provider *pp; @@ -2663,7 +2637,7 @@ g_raid3_check_metadata(struct g_raid3_softc *sc, struct g_provider *pp, return (0); } -static int +int g_raid3_add_disk(struct g_raid3_softc *sc, struct g_provider *pp, struct g_raid3_metadata *md) { @@ -2766,7 +2740,6 @@ g_raid3_create(struct g_class *mp, const struct g_raid3_metadata *md) sc->sc_disks = malloc(sizeof(struct g_raid3_disk) * md->md_all, M_RAID3, M_WAITOK | M_ZERO); gp->start = g_raid3_start; - gp->spoiled = g_raid3_spoiled; gp->orphan = g_raid3_orphan; gp->access = g_raid3_access; gp->dumpconf = g_raid3_dumpconf; diff --git a/sys/geom/raid3/g_raid3.h b/sys/geom/raid3/g_raid3.h index ffb463c..ce0518d 100644 --- a/sys/geom/raid3/g_raid3.h +++ b/sys/geom/raid3/g_raid3.h @@ -163,14 +163,9 @@ struct g_raid3_event { #define G_RAID3_DEVICE_STATE_COMPLETE 2 /* Bump syncid on first write. */ -#define G_RAID3_BUMP_SYNCID_OFW 0x1 -/* Bump syncid immediately. */ -#define G_RAID3_BUMP_SYNCID_IMM 0x2 -#define G_RAID3_BUMP_SYNCID (G_RAID3_BUMP_SYNCID_OFW | \ - G_RAID3_BUMP_SYNCID_IMM) +#define G_RAID3_BUMP_SYNCID 0x1 /* Bump genid immediately. */ -#define G_RAID3_BUMP_GENID_IMM 0x4 -#define G_RAID3_BUMP_GENID (G_RAID3_BUMP_GENID_IMM) +#define G_RAID3_BUMP_GENID 0x2 struct g_raid3_softc { u_int sc_state; /* Device state. */ @@ -214,6 +209,9 @@ u_int g_raid3_ndisks(struct g_raid3_softc *sc, int state); int g_raid3_destroy(struct g_raid3_softc *sc, boolean_t force); int g_raid3_event_send(void *arg, int state, int flags); struct g_raid3_metadata; +int g_raid3_add_disk(struct g_raid3_softc *sc, struct g_provider *pp, + struct g_raid3_metadata *md); +int g_raid3_read_metadata(struct g_consumer *cp, struct g_raid3_metadata *md); void g_raid3_fill_metadata(struct g_raid3_disk *disk, struct g_raid3_metadata *md); int g_raid3_clear_metadata(struct g_raid3_disk *disk); diff --git a/sys/geom/raid3/g_raid3_ctl.c b/sys/geom/raid3/g_raid3_ctl.c index 41d2fcf..d074481 100644 --- a/sys/geom/raid3/g_raid3_ctl.c +++ b/sys/geom/raid3/g_raid3_ctl.c @@ -220,10 +220,12 @@ g_raid3_ctl_configure(struct gctl_req *req, struct g_class *mp) static void g_raid3_ctl_rebuild(struct gctl_req *req, struct g_class *mp) { + struct g_raid3_metadata md; struct g_raid3_softc *sc; struct g_raid3_disk *disk; + struct g_provider *pp; const char *name; - int *nargs; + int error, *nargs; g_topology_assert(); nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs)); @@ -268,8 +270,19 @@ g_raid3_ctl_rebuild(struct gctl_req *req, struct g_class *mp) if ((sc->sc_flags & G_RAID3_DEVICE_FLAG_NOAUTOSYNC) != 0) disk->d_flags |= G_RAID3_DISK_FLAG_FORCE_SYNC; g_raid3_update_metadata(disk); + pp = disk->d_consumer->provider; + error = g_raid3_read_metadata(disk->d_consumer, &md); g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED, G_RAID3_EVENT_WAIT); + if (error != 0) { + gctl_error(req, "Cannot read metadata from %s.", pp->name); + return; + } + error = g_raid3_add_disk(sc, pp, &md); + if (error != 0) { + gctl_error(req, "Cannot reconnect component %s.", pp->name); + return; + } } static void |