Check status of cam_periph_hold() inside cdclose(). If cd device was

invalidated while open, cam_periph_hold() will return error and won't
get the reference.  Following reference release will crash the system.

Sponsored by:	iXsystems, Inc.
MFC after:	3 days
This commit is contained in:
mav 2012-06-20 18:25:51 +00:00
parent 12f0fa63b4
commit 056fd51a22

View File

@ -1041,6 +1041,7 @@ cdclose(struct disk *dp)
{
struct cam_periph *periph;
struct cd_softc *softc;
int error;
periph = (struct cam_periph *)dp->d_drv1;
if (periph == NULL)
@ -1049,7 +1050,11 @@ cdclose(struct disk *dp)
softc = (struct cd_softc *)periph->softc;
cam_periph_lock(periph);
cam_periph_hold(periph, PRIBIO);
if ((error = cam_periph_hold(periph, PRIBIO)) != 0) {
cam_periph_unlock(periph);
cam_periph_release(periph);
return (0);
}
CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH,
("cdclose\n"));