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:
parent
12f0fa63b4
commit
056fd51a22
@ -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"));
|
||||
|
Loading…
Reference in New Issue
Block a user