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