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 cam_periph *periph;
|
||||||
struct cd_softc *softc;
|
struct cd_softc *softc;
|
||||||
|
int error;
|
||||||
|
|
||||||
periph = (struct cam_periph *)dp->d_drv1;
|
periph = (struct cam_periph *)dp->d_drv1;
|
||||||
if (periph == NULL)
|
if (periph == NULL)
|
||||||
@ -1049,7 +1050,11 @@ cdclose(struct disk *dp)
|
|||||||
softc = (struct cd_softc *)periph->softc;
|
softc = (struct cd_softc *)periph->softc;
|
||||||
|
|
||||||
cam_periph_lock(periph);
|
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,
|
CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH,
|
||||||
("cdclose\n"));
|
("cdclose\n"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user