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

Alexander Motin mav at FreeBSD.org
Sat Mar 19 18:26:54 UTC 2011


Author: mav
Date: Sat Mar 19 18:26:54 2011
New Revision: 219778
URL: http://svn.freebsd.org/changeset/base/219778

Log:
  Make metadata writing respect all arguments to not touch unrelated drives.
  Improve marking disk as failed by attempting write flags to disk itself.

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

Modified: projects/graid/head/sys/geom/raid/md_promise.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_promise.c	Sat Mar 19 17:14:06 2011	(r219777)
+++ projects/graid/head/sys/geom/raid/md_promise.c	Sat Mar 19 18:26:54 2011	(r219778)
@@ -1805,8 +1805,20 @@ g_raid_md_write_promise(struct g_raid_md
 	TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
 		if (vol->v_stopping)
 			continue;
+
+		/* Skip volumes not related to specified targets. */
 		if (tvol != NULL && vol != tvol)
 			continue;
+		if (tsd != NULL && vol != tsd->sd_volume)
+			continue;
+		if (tdisk != NULL) {
+			for (i = 0; i < vol->v_disks_count; i++) {
+				if (vol->v_subdisks[i].sd_disk == tdisk)
+					break;
+			}
+			if (i >= vol->v_disks_count)
+				continue;
+		}
 
 		pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data;
 		pv->pv_generation++;
@@ -1978,26 +1990,36 @@ g_raid_md_fail_disk_promise(struct g_rai
 	struct g_raid_md_promise_object *mdi;
 	struct g_raid_md_promise_perdisk *pd;
 	struct g_raid_subdisk *sd;
+	int i, pos;
 
 	sc = md->mdo_softc;
 	mdi = (struct g_raid_md_promise_object *)md;
 	pd = (struct g_raid_md_promise_perdisk *)tdisk->d_md_data;
 
 	/* We can't fail disk that is not a part of array now. */
-//	if (pd->pd_disk_pos < 0)
-//		return (-1);
+	if (tdisk->d_state != G_RAID_DISK_S_ACTIVE)
+		return (-1);
 
 	/*
 	 * Mark disk as failed in metadata and try to write that metadata
 	 * to the disk itself to prevent it's later resurrection as STALE.
 	 */
-#if 0
-	mdi->mdio_meta->disk[pd->pd_disk_pos].flags = PROMISE_F_FAILED;
-	pd->pd_disk_meta.flags = PROMISE_F_FAILED;
-	g_raid_md_promise_print(mdi->mdio_meta);
-	if (tdisk->d_consumer)
-		promise_meta_write(tdisk->d_consumer, mdi->mdio_meta);
-#endif
+	if (pd->pd_subdisks > 0 && tdisk->d_consumer != NULL)
+		G_RAID_DEBUG(1, "Writing Promise metadata to %s",
+		    g_raid_get_diskname(tdisk));
+	for (i = 0; i < pd->pd_subdisks; i++) {
+		pd->pd_meta[i]->disk.flags |=
+		    PROMISE_F_DOWN | PROMISE_F_REDIR;
+		pos = pd->pd_meta[i]->disk.number;
+		if (pos >= 0 && pos < PROMISE_MAX_DISKS) {
+			pd->pd_meta[i]->disks[pos].flags |=
+			    PROMISE_F_DOWN | PROMISE_F_REDIR;
+		}
+		g_raid_md_promise_print(pd->pd_meta[i]);
+	}
+	if (tdisk->d_consumer != NULL)
+		promise_meta_write(tdisk->d_consumer,
+		    pd->pd_meta, pd->pd_subdisks);
 
 	/* Change states. */
 	g_raid_change_disk_state(tdisk, G_RAID_DISK_S_FAILED);


More information about the svn-src-projects mailing list