Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Sep 2012 08:22:51 +0000 (UTC)
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241022 - head/sys/geom
Message-ID:  <201209280822.q8S8Mp5G003292@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pjd
Date: Fri Sep 28 08:22:51 2012
New Revision: 241022
URL: http://svn.freebsd.org/changeset/base/241022

Log:
  Remove the topology lock from disk_gone(), it might be called with regular
  mutexes held and the topology lock is an sx lock.
  
  The topology lock was there to protect traversing through the list of providers
  of disk's geom, but it seems that disk's geom has always exactly one provider.
  
  Change the code to call g_wither_provider() for this one provider, which is
  safe to do without holding the topology lock and assert that there is indeed
  only one provider.
  
  Discussed with:	ken
  MFC after:	1 week

Modified:
  head/sys/geom/geom_disk.c

Modified: head/sys/geom/geom_disk.c
==============================================================================
--- head/sys/geom/geom_disk.c	Fri Sep 28 07:51:30 2012	(r241021)
+++ head/sys/geom/geom_disk.c	Fri Sep 28 08:22:51 2012	(r241022)
@@ -635,13 +635,15 @@ disk_gone(struct disk *dp)
 	struct g_geom *gp;
 	struct g_provider *pp;
 
-	g_topology_lock();
 	gp = dp->d_geom;
 	if (gp != NULL) {
-		LIST_FOREACH(pp, &gp->provider, provider)
+		pp = LIST_FIRST(&gp->provider);
+		if (pp != NULL) {
+			KASSERT(LIST_NEXT(pp, provider) == NULL,
+			    ("geom %p has more than one provider", gp));
 			g_wither_provider(pp, ENXIO);
+		}
 	}
-	g_topology_unlock();
 }
 
 void



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