uas: move transfer kickoff
Kick next scsi transfer from request release callback instead of command completion callback, otherwise we might get stuck in case scsi_req_unref() doesn't release the request instantly due to someone else holding a reference too. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
adf478342b
commit
347e40ffe6
@ -424,6 +424,7 @@ static void usb_uas_scsi_free_request(SCSIBus *bus, void *priv)
|
|||||||
}
|
}
|
||||||
QTAILQ_REMOVE(&uas->requests, req, next);
|
QTAILQ_REMOVE(&uas->requests, req, next);
|
||||||
g_free(req);
|
g_free(req);
|
||||||
|
usb_uas_start_next_transfer(uas);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UASRequest *usb_uas_find_request(UASDevice *uas, uint16_t tag)
|
static UASRequest *usb_uas_find_request(UASDevice *uas, uint16_t tag)
|
||||||
@ -456,7 +457,6 @@ static void usb_uas_scsi_command_complete(SCSIRequest *r,
|
|||||||
uint32_t status, size_t resid)
|
uint32_t status, size_t resid)
|
||||||
{
|
{
|
||||||
UASRequest *req = r->hba_private;
|
UASRequest *req = r->hba_private;
|
||||||
UASDevice *uas = req->uas;
|
|
||||||
|
|
||||||
trace_usb_uas_scsi_complete(req->uas->dev.addr, req->tag, status, resid);
|
trace_usb_uas_scsi_complete(req->uas->dev.addr, req->tag, status, resid);
|
||||||
req->complete = true;
|
req->complete = true;
|
||||||
@ -465,7 +465,6 @@ static void usb_uas_scsi_command_complete(SCSIRequest *r,
|
|||||||
}
|
}
|
||||||
usb_uas_queue_sense(req, status);
|
usb_uas_queue_sense(req, status);
|
||||||
scsi_req_unref(req->req);
|
scsi_req_unref(req->req);
|
||||||
usb_uas_start_next_transfer(uas);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_uas_scsi_request_cancelled(SCSIRequest *r)
|
static void usb_uas_scsi_request_cancelled(SCSIRequest *r)
|
||||||
|
Loading…
Reference in New Issue
Block a user