svn commit: r186188 - head/sys/geom

Edward Tomasz Napierala trasz at FreeBSD.org
Tue Dec 16 17:04:52 UTC 2008


Author: trasz
Date: Tue Dec 16 17:04:52 2008
New Revision: 186188
URL: http://svn.freebsd.org/changeset/base/186188

Log:
  Implement g_vfs_orphan().  Without it, the filesystem never closes
  the device, which means refcount on periph drivers never drops,
  which means cam_sim_free() never returns, which results in umass
  sleeping there ad infinitum.
  
  Submitted by:	pjd
  Reviewed by:	scottl, pjd
  Approved by:	rwatson (mentor)
  Sponsored by:	FreeBSD Foundation

Modified:
  head/sys/geom/geom_vfs.c

Modified: head/sys/geom/geom_vfs.c
==============================================================================
--- head/sys/geom/geom_vfs.c	Tue Dec 16 17:03:22 2008	(r186187)
+++ head/sys/geom/geom_vfs.c	Tue Dec 16 17:04:52 2008	(r186188)
@@ -93,10 +93,23 @@ g_vfs_strategy(struct bufobj *bo, struct
 {
 	struct g_consumer *cp;
 	struct bio *bip;
+	int vfslocked;
 
 	cp = bo->bo_private;
 	G_VALID_CONSUMER(cp);
 
+	/*
+	 * If the the provider has orphaned us, just return EXIO.
+	 */
+	if (cp->provider == NULL) {
+		bp->b_error = ENXIO;
+		bp->b_ioflags |= BIO_ERROR;
+		vfslocked = VFS_LOCK_GIANT(((struct mount *)NULL));
+		bufdone(bp);
+		VFS_UNLOCK_GIANT(vfslocked);
+		return;
+	}
+
 	bip = g_alloc_bio();
 	bip->bio_cmd = bp->b_iocmd;
 	bip->bio_offset = bp->b_iooffset;
@@ -110,18 +123,20 @@ g_vfs_strategy(struct bufobj *bo, struct
 static void
 g_vfs_orphan(struct g_consumer *cp)
 {
+	struct g_geom *gp;
+	struct bufobj *bo;
+
+	g_topology_assert();
+
+	gp = cp->geom;
+	bo = gp->softc;
+	g_trace(G_T_TOPOLOGY, "g_vfs_orphan(%p(%s))", cp, gp->name);
+	if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0)
+		g_access(cp, -cp->acr, -cp->acw, -cp->ace);
+	g_detach(cp);
 
 	/*
-	 * Don't do anything here yet.
-	 *
-	 * Ideally we should detach the consumer already now, but that
-	 * leads to a locking requirement in the I/O path to see if we have
-	 * a consumer or not.  Considering how ugly things are going to get
-	 * anyway as none of our filesystems are graceful about i/o errors,
-	 * this is not important right now.
-	 *
-	 * Down the road, this is the place where we could give the user
-	 * a "Abort, Retry or Ignore" option to replace the media again.
+	 * Do not destroy the geom. Filesystem will do this during unmount.
 	 */
 }
 


More information about the svn-src-all mailing list