Author: trasz
Date: Sat Feb 28 11:16:57 2009
New Revision: 189162
URL: http://svn.freebsd.org/changeset/base/189162

Log:
  MFC r186188:
  
  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:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/geom/geom_vfs.c

Modified: stable/7/sys/geom/geom_vfs.c
==============================================================================
--- stable/7/sys/geom/geom_vfs.c        Sat Feb 28 11:11:38 2009        
(r189161)
+++ stable/7/sys/geom/geom_vfs.c        Sat Feb 28 11:16:57 2009        
(r189162)
@@ -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.
         */
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to