cam: don't lock while handling an AC_UNIT_ATTENTION
Don't take the device_mtx lock in daasync() when handling an AC_UNIT_ATTENTION. Instead, assert the lock is held before modifying the periph's softc flags. The device_mtx lock is taken in xptdevicetraverse() before daasync() is eventually called in xpt_async_bcast(). PR: 240917, 226510, 226578 Reviewed by: imp MFC after: 3 weeks Differential Revision: https://reviews.freebsd.org/D27735
This commit is contained in:
parent
3b76242433
commit
bb8441184b
@ -2158,7 +2158,7 @@ daasync(void *callback_arg, u_int32_t code,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case AC_UNIT_ATTENTION:
|
||||
case AC_UNIT_ATTENTION: /* Called for this path: periph locked */
|
||||
{
|
||||
union ccb *ccb;
|
||||
int error_code, sense_key, asc, ascq;
|
||||
@ -2168,9 +2168,7 @@ daasync(void *callback_arg, u_int32_t code,
|
||||
|
||||
/*
|
||||
* Handle all UNIT ATTENTIONs except our own, as they will be
|
||||
* handled by daerror(). Since this comes from a different periph,
|
||||
* that periph's lock is held, not ours, so we have to take it ours
|
||||
* out to touch softc flags.
|
||||
* handled by daerror().
|
||||
*/
|
||||
if (xpt_path_periph(ccb->ccb_h.path) != periph &&
|
||||
scsi_extract_sense_ccb(ccb,
|
||||
@ -2178,22 +2176,19 @@ daasync(void *callback_arg, u_int32_t code,
|
||||
if (asc == 0x2A && ascq == 0x09) {
|
||||
xpt_print(ccb->ccb_h.path,
|
||||
"Capacity data has changed\n");
|
||||
cam_periph_lock(periph);
|
||||
cam_periph_assert(periph, MA_OWNED);
|
||||
softc->flags &= ~DA_FLAG_PROBED;
|
||||
dareprobe(periph);
|
||||
cam_periph_unlock(periph);
|
||||
} else if (asc == 0x28 && ascq == 0x00) {
|
||||
cam_periph_lock(periph);
|
||||
cam_periph_assert(periph, MA_OWNED);
|
||||
softc->flags &= ~DA_FLAG_PROBED;
|
||||
cam_periph_unlock(periph);
|
||||
disk_media_changed(softc->disk, M_NOWAIT);
|
||||
} else if (asc == 0x3F && ascq == 0x03) {
|
||||
xpt_print(ccb->ccb_h.path,
|
||||
"INQUIRY data has changed\n");
|
||||
cam_periph_lock(periph);
|
||||
cam_periph_assert(periph, MA_OWNED);
|
||||
softc->flags &= ~DA_FLAG_PROBED;
|
||||
dareprobe(periph);
|
||||
cam_periph_unlock(periph);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user