mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
scsi: introduce scsi_req_cancel
This is for when the request must be dropped in the void, but still memory should be freed. To this end, the devices register a second callback in SCSIBusOps. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
19d110ab8a
commit
94d3f98a3f
8 changed files with 80 additions and 17 deletions
|
@ -549,6 +549,19 @@ void scsi_req_complete(SCSIRequest *req)
|
|||
scsi_req_unref(req);
|
||||
}
|
||||
|
||||
void scsi_req_cancel(SCSIRequest *req)
|
||||
{
|
||||
if (req->dev && req->dev->info->cancel_io) {
|
||||
req->dev->info->cancel_io(req);
|
||||
}
|
||||
scsi_req_ref(req);
|
||||
scsi_req_dequeue(req);
|
||||
if (req->bus->ops->cancel) {
|
||||
req->bus->ops->cancel(req);
|
||||
}
|
||||
scsi_req_unref(req);
|
||||
}
|
||||
|
||||
void scsi_req_abort(SCSIRequest *req, int status)
|
||||
{
|
||||
req->status = status;
|
||||
|
@ -564,9 +577,7 @@ void scsi_device_purge_requests(SCSIDevice *sdev)
|
|||
|
||||
while (!QTAILQ_EMPTY(&sdev->requests)) {
|
||||
req = QTAILQ_FIRST(&sdev->requests);
|
||||
sdev->info->cancel_io(req);
|
||||
scsi_req_dequeue(req);
|
||||
scsi_req_unref(req);
|
||||
scsi_req_cancel(req);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue