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