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

This commit is contained in:
Scott Long 2008-12-21 06:20:11 +00:00
parent fec90b6c9b
commit 835187bff8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=186371
3 changed files with 13 additions and 11 deletions

View File

@ -996,12 +996,6 @@ cdopen(struct disk *dp)
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
* 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_periph_unhold(periph);
cam_periph_unlock(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);
} else {
cam_periph_unlock(periph);
cam_periph_release(periph);
}
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) {
softc->flags |= PASS_FLAG_OPEN;
cam_periph_unlock(periph);
} else {
/* Device closes aren't symmertical, so fix up the refcount */
cam_periph_unlock(periph);
cam_periph_release(periph);
}
cam_periph_unlock(periph);
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) {
softc->flags |= SG_FLAG_OPEN;
cam_periph_unlock(periph);
} else {
/* Device closes aren't symmetrical, fix up the refcount. */
cam_periph_unlock(periph);
cam_periph_release(periph);
}
cam_periph_unlock(periph);
return (error);
}