summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2005-01-04 12:15:21 +0000
committerpjd <pjd@FreeBSD.org>2005-01-04 12:15:21 +0000
commit589a9682ce2f41d12724fc0d82575eeac5f45938 (patch)
tree5c4d40c02fb91b990742df9b839337d75591a247 /sys/geom
parentc1f23c6a62860ae177fdb27b66a767a67eba3980 (diff)
downloadFreeBSD-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.c57
-rw-r--r--sys/geom/raid3/g_raid3.h12
-rw-r--r--sys/geom/raid3/g_raid3_ctl.c15
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
OpenPOWER on IntegriCloud