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