Date: Sat, 28 Feb 2009 11:16:57 +0000 (UTC) From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r189162 - in stable/7/sys: . contrib/pf dev/cxgb geom Message-ID: <200902281116.n1SBGvpj007449@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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. */ }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902281116.n1SBGvpj007449>