Revision e9447f35

b/hw/scsi-disk.c
1010 1010
    }
1011 1011
}
1012 1012

  
1013
static void scsi_destroy(SCSIDevice *dev)
1013
static void scsi_disk_purge_requests(SCSIDiskState *s)
1014 1014
{
1015
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1016 1015
    SCSIDiskReq *r;
1017 1016

  
1018 1017
    while (!QTAILQ_EMPTY(&s->qdev.requests)) {
1019 1018
        r = DO_UPCAST(SCSIDiskReq, req, QTAILQ_FIRST(&s->qdev.requests));
1019
        if (r->req.aiocb) {
1020
            bdrv_aio_cancel(r->req.aiocb);
1021
        }
1020 1022
        scsi_remove_request(r);
1021 1023
    }
1024
}
1025

  
1026
static void scsi_disk_reset(DeviceState *dev)
1027
{
1028
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1029
    uint64_t nb_sectors;
1030

  
1031
    scsi_disk_purge_requests(s);
1032

  
1033
    bdrv_get_geometry(s->bs, &nb_sectors);
1034
    nb_sectors /= s->cluster_size;
1035
    if (nb_sectors) {
1036
        nb_sectors--;
1037
    }
1038
    s->max_lba = nb_sectors;
1039
}
1040

  
1041
static void scsi_destroy(SCSIDevice *dev)
1042
{
1043
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1044

  
1045
    scsi_disk_purge_requests(s);
1022 1046
    drive_uninit(s->qdev.conf.dinfo);
1023 1047
}
1024 1048

  
1025 1049
static int scsi_disk_initfn(SCSIDevice *dev)
1026 1050
{
1027 1051
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1028
    uint64_t nb_sectors;
1029 1052

  
1030 1053
    if (!s->qdev.conf.dinfo || !s->qdev.conf.dinfo->bdrv) {
1031 1054
        error_report("scsi-disk: drive property not set");
......
1046 1069
    s->cluster_size = s->qdev.blocksize / 512;
1047 1070

  
1048 1071
    s->qdev.type = TYPE_DISK;
1049
    bdrv_get_geometry(s->bs, &nb_sectors);
1050
    nb_sectors /= s->cluster_size;
1051
    if (nb_sectors)
1052
        nb_sectors--;
1053
    s->max_lba = nb_sectors;
1054 1072
    qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
1055 1073
    return 0;
1056 1074
}
......
1059 1077
    .qdev.name    = "scsi-disk",
1060 1078
    .qdev.desc    = "virtual scsi disk or cdrom",
1061 1079
    .qdev.size    = sizeof(SCSIDiskState),
1080
    .qdev.reset   = scsi_disk_reset,
1062 1081
    .init         = scsi_disk_initfn,
1063 1082
    .destroy      = scsi_destroy,
1064 1083
    .send_command = scsi_send_command,

Also available in: Unified diff