Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Mar 2011 12:38:10 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r219797 - projects/graid/head/sys/geom/raid
Message-ID:  <201103201238.p2KCcAJu078967@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sun Mar 20 12:38:09 2011
New Revision: 219797
URL: http://svn.freebsd.org/changeset/base/219797

Log:
  Purge all remaining events referring objects we are destroying. In most
  cases there should be none, but better to be safe.

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

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Sun Mar 20 12:05:57 2011	(r219796)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Sun Mar 20 12:38:09 2011	(r219797)
@@ -474,21 +474,16 @@ g_raid_event_send(void *arg, int event, 
 	return (error);
 }
 
-#if 0
 static void
-g_raid_event_cancel(struct g_raid_disk *disk)
+g_raid_event_cancel(struct g_raid_softc *sc, void *tgt)
 {
-	struct g_raid_softc *sc;
 	struct g_raid_event *ep, *tmpep;
 
-	sc = disk->d_softc;
 	sx_assert(&sc->sc_lock, SX_XLOCKED);
 
 	mtx_lock(&sc->sc_queue_mtx);
 	TAILQ_FOREACH_SAFE(ep, &sc->sc_events, e_next, tmpep) {
-		if ((ep->e_flags & G_RAID_EVENT_VOLUME) != 0)
-			continue;
-		if (ep->e_tgt != disk)
+		if (ep->e_tgt != tgt)
 			continue;
 		TAILQ_REMOVE(&sc->sc_events, ep, e_next);
 		if ((ep->e_flags & G_RAID_EVENT_WAIT) == 0)
@@ -500,7 +495,6 @@ g_raid_event_cancel(struct g_raid_disk *
 	}
 	mtx_unlock(&sc->sc_queue_mtx);
 }
-#endif
 
 static int
 g_raid_event_check(struct g_raid_softc *sc, void *tgt)
@@ -1833,6 +1827,7 @@ g_raid_destroy_node(struct g_raid_softc 
 	} else
 		G_RAID_DEBUG(1, "Array destroyed.");
 	if (worker) {
+		g_raid_event_cancel(sc, sc);
 		mtx_destroy(&sc->sc_queue_mtx);
 		sx_xunlock(&sc->sc_lock);
 		sx_destroy(&sc->sc_lock);
@@ -1883,6 +1878,7 @@ g_raid_destroy_volume(struct g_raid_volu
 	g_topology_unlock();
 	TAILQ_REMOVE(&sc->sc_volumes, vol, v_next);
 	for (i = 0; i < G_RAID_MAX_SUBDISKS; i++) {
+		g_raid_event_cancel(sc, &vol->v_subdisks[i]);
 		disk = vol->v_subdisks[i].sd_disk;
 		if (disk == NULL)
 			continue;
@@ -1891,6 +1887,7 @@ g_raid_destroy_volume(struct g_raid_volu
 	G_RAID_DEBUG1(2, sc, "Volume %s destroyed.", vol->v_name);
 	if (sc->sc_md)
 		G_RAID_MD_FREE_VOLUME(sc->sc_md, vol);
+	g_raid_event_cancel(sc, vol);
 	free(vol, M_RAID);
 	if (sc->sc_stopping == G_RAID_DESTROY_HARD) {
 		/* Wake up worker to let it selfdestruct. */
@@ -1921,6 +1918,7 @@ g_raid_destroy_disk(struct g_raid_disk *
 	TAILQ_REMOVE(&sc->sc_disks, disk, d_next);
 	if (sc->sc_md)
 		G_RAID_MD_FREE_DISK(sc->sc_md, disk);
+	g_raid_event_cancel(sc, disk);
 	free(disk, M_RAID);
 	return (0);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103201238.p2KCcAJu078967>