Revision ad2d30f7 hw/scsi-disk.c
b/hw/scsi-disk.c | ||
---|---|---|
98 | 98 |
return r; |
99 | 99 |
} |
100 | 100 |
|
101 |
static void scsi_remove_request(SCSIDiskReq *r)
|
|
101 |
static void scsi_free_request(SCSIRequest *req)
|
|
102 | 102 |
{ |
103 |
SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); |
|
104 |
|
|
103 | 105 |
qemu_vfree(r->iov.iov_base); |
104 |
scsi_req_free(&r->req); |
|
105 | 106 |
} |
106 | 107 |
|
107 | 108 |
static SCSIDiskReq *scsi_find_request(SCSIDiskState *s, uint32_t tag) |
... | ... | |
134 | 135 |
r->req.tag, status, sense); |
135 | 136 |
scsi_req_set_status(r, status, sense); |
136 | 137 |
scsi_req_complete(&r->req); |
137 |
scsi_remove_request(r); |
|
138 | 138 |
} |
139 | 139 |
|
140 | 140 |
/* Cancel a pending data transfer. */ |
... | ... | |
148 | 148 |
if (r->req.aiocb) |
149 | 149 |
bdrv_aio_cancel(r->req.aiocb); |
150 | 150 |
r->req.aiocb = NULL; |
151 |
scsi_remove_request(r);
|
|
151 |
scsi_req_dequeue(&r->req);
|
|
152 | 152 |
} |
153 | 153 |
} |
154 | 154 |
|
... | ... | |
1033 | 1033 |
uint8_t *buf, int lun) |
1034 | 1034 |
{ |
1035 | 1035 |
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d); |
1036 |
uint32_t len;
|
|
1036 |
int32_t len; |
|
1037 | 1037 |
int is_write; |
1038 | 1038 |
uint8_t command; |
1039 | 1039 |
uint8_t *outbuf; |
... | ... | |
1095 | 1095 |
case REZERO_UNIT: |
1096 | 1096 |
rc = scsi_disk_emulate_command(r, outbuf); |
1097 | 1097 |
if (rc < 0) { |
1098 |
scsi_req_unref(&r->req); |
|
1098 | 1099 |
return 0; |
1099 | 1100 |
} |
1100 | 1101 |
|
... | ... | |
1181 | 1182 |
DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]); |
1182 | 1183 |
fail: |
1183 | 1184 |
scsi_command_complete(r, CHECK_CONDITION, ILLEGAL_REQUEST); |
1185 |
scsi_req_unref(&r->req); |
|
1184 | 1186 |
return 0; |
1185 | 1187 |
illegal_lba: |
1186 | 1188 |
scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR); |
1189 |
scsi_req_unref(&r->req); |
|
1187 | 1190 |
return 0; |
1188 | 1191 |
} |
1189 | 1192 |
if (r->sector_count == 0 && r->iov.iov_len == 0) { |
... | ... | |
1191 | 1194 |
} |
1192 | 1195 |
len = r->sector_count * 512 + r->iov.iov_len; |
1193 | 1196 |
if (is_write) { |
1194 |
return -len;
|
|
1197 |
len = -len;
|
|
1195 | 1198 |
} else { |
1196 | 1199 |
if (!r->sector_count) |
1197 | 1200 |
r->sector_count = -1; |
1198 |
return len; |
|
1199 | 1201 |
} |
1202 |
scsi_req_unref(&r->req); |
|
1203 |
return len; |
|
1200 | 1204 |
} |
1201 | 1205 |
|
1202 | 1206 |
static void scsi_disk_purge_requests(SCSIDiskState *s) |
... | ... | |
1208 | 1212 |
if (r->req.aiocb) { |
1209 | 1213 |
bdrv_aio_cancel(r->req.aiocb); |
1210 | 1214 |
} |
1211 |
scsi_remove_request(r);
|
|
1215 |
scsi_req_dequeue(&r->req);
|
|
1212 | 1216 |
} |
1213 | 1217 |
} |
1214 | 1218 |
|
... | ... | |
1321 | 1325 |
.qdev.reset = scsi_disk_reset, |
1322 | 1326 |
.init = scsi_hd_initfn, |
1323 | 1327 |
.destroy = scsi_destroy, |
1328 |
.free_req = scsi_free_request, |
|
1324 | 1329 |
.send_command = scsi_send_command, |
1325 | 1330 |
.read_data = scsi_read_data, |
1326 | 1331 |
.write_data = scsi_write_data, |
... | ... | |
1339 | 1344 |
.qdev.reset = scsi_disk_reset, |
1340 | 1345 |
.init = scsi_cd_initfn, |
1341 | 1346 |
.destroy = scsi_destroy, |
1347 |
.free_req = scsi_free_request, |
|
1342 | 1348 |
.send_command = scsi_send_command, |
1343 | 1349 |
.read_data = scsi_read_data, |
1344 | 1350 |
.write_data = scsi_write_data, |
... | ... | |
1356 | 1362 |
.qdev.reset = scsi_disk_reset, |
1357 | 1363 |
.init = scsi_disk_initfn, |
1358 | 1364 |
.destroy = scsi_destroy, |
1365 |
.free_req = scsi_free_request, |
|
1359 | 1366 |
.send_command = scsi_send_command, |
1360 | 1367 |
.read_data = scsi_read_data, |
1361 | 1368 |
.write_data = scsi_write_data, |
Also available in: Unified diff