svn commit: r217998 - projects/graid/head/sys/geom/raid

Warner Losh imp at FreeBSD.org
Thu Jan 27 23:25:13 UTC 2011


Author: imp
Date: Thu Jan 27 23:25:13 2011
New Revision: 217998
URL: http://svn.freebsd.org/changeset/base/217998

Log:
  Keep track of the state we're in wrt rebuilding.  When we have a disk
  exit the system during a rebuild, don't try to start another rebuild
  on it (crazy, eh?).  This fixes the crash that we were seeing on power
  off of a disk, as far as I'm able to test.

Modified:
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Jan 27 23:16:41 2011	(r217997)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Jan 27 23:25:13 2011	(r217998)
@@ -110,8 +110,6 @@ static struct g_raid_tr_class g_raid_tr_
 	.trc_priority = 100
 };
 
-static void g_raid_tr_raid1_rebuild_abort(struct g_raid_tr_object *tr,
-    struct g_raid_volume *vol);
 static void g_raid_tr_raid1_maybe_rebuild(struct g_raid_tr_object *tr,
     struct g_raid_volume *vol);
 
@@ -202,8 +200,10 @@ g_raid_tr_raid1_idle_rebuild(struct g_ra
 	struct g_raid_tr_raid1_object *trs;
 
 	trs = (struct g_raid_tr_raid1_object *)argp;
-	if (trs->trso_good_sd == NULL || trs->trso_failed_sd == NULL)
+	if (trs->trso_good_sd == NULL || trs->trso_failed_sd == NULL) {
+		printf("I hit the case that's obsolete, right?\n");
 		return;
+	}
 	g_raid_event_send(trs->trso_failed_sd, G_RAID_SUBDISK_E_TR_REBUILD_SOME,
 	    G_RAID_EVENT_SUBDISK);
 }
@@ -221,6 +221,7 @@ g_raid_tr_raid1_rebuild_finish(struct g_
 	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
 	free(trs->trso_buffer, M_TR_raid1);
 	trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
+	trs->trso_type = TR_RAID1_NONE;
 	trs->trso_recover_slabs = 0;
 	trs->trso_failed_sd = NULL;
 	trs->trso_good_sd = NULL;
@@ -241,6 +242,7 @@ g_raid_tr_raid1_rebuild_abort(struct g_r
 	g_raid_write_metadata(vol->v_softc, vol, sd, sd->sd_disk);
 	free(trs->trso_buffer, M_TR_raid1);
 	trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
+	trs->trso_type = TR_RAID1_NONE;
 	trs->trso_recover_slabs = 0;
 	trs->trso_failed_sd = NULL;
 	trs->trso_good_sd = NULL;
@@ -317,11 +319,22 @@ g_raid_tr_raid1_maybe_rebuild(struct g_r
 		return;
 	na = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_ACTIVE);
 	nr = g_raid_nsubdisks(vol, G_RAID_SUBDISK_S_REBUILD);
-	if (na == 0 || nr == 0)
-		return;
-	if (trs->trso_good_sd)
-		return;
-	g_raid_tr_raid1_rebuild_start(tr, vol);
+	switch(trs->trso_type) {
+	case TR_RAID1_NONE:
+		if (na == 0 || nr == 0)
+			return;
+		if (trs->trso_type != TR_RAID1_NONE)
+			return;
+		g_raid_tr_raid1_rebuild_start(tr, vol);
+		break;
+	case TR_RAID1_REBUILD:
+		/*
+		 * We're rebuilding, maybe we need to stop...
+		 */
+		break;
+	case TR_RAID1_RESYNC:
+		break;
+	}
 }
 
 static int
@@ -340,12 +353,12 @@ g_raid_tr_event_raid1(struct g_raid_tr_o
 			g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_REBUILD);
 		break;
 	case G_RAID_SUBDISK_E_FAILED:
-		if (trs->trso_good_sd)
+		if (trs->trso_type == TR_RAID1_REBUILD)
 			g_raid_tr_raid1_rebuild_abort(tr, vol);
 //		g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_FAILED);
 		break;
 	case G_RAID_SUBDISK_E_DISCONNECTED:
-		if (trs->trso_good_sd)
+		if (trs->trso_type == TR_RAID1_REBUILD)
 			g_raid_tr_raid1_rebuild_abort(tr, vol);
 		g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE);
 		break;


More information about the svn-src-projects mailing list