Merge virtio_scsi change from projects/virtio

r252680:
    Fix SIM lock not owned panic

    The CAM locking requirements of registering an async
    callback has changed so the SIM lock must be held. Remove
    code that explicitly dropped the lock around the register.

    Also return CAM_SEL_TIMEOUT instead of CAM_TID_INVALID
    for bad targets to avoid a lot console spam during bus
    scans.

MFC after:	1 month
This commit is contained in:
Bryan Venteicher 2013-07-04 18:00:27 +00:00
parent 62a69c4153
commit 4d5919ec0b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=252709

View File

@ -542,19 +542,14 @@ vtscsi_register_cam(struct vtscsi_softc *sc)
goto fail;
}
VTSCSI_UNLOCK(sc);
/*
* The async register apparently needs to be done without
* the lock held, otherwise it can recurse on the lock.
*/
if (vtscsi_register_async(sc) != CAM_REQ_CMP) {
error = EIO;
device_printf(dev, "cannot register async callback\n");
VTSCSI_LOCK(sc);
goto fail;
}
VTSCSI_UNLOCK(sc);
return (0);
fail:
@ -622,8 +617,6 @@ vtscsi_register_async(struct vtscsi_softc *sc)
{
struct ccb_setasync csa;
VTSCSI_LOCK_NOTOWNED(sc);
xpt_setup_ccb(&csa.ccb_h, sc->vtscsi_path, 5);
csa.ccb_h.func_code = XPT_SASYNC_CB;
csa.event_enable = AC_LOST_DEVICE | AC_FOUND_DEVICE;
@ -1238,7 +1231,7 @@ vtscsi_scsi_cmd_cam_status(struct virtio_scsi_cmd_resp *cmd_resp)
status = CAM_REQ_ABORTED;
break;
case VIRTIO_SCSI_S_BAD_TARGET:
status = CAM_TID_INVALID;
status = CAM_SEL_TIMEOUT;
break;
case VIRTIO_SCSI_S_RESET:
status = CAM_SCSI_BUS_RESET;