Revision f8b6d672
b/hw/scsi-generic.c | ||
---|---|---|
455 | 455 |
return (buf[9] << 16) | (buf[10] << 8) | buf[11]; |
456 | 456 |
} |
457 | 457 |
|
458 |
static void scsi_destroy(SCSIDevice *d)
|
|
458 |
static void scsi_generic_purge_requests(SCSIGenericState *s)
|
|
459 | 459 |
{ |
460 |
SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev, d); |
|
461 | 460 |
SCSIGenericReq *r; |
462 | 461 |
|
463 | 462 |
while (!QTAILQ_EMPTY(&s->qdev.requests)) { |
464 | 463 |
r = DO_UPCAST(SCSIGenericReq, req, QTAILQ_FIRST(&s->qdev.requests)); |
464 |
if (r->req.aiocb) { |
|
465 |
bdrv_aio_cancel(r->req.aiocb); |
|
466 |
} |
|
465 | 467 |
scsi_remove_request(r); |
466 | 468 |
} |
469 |
} |
|
470 |
|
|
471 |
static void scsi_generic_reset(DeviceState *dev) |
|
472 |
{ |
|
473 |
SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev.qdev, dev); |
|
474 |
|
|
475 |
scsi_generic_purge_requests(s); |
|
476 |
} |
|
477 |
|
|
478 |
static void scsi_destroy(SCSIDevice *d) |
|
479 |
{ |
|
480 |
SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev, d); |
|
481 |
|
|
482 |
scsi_generic_purge_requests(s); |
|
467 | 483 |
blockdev_mark_auto_del(s->qdev.conf.bs); |
468 | 484 |
} |
469 | 485 |
|
... | ... | |
537 | 553 |
.qdev.name = "scsi-generic", |
538 | 554 |
.qdev.desc = "pass through generic scsi device (/dev/sg*)", |
539 | 555 |
.qdev.size = sizeof(SCSIGenericState), |
556 |
.qdev.reset = scsi_generic_reset, |
|
540 | 557 |
.init = scsi_generic_initfn, |
541 | 558 |
.destroy = scsi_destroy, |
542 | 559 |
.send_command = scsi_send_command, |
Also available in: Unified diff