Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Feb 2011 14:26:23 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r218732 - projects/graid/head/sys/geom/raid
Message-ID:  <201102161426.p1GEQNrw072611@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed Feb 16 14:26:23 2011
New Revision: 218732
URL: http://svn.freebsd.org/changeset/base/218732

Log:
  Move topology lock/unlock inside g_raid_kill_consumer().

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

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Wed Feb 16 14:25:26 2011	(r218731)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Wed Feb 16 14:26:23 2011	(r218732)
@@ -652,11 +652,12 @@ g_raid_kill_consumer(struct g_raid_softc
 	struct g_provider *pp;
 	int retaste_wait;
 
-	g_topology_assert();
+	g_topology_assert_not();
 
+	g_topology_lock();
 	cp->private = NULL;
 	if (g_raid_consumer_is_busy(sc, cp))
-		return;
+		goto out;
 	pp = cp->provider;
 	retaste_wait = 0;
 	if (cp->acw == 1) {
@@ -676,11 +677,13 @@ g_raid_kill_consumer(struct g_raid_softc
 		 * after retaste event is sent.
 		 */
 		g_post_event(g_raid_destroy_consumer, cp, M_WAITOK, NULL);
-		return;
+		goto out;
 	}
 	G_RAID_DEBUG(1, "Consumer %s destroyed.", pp->name);
 	g_detach(cp);
 	g_destroy_consumer(cp);
+out:
+	g_topology_unlock();
 }
 
 static void
@@ -1228,11 +1231,8 @@ g_raid_disk_done_request(struct bio *bp)
 	if (bp->bio_from != NULL) {
 		bp->bio_from->index--;
 		disk = bp->bio_from->private;
-		if (disk == NULL) {
-			g_topology_lock();
+		if (disk == NULL)
 			g_raid_kill_consumer(sc, bp->bio_from);
-			g_topology_unlock();
-		}
 	}
 	bp->bio_offset -= sd->sd_offset;
 
@@ -1869,9 +1869,7 @@ g_raid_destroy_disk(struct g_raid_disk *
 	sc = disk->d_softc;
 	G_RAID_DEBUG1(2, sc, "Destroying disk.");
 	if (disk->d_consumer) {
-		g_topology_lock();
 		g_raid_kill_consumer(sc, disk->d_consumer);
-		g_topology_unlock();
 		disk->d_consumer = NULL;
 	}
 	TAILQ_FOREACH_SAFE(sd, &disk->d_subdisks, sd_next, tmp) {

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Wed Feb 16 14:25:26 2011	(r218731)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Wed Feb 16 14:26:23 2011	(r218732)
@@ -1327,9 +1327,7 @@ g_raid_md_event_intel(struct g_raid_md_o
 		if (pd->pd_disk_pos >= 0) {
 			g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE);
 			if (disk->d_consumer) {
-				g_topology_lock();
 				g_raid_kill_consumer(sc, disk->d_consumer);
-				g_topology_unlock();
 				disk->d_consumer = NULL;
 			}
 			TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
@@ -1908,9 +1906,7 @@ makedisk:
 			if (pd->pd_disk_pos >= 0) {
 				g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE);
 				if (disk->d_consumer) {
-					g_topology_lock();
 					g_raid_kill_consumer(sc, disk->d_consumer);
-					g_topology_unlock();
 					disk->d_consumer = NULL;
 				}
 				TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
@@ -1992,9 +1988,7 @@ makedisk:
 				gctl_error(req,
 				    "Can't get serial for provider '%s'.",
 				    diskname);
-				g_topology_lock();
 				g_raid_kill_consumer(sc, cp);
-				g_topology_unlock();
 				error = -7;
 				break;
 			}

Modified: projects/graid/head/sys/geom/raid/md_jmicron.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_jmicron.c	Wed Feb 16 14:25:26 2011	(r218731)
+++ projects/graid/head/sys/geom/raid/md_jmicron.c	Wed Feb 16 14:26:23 2011	(r218732)
@@ -987,9 +987,7 @@ g_raid_md_event_jmicron(struct g_raid_md
 		if (pd->pd_disk_pos >= 0) {
 			g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE);
 			if (disk->d_consumer) {
-				g_topology_lock();
 				g_raid_kill_consumer(sc, disk->d_consumer);
-				g_topology_unlock();
 				disk->d_consumer = NULL;
 			}
 			TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
@@ -1319,9 +1317,7 @@ makedisk:
 			if (pd->pd_disk_pos >= 0) {
 				g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE);
 				if (disk->d_consumer) {
-					g_topology_lock();
 					g_raid_kill_consumer(sc, disk->d_consumer);
-					g_topology_unlock();
 					disk->d_consumer = NULL;
 				}
 				TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {



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