Revision c557e889
b/hw/scsi-bus.c | ||
---|---|---|
549 | 549 |
scsi_req_unref(req); |
550 | 550 |
} |
551 | 551 |
|
552 |
void scsi_device_purge_requests(SCSIDevice *sdev) |
|
553 |
{ |
|
554 |
SCSIRequest *req; |
|
555 |
|
|
556 |
while (!QTAILQ_EMPTY(&sdev->requests)) { |
|
557 |
req = QTAILQ_FIRST(&sdev->requests); |
|
558 |
sdev->info->cancel_io(req); |
|
559 |
scsi_req_dequeue(req); |
|
560 |
scsi_req_unref(req); |
|
561 |
} |
|
562 |
} |
|
563 |
|
|
552 | 564 |
static char *scsibus_get_fw_dev_path(DeviceState *dev) |
553 | 565 |
{ |
554 | 566 |
SCSIDevice *d = (SCSIDevice*)dev; |
b/hw/scsi-disk.c | ||
---|---|---|
1147 | 1147 |
return len; |
1148 | 1148 |
} |
1149 | 1149 |
|
1150 |
static void scsi_disk_purge_requests(SCSIDiskState *s) |
|
1151 |
{ |
|
1152 |
SCSIDiskReq *r; |
|
1153 |
|
|
1154 |
while (!QTAILQ_EMPTY(&s->qdev.requests)) { |
|
1155 |
r = DO_UPCAST(SCSIDiskReq, req, QTAILQ_FIRST(&s->qdev.requests)); |
|
1156 |
if (r->req.aiocb) { |
|
1157 |
bdrv_aio_cancel(r->req.aiocb); |
|
1158 |
} |
|
1159 |
scsi_req_dequeue(&r->req); |
|
1160 |
scsi_req_unref(&r->req); |
|
1161 |
} |
|
1162 |
} |
|
1163 |
|
|
1164 | 1150 |
static void scsi_disk_reset(DeviceState *dev) |
1165 | 1151 |
{ |
1166 | 1152 |
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev); |
1167 | 1153 |
uint64_t nb_sectors; |
1168 | 1154 |
|
1169 |
scsi_disk_purge_requests(s);
|
|
1155 |
scsi_device_purge_requests(&s->qdev);
|
|
1170 | 1156 |
|
1171 | 1157 |
bdrv_get_geometry(s->bs, &nb_sectors); |
1172 | 1158 |
nb_sectors /= s->cluster_size; |
... | ... | |
1180 | 1166 |
{ |
1181 | 1167 |
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); |
1182 | 1168 |
|
1183 |
scsi_disk_purge_requests(s);
|
|
1169 |
scsi_device_purge_requests(&s->qdev);
|
|
1184 | 1170 |
blockdev_mark_auto_del(s->qdev.conf.bs); |
1185 | 1171 |
} |
1186 | 1172 |
|
b/hw/scsi-generic.c | ||
---|---|---|
424 | 424 |
return (buf[9] << 16) | (buf[10] << 8) | buf[11]; |
425 | 425 |
} |
426 | 426 |
|
427 |
static void scsi_generic_purge_requests(SCSIGenericState *s) |
|
428 |
{ |
|
429 |
SCSIGenericReq *r; |
|
430 |
|
|
431 |
while (!QTAILQ_EMPTY(&s->qdev.requests)) { |
|
432 |
r = DO_UPCAST(SCSIGenericReq, req, QTAILQ_FIRST(&s->qdev.requests)); |
|
433 |
if (r->req.aiocb) { |
|
434 |
bdrv_aio_cancel(r->req.aiocb); |
|
435 |
} |
|
436 |
scsi_req_dequeue(&r->req); |
|
437 |
scsi_req_unref(&r->req); |
|
438 |
} |
|
439 |
} |
|
440 |
|
|
441 | 427 |
static void scsi_generic_reset(DeviceState *dev) |
442 | 428 |
{ |
443 | 429 |
SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev.qdev, dev); |
444 | 430 |
|
445 |
scsi_generic_purge_requests(s);
|
|
431 |
scsi_device_purge_requests(&s->qdev);
|
|
446 | 432 |
} |
447 | 433 |
|
448 | 434 |
static void scsi_destroy(SCSIDevice *d) |
449 | 435 |
{ |
450 | 436 |
SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev, d); |
451 | 437 |
|
452 |
scsi_generic_purge_requests(s);
|
|
438 |
scsi_device_purge_requests(&s->qdev);
|
|
453 | 439 |
blockdev_mark_auto_del(s->qdev.conf.bs); |
454 | 440 |
} |
455 | 441 |
|
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_device_purge_requests(SCSIDevice *sdev); |
|
117 | 118 |
|
118 | 119 |
#endif |
Also available in: Unified diff