Revision ad2d30f7 hw/scsi-generic.c
b/hw/scsi-generic.c | ||
---|---|---|
74 | 74 |
return DO_UPCAST(SCSIGenericReq, req, req); |
75 | 75 |
} |
76 | 76 |
|
77 |
static void scsi_remove_request(SCSIGenericReq *r)
|
|
77 |
static void scsi_free_request(SCSIRequest *req)
|
|
78 | 78 |
{ |
79 |
SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); |
|
80 |
|
|
79 | 81 |
qemu_free(r->buf); |
80 |
scsi_req_free(&r->req); |
|
81 | 82 |
} |
82 | 83 |
|
83 | 84 |
static SCSIGenericReq *scsi_find_request(SCSIGenericState *s, uint32_t tag) |
... | ... | |
113 | 114 |
r, r->req.tag, r->req.status); |
114 | 115 |
|
115 | 116 |
scsi_req_complete(&r->req); |
116 |
scsi_remove_request(r); |
|
117 | 117 |
} |
118 | 118 |
|
119 | 119 |
/* Cancel a pending data transfer. */ |
... | ... | |
128 | 128 |
if (r->req.aiocb) |
129 | 129 |
bdrv_aio_cancel(r->req.aiocb); |
130 | 130 |
r->req.aiocb = NULL; |
131 |
scsi_remove_request(r);
|
|
131 |
scsi_req_dequeue(&r->req);
|
|
132 | 132 |
} |
133 | 133 |
} |
134 | 134 |
|
... | ... | |
323 | 323 |
SCSIGenericReq *r; |
324 | 324 |
SCSIBus *bus; |
325 | 325 |
int ret; |
326 |
int32_t len; |
|
326 | 327 |
|
327 | 328 |
if (cmd[0] != REQUEST_SENSE && |
328 | 329 |
(lun != s->lun || (cmd[1] >> 5) != s->lun)) { |
... | ... | |
351 | 352 |
|
352 | 353 |
if (-1 == scsi_req_parse(&r->req, cmd)) { |
353 | 354 |
BADF("Unsupported command length, command %x\n", cmd[0]); |
354 |
scsi_remove_request(r); |
|
355 |
scsi_req_dequeue(&r->req); |
|
356 |
scsi_req_unref(&r->req); |
|
355 | 357 |
return 0; |
356 | 358 |
} |
357 | 359 |
scsi_req_fixup(&r->req); |
... | ... | |
377 | 379 |
ret = execute_command(s->bs, r, SG_DXFER_NONE, scsi_command_complete); |
378 | 380 |
if (ret == -1) { |
379 | 381 |
scsi_command_complete(r, -EINVAL); |
382 |
scsi_req_unref(&r->req); |
|
380 | 383 |
return 0; |
381 | 384 |
} |
385 |
scsi_req_unref(&r->req); |
|
382 | 386 |
return 0; |
383 | 387 |
} |
384 | 388 |
|
... | ... | |
393 | 397 |
r->len = r->req.cmd.xfer; |
394 | 398 |
if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { |
395 | 399 |
r->len = 0; |
396 |
return -r->req.cmd.xfer; |
|
400 |
len = -r->req.cmd.xfer; |
|
401 |
} else { |
|
402 |
len = r->req.cmd.xfer; |
|
397 | 403 |
} |
398 | 404 |
|
399 |
return r->req.cmd.xfer; |
|
405 |
scsi_req_unref(&r->req); |
|
406 |
return len; |
|
400 | 407 |
} |
401 | 408 |
|
402 | 409 |
static int get_blocksize(BlockDriverState *bdrv) |
... | ... | |
469 | 476 |
if (r->req.aiocb) { |
470 | 477 |
bdrv_aio_cancel(r->req.aiocb); |
471 | 478 |
} |
472 |
scsi_remove_request(r);
|
|
479 |
scsi_req_dequeue(&r->req);
|
|
473 | 480 |
} |
474 | 481 |
} |
475 | 482 |
|
... | ... | |
561 | 568 |
.qdev.reset = scsi_generic_reset, |
562 | 569 |
.init = scsi_generic_initfn, |
563 | 570 |
.destroy = scsi_destroy, |
571 |
.free_req = scsi_free_request, |
|
564 | 572 |
.send_command = scsi_send_command, |
565 | 573 |
.read_data = scsi_read_data, |
566 | 574 |
.write_data = scsi_write_data, |
Also available in: Unified diff