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
This commit is contained in:
parent
d2c205d5de
commit
ce8be7b8b0
@ -93,10 +93,23 @@ g_vfs_strategy(struct bufobj *bo, struct buf *bp)
|
||||
{
|
||||
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 buf *bp)
|
||||
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.
|
||||
*/
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user