Fix refcount locking in cd, pass, and sg periphs.
This commit is contained in:
parent
6bd8962c99
commit
db25dc2716
@ -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);
|
||||||
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);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user