Release the "TUR" reference when clearing the TUR work flag. We mostly

do this right, except when there's no BP and we do a TUR by request.
In that case, we clear the flag, but don't release the reference,
leaking the reference on rare occasion.

PR: 226510
Sponsored by: Netflix
This commit is contained in:
Warner Losh 2018-03-20 22:07:45 +00:00
parent 83fc34ea0d
commit 7b0eb8dbf8

View File

@ -3114,6 +3114,7 @@ dastart(struct cam_periph *periph, union ccb *start_ccb)
if (bp == NULL) {
if (cam_iosched_has_work_flags(softc->cam_iosched, DA_WORK_TUR)) {
cam_iosched_clr_work_flags(softc->cam_iosched, DA_WORK_TUR);
da_periph_release_locked(periph, DA_REF_TUR);
scsi_test_unit_ready(&start_ccb->csio,
/*retries*/ da_retry_count,
dadone,
@ -3139,11 +3140,6 @@ dastart(struct cam_periph *periph, union ccb *start_ccb)
}
}
if (cam_iosched_has_work_flags(softc->cam_iosched, DA_WORK_TUR)) {
cam_iosched_clr_work_flags(softc->cam_iosched, DA_WORK_TUR);
da_periph_release_locked(periph, DA_REF_TUR);
}
if ((bp->bio_flags & BIO_ORDERED) != 0 ||
(softc->flags & DA_FLAG_NEED_OTAG) != 0) {
softc->flags &= ~DA_FLAG_NEED_OTAG;