Revision 428c149b hw/scsi-generic.c
b/hw/scsi-generic.c | ||
---|---|---|
58 | 58 |
struct SCSIGenericState |
59 | 59 |
{ |
60 | 60 |
SCSIDevice qdev; |
61 |
BlockDriverState *bs; |
|
61 | 62 |
int lun; |
62 | 63 |
int driver_status; |
63 | 64 |
uint8_t sensebuf[SCSI_SENSE_BUF_SIZE]; |
... | ... | |
212 | 213 |
return; |
213 | 214 |
} |
214 | 215 |
|
215 |
ret = execute_command(s->qdev.dinfo->bdrv, r, SG_DXFER_FROM_DEV, scsi_read_complete);
|
|
216 |
ret = execute_command(s->bs, r, SG_DXFER_FROM_DEV, scsi_read_complete);
|
|
216 | 217 |
if (ret == -1) { |
217 | 218 |
scsi_command_complete(r, -EINVAL); |
218 | 219 |
return; |
... | ... | |
263 | 264 |
return 0; |
264 | 265 |
} |
265 | 266 |
|
266 |
ret = execute_command(s->qdev.dinfo->bdrv, r, SG_DXFER_TO_DEV, scsi_write_complete);
|
|
267 |
ret = execute_command(s->bs, r, SG_DXFER_TO_DEV, scsi_write_complete);
|
|
267 | 268 |
if (ret == -1) { |
268 | 269 |
scsi_command_complete(r, -EINVAL); |
269 | 270 |
return 1; |
... | ... | |
357 | 358 |
qemu_free(r->buf); |
358 | 359 |
r->buflen = 0; |
359 | 360 |
r->buf = NULL; |
360 |
ret = execute_command(s->qdev.dinfo->bdrv, r, SG_DXFER_NONE, scsi_command_complete);
|
|
361 |
ret = execute_command(s->bs, r, SG_DXFER_NONE, scsi_command_complete);
|
|
361 | 362 |
if (ret == -1) { |
362 | 363 |
scsi_command_complete(r, -EINVAL); |
363 | 364 |
return 0; |
... | ... | |
452 | 453 |
r = DO_UPCAST(SCSIGenericReq, req, QTAILQ_FIRST(&s->qdev.requests)); |
453 | 454 |
scsi_remove_request(r); |
454 | 455 |
} |
455 |
drive_uninit(s->qdev.dinfo); |
|
456 |
drive_uninit(s->qdev.conf.dinfo);
|
|
456 | 457 |
} |
457 | 458 |
|
458 | 459 |
static int scsi_generic_initfn(SCSIDevice *dev) |
... | ... | |
461 | 462 |
int sg_version; |
462 | 463 |
struct sg_scsi_id scsiid; |
463 | 464 |
|
464 |
if (!s->qdev.dinfo || !s->qdev.dinfo->bdrv) {
|
|
465 |
if (!s->qdev.conf.dinfo || !s->qdev.conf.dinfo->bdrv) {
|
|
465 | 466 |
qemu_error("scsi-generic: drive property not set\n"); |
466 | 467 |
return -1; |
467 | 468 |
} |
469 |
s->bs = s->qdev.conf.dinfo->bdrv; |
|
468 | 470 |
|
469 | 471 |
/* check we are really using a /dev/sg* file */ |
470 |
if (!bdrv_is_sg(s->qdev.dinfo->bdrv)) {
|
|
472 |
if (!bdrv_is_sg(s->bs)) {
|
|
471 | 473 |
qemu_error("scsi-generic: not /dev/sg*\n"); |
472 | 474 |
return -1; |
473 | 475 |
} |
474 | 476 |
|
475 | 477 |
/* check we are using a driver managing SG_IO (version 3 and after */ |
476 |
if (bdrv_ioctl(s->qdev.dinfo->bdrv, SG_GET_VERSION_NUM, &sg_version) < 0 ||
|
|
478 |
if (bdrv_ioctl(s->bs, SG_GET_VERSION_NUM, &sg_version) < 0 ||
|
|
477 | 479 |
sg_version < 30000) { |
478 | 480 |
qemu_error("scsi-generic: scsi generic interface too old\n"); |
479 | 481 |
return -1; |
480 | 482 |
} |
481 | 483 |
|
482 | 484 |
/* get LUN of the /dev/sg? */ |
483 |
if (bdrv_ioctl(s->qdev.dinfo->bdrv, SG_GET_SCSI_ID, &scsiid)) {
|
|
485 |
if (bdrv_ioctl(s->bs, SG_GET_SCSI_ID, &scsiid)) {
|
|
484 | 486 |
qemu_error("scsi-generic: SG_GET_SCSI_ID ioctl failed\n"); |
485 | 487 |
return -1; |
486 | 488 |
} |
... | ... | |
491 | 493 |
s->qdev.type = scsiid.scsi_type; |
492 | 494 |
DPRINTF("device type %d\n", s->qdev.type); |
493 | 495 |
if (s->qdev.type == TYPE_TAPE) { |
494 |
s->qdev.blocksize = get_stream_blocksize(s->qdev.dinfo->bdrv);
|
|
496 |
s->qdev.blocksize = get_stream_blocksize(s->bs);
|
|
495 | 497 |
if (s->qdev.blocksize == -1) |
496 | 498 |
s->qdev.blocksize = 0; |
497 | 499 |
} else { |
498 |
s->qdev.blocksize = get_blocksize(s->qdev.dinfo->bdrv);
|
|
500 |
s->qdev.blocksize = get_blocksize(s->bs);
|
|
499 | 501 |
/* removable media returns 0 if not present */ |
500 | 502 |
if (s->qdev.blocksize <= 0) { |
501 | 503 |
if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) |
... | ... | |
522 | 524 |
.cancel_io = scsi_cancel_io, |
523 | 525 |
.get_buf = scsi_get_buf, |
524 | 526 |
.qdev.props = (Property[]) { |
525 |
DEFINE_PROP_DRIVE("drive", SCSIGenericState, qdev.dinfo),
|
|
527 |
DEFINE_BLOCK_PROPERTIES(SCSIGenericState, qdev.conf),
|
|
526 | 528 |
DEFINE_PROP_END_OF_LIST(), |
527 | 529 |
}, |
528 | 530 |
}; |
Also available in: Unified diff