Revision 19d110ab
b/hw/scsi-bus.c | ||
---|---|---|
549 | 549 |
scsi_req_unref(req); |
550 | 550 |
} |
551 | 551 |
|
552 |
void scsi_req_abort(SCSIRequest *req, int status) |
|
553 |
{ |
|
554 |
req->status = status; |
|
555 |
if (req->dev && req->dev->info->cancel_io) { |
|
556 |
req->dev->info->cancel_io(req); |
|
557 |
} |
|
558 |
scsi_req_complete(req); |
|
559 |
} |
|
560 |
|
|
552 | 561 |
void scsi_device_purge_requests(SCSIDevice *sdev) |
553 | 562 |
{ |
554 | 563 |
SCSIRequest *req; |
b/hw/scsi.h | ||
---|---|---|
114 | 114 |
void scsi_req_print(SCSIRequest *req); |
115 | 115 |
void scsi_req_data(SCSIRequest *req, int len); |
116 | 116 |
void scsi_req_complete(SCSIRequest *req); |
117 |
void scsi_req_abort(SCSIRequest *req, int status); |
|
117 | 118 |
void scsi_device_purge_requests(SCSIDevice *sdev); |
118 | 119 |
|
119 | 120 |
#endif |
b/hw/spapr_vscsi.c | ||
---|---|---|
463 | 463 |
dprintf("VSCSI: Queued request sense tag 0x%x\n", req->qtag); |
464 | 464 |
if (n < 0) { |
465 | 465 |
fprintf(stderr, "VSCSI: REQUEST_SENSE wants write data !?!?!?\n"); |
466 |
sdev->info->cancel_io(req->sreq); |
|
467 | 466 |
vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0); |
468 |
vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); |
|
469 |
vscsi_put_req(s, req); |
|
467 |
scsi_req_abort(req->sreq, CHECK_CONDITION); |
|
470 | 468 |
return; |
471 | 469 |
} else if (n == 0) { |
472 | 470 |
return; |
... | ... | |
547 | 545 |
} |
548 | 546 |
if (rc < 0) { |
549 | 547 |
fprintf(stderr, "VSCSI: RDMA error rc=%d!\n", rc); |
550 |
sdev->info->cancel_io(sreq); |
|
551 | 548 |
vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0); |
552 |
vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); |
|
553 |
vscsi_put_req(s, req); |
|
549 |
scsi_req_abort(req->sreq, CHECK_CONDITION); |
|
554 | 550 |
return; |
555 | 551 |
} |
556 | 552 |
|
Also available in: Unified diff