Fix refcount locking in cd, pass, and sg periphs.

This commit is contained in:
scottl 2008-12-21 06:20:11 +00:00
parent 6bd8962c99
commit db25dc2716
3 changed files with 13 additions and 11 deletions

View File

@ -996,12 +996,6 @@ cdopen(struct disk *dp)
return (error); return (error);
} }
/* Closes aren't symmetrical with opens, so fix up the refcounting. */
if (softc->flags & CD_FLAG_OPEN)
cam_periph_release(periph);
else
softc->flags |= CD_FLAG_OPEN;
/* /*
* Check for media, and set the appropriate flags. We don't bail * Check for media, and set the appropriate flags. We don't bail
* if we don't have media, but then we don't allow anything but the * if we don't have media, but then we don't allow anything but the
@ -1011,7 +1005,15 @@ cdopen(struct disk *dp)
CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("leaving cdopen\n")); CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("leaving cdopen\n"));
cam_periph_unhold(periph); cam_periph_unhold(periph);
/* Closes aren't symmetrical with opens, so fix up the refcounting. */
if ((softc->flags & CD_FLAG_OPEN) == 0) {
softc->flags |= CD_FLAG_OPEN;
cam_periph_unlock(periph); cam_periph_unlock(periph);
} else {
cam_periph_unlock(periph);
cam_periph_release(periph);
}
return (0); return (0);
} }

View File

@ -346,13 +346,13 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td)
if ((softc->flags & PASS_FLAG_OPEN) == 0) { if ((softc->flags & PASS_FLAG_OPEN) == 0) {
softc->flags |= PASS_FLAG_OPEN; softc->flags |= PASS_FLAG_OPEN;
cam_periph_unlock(periph);
} else { } else {
/* Device closes aren't symmertical, so fix up the refcount */ /* Device closes aren't symmertical, so fix up the refcount */
cam_periph_unlock(periph);
cam_periph_release(periph); cam_periph_release(periph);
} }
cam_periph_unlock(periph);
return (error); return (error);
} }

View File

@ -399,13 +399,13 @@ sgopen(struct cdev *dev, int flags, int fmt, struct thread *td)
if ((softc->flags & SG_FLAG_OPEN) == 0) { if ((softc->flags & SG_FLAG_OPEN) == 0) {
softc->flags |= SG_FLAG_OPEN; softc->flags |= SG_FLAG_OPEN;
cam_periph_unlock(periph);
} else { } else {
/* Device closes aren't symmetrical, fix up the refcount. */ /* Device closes aren't symmetrical, fix up the refcount. */
cam_periph_unlock(periph);
cam_periph_release(periph); cam_periph_release(periph);
} }
cam_periph_unlock(periph);
return (error); return (error);
} }