Fix refcount locking in cd, pass, and sg periphs.
This commit is contained in:
parent
fec90b6c9b
commit
835187bff8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=186371
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user