Revision f8b6cc00

b/block_int.h
210 210
int is_windows_drive(const char *filename);
211 211
#endif
212 212

  
213
struct DriveInfo;
214

  
215 213
typedef struct BlockConf {
216
    struct DriveInfo *dinfo;
214
    BlockDriverState *bs;
217 215
    uint16_t physical_block_size;
218 216
    uint16_t logical_block_size;
219 217
    uint16_t min_io_size;
......
234 232
}
235 233

  
236 234
#define DEFINE_BLOCK_PROPERTIES(_state, _conf)                          \
237
    DEFINE_PROP_DRIVE("drive", _state, _conf.dinfo),                    \
235
    DEFINE_PROP_DRIVE("drive", _state, _conf.bs),                       \
238 236
    DEFINE_PROP_UINT16("logical_block_size", _state,                    \
239 237
                       _conf.logical_block_size, 512),                  \
240 238
    DEFINE_PROP_UINT16("physical_block_size", _state,                   \
b/hw/fdc.c
80 80
} FDiskFlags;
81 81

  
82 82
typedef struct FDrive {
83
    DriveInfo *dinfo;
84 83
    BlockDriverState *bs;
85 84
    /* Drive status */
86 85
    FDriveType drive;
......
100 99
static void fd_init(FDrive *drv)
101 100
{
102 101
    /* Drive */
103
    drv->bs = drv->dinfo ? drv->dinfo->bdrv : NULL;
104 102
    drv->drive = FDRIVE_DRV_NONE;
105 103
    drv->perpendicular = 0;
106 104
    /* Disk */
......
1862 1860

  
1863 1861
    dev = isa_create("isa-fdc");
1864 1862
    if (fds[0]) {
1865
        qdev_prop_set_drive(&dev->qdev, "driveA", fds[0]);
1863
        qdev_prop_set_drive(&dev->qdev, "driveA", fds[0]->bdrv);
1866 1864
    }
1867 1865
    if (fds[1]) {
1868
        qdev_prop_set_drive(&dev->qdev, "driveB", fds[1]);
1866
        qdev_prop_set_drive(&dev->qdev, "driveB", fds[1]->bdrv);
1869 1867
    }
1870 1868
    if (qdev_init(&dev->qdev) < 0)
1871 1869
        return NULL;
......
1884 1882
    fdctrl = &sys->state;
1885 1883
    fdctrl->dma_chann = dma_chann; /* FIXME */
1886 1884
    if (fds[0]) {
1887
        qdev_prop_set_drive(dev, "driveA", fds[0]);
1885
        qdev_prop_set_drive(dev, "driveA", fds[0]->bdrv);
1888 1886
    }
1889 1887
    if (fds[1]) {
1890
        qdev_prop_set_drive(dev, "driveB", fds[1]);
1888
        qdev_prop_set_drive(dev, "driveB", fds[1]->bdrv);
1891 1889
    }
1892 1890
    qdev_init_nofail(dev);
1893 1891
    sysbus_connect_irq(&sys->busdev, 0, irq);
......
1905 1903

  
1906 1904
    dev = qdev_create(NULL, "SUNW,fdtwo");
1907 1905
    if (fds[0]) {
1908
        qdev_prop_set_drive(dev, "drive", fds[0]);
1906
        qdev_prop_set_drive(dev, "drive", fds[0]->bdrv);
1909 1907
    }
1910 1908
    qdev_init_nofail(dev);
1911 1909
    sys = DO_UPCAST(FDCtrlSysBus, busdev.qdev, dev);
......
2030 2028
    .qdev.vmsd  = &vmstate_isa_fdc,
2031 2029
    .qdev.reset = fdctrl_external_reset_isa,
2032 2030
    .qdev.props = (Property[]) {
2033
        DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].dinfo),
2034
        DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].dinfo),
2031
        DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].bs),
2032
        DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].bs),
2035 2033
        DEFINE_PROP_END_OF_LIST(),
2036 2034
    },
2037 2035
};
......
2053 2051
    .qdev.vmsd  = &vmstate_sysbus_fdc,
2054 2052
    .qdev.reset = fdctrl_external_reset_sysbus,
2055 2053
    .qdev.props = (Property[]) {
2056
        DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].dinfo),
2057
        DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].dinfo),
2054
        DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].bs),
2055
        DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].bs),
2058 2056
        DEFINE_PROP_END_OF_LIST(),
2059 2057
    },
2060 2058
};
......
2066 2064
    .qdev.vmsd  = &vmstate_sysbus_fdc,
2067 2065
    .qdev.reset = fdctrl_external_reset_sysbus,
2068 2066
    .qdev.props = (Property[]) {
2069
        DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].dinfo),
2067
        DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].bs),
2070 2068
        DEFINE_PROP_END_OF_LIST(),
2071 2069
    },
2072 2070
};
b/hw/ide/core.c
2594 2594
    ide_clear_hob(bus);
2595 2595
}
2596 2596

  
2597
void ide_init_drive(IDEState *s, DriveInfo *dinfo,
2597
void ide_init_drive(IDEState *s, BlockDriverState *bs,
2598 2598
                    const char *version, const char *serial)
2599 2599
{
2600 2600
    int cylinders, heads, secs;
2601 2601
    uint64_t nb_sectors;
2602 2602

  
2603
    s->bs = dinfo->bdrv;
2604
    bdrv_get_geometry(s->bs, &nb_sectors);
2605
    bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
2603
    s->bs = bs;
2604
    bdrv_get_geometry(bs, &nb_sectors);
2605
    bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
2606 2606
    s->cylinders = cylinders;
2607 2607
    s->heads = heads;
2608 2608
    s->sectors = secs;
......
2613 2613
    s->smart_autosave = 1;
2614 2614
    s->smart_errors = 0;
2615 2615
    s->smart_selftest_count = 0;
2616
    if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
2616
    if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
2617 2617
        s->is_cdrom = 1;
2618
        bdrv_set_change_cb(s->bs, cdrom_change_cb, s);
2618
        bdrv_set_change_cb(bs, cdrom_change_cb, s);
2619 2619
    }
2620
    if (serial && *serial) {
2620
    if (serial) {
2621 2621
        strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
2622 2622
    } else {
2623 2623
        snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
......
2668 2668
        dinfo = i == 0 ? hd0 : hd1;
2669 2669
        ide_init1(bus, i);
2670 2670
        if (dinfo) {
2671
            ide_init_drive(&bus->ifs[i], dinfo, NULL, dinfo->serial);
2671
            ide_init_drive(&bus->ifs[i], dinfo->bdrv, NULL,
2672
                           *dinfo->serial ? dinfo->serial : NULL);
2672 2673
        } else {
2673 2674
            ide_reset(&bus->ifs[i]);
2674 2675
        }
b/hw/ide/internal.h
555 555
void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
556 556
uint32_t ide_data_readl(void *opaque, uint32_t addr);
557 557

  
558
void ide_init_drive(IDEState *s, DriveInfo *dinfo,
558
void ide_init_drive(IDEState *s, BlockDriverState *bs,
559 559
                    const char *version, const char *serial);
560 560
void ide_init2(IDEBus *bus, qemu_irq irq);
561 561
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
b/hw/ide/qdev.c
39 39
    IDEDeviceInfo *info = DO_UPCAST(IDEDeviceInfo, qdev, base);
40 40
    IDEBus *bus = DO_UPCAST(IDEBus, qbus, qdev->parent_bus);
41 41

  
42
    if (!dev->conf.dinfo) {
42
    if (!dev->conf.bs) {
43 43
        fprintf(stderr, "%s: no drive specified\n", qdev->info->name);
44 44
        goto err;
45 45
    }
......
83 83

  
84 84
    dev = qdev_create(&bus->qbus, "ide-drive");
85 85
    qdev_prop_set_uint32(dev, "unit", unit);
86
    qdev_prop_set_drive(dev, "drive", drive);
86
    qdev_prop_set_drive(dev, "drive", drive->bdrv);
87 87
    qdev_init_nofail(dev);
88 88
    return DO_UPCAST(IDEDevice, qdev, dev);
89 89
}
......
99 99
    IDEBus *bus = DO_UPCAST(IDEBus, qbus, dev->qdev.parent_bus);
100 100
    IDEState *s = bus->ifs + dev->unit;
101 101
    const char *serial;
102
    DriveInfo *dinfo;
102 103

  
103 104
    serial = dev->serial;
104 105
    if (!serial) {
105 106
        /* try to fall back to value set with legacy -drive serial=... */
106
        serial = dev->conf.dinfo->serial;
107
        dinfo = drive_get_by_blockdev(dev->conf.bs);
108
        if (*dinfo->serial) {
109
            serial = dinfo->serial;
110
        }
107 111
    }
108 112

  
109
    ide_init_drive(s, dev->conf.dinfo, dev->version, serial);
113
    ide_init_drive(s, dev->conf.bs, dev->version, serial);
110 114

  
111 115
    if (!dev->version) {
112 116
        dev->version = qemu_strdup(s->version);
b/hw/pci-hotplug.c
89 89
     * specified).
90 90
     */
91 91
    dinfo->unit = qemu_opt_get_number(dinfo->opts, "unit", -1);
92
    scsidev = scsi_bus_legacy_add_drive(scsibus, dinfo, dinfo->unit);
92
    scsidev = scsi_bus_legacy_add_drive(scsibus, dinfo->bdrv, dinfo->unit);
93 93
    if (!scsidev) {
94 94
        return -1;
95 95
    }
......
214 214
            return NULL;
215 215
        }
216 216
        dev = pci_create(bus, devfn, "virtio-blk-pci");
217
        qdev_prop_set_drive(&dev->qdev, "drive", dinfo);
217
        qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv);
218 218
        if (qdev_init(&dev->qdev) < 0)
219 219
            dev = NULL;
220 220
        break;
b/hw/qdev-properties.c
305 305

  
306 306
static int parse_drive(DeviceState *dev, Property *prop, const char *str)
307 307
{
308
    DriveInfo **ptr = qdev_get_prop_ptr(dev, prop);
308
    BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
309
    BlockDriverState *bs;
309 310

  
310
    *ptr = drive_get_by_id(str);
311
    if (*ptr == NULL)
311
    bs = bdrv_find(str);
312
    if (bs == NULL)
312 313
        return -ENOENT;
314
    *ptr = bs;
313 315
    return 0;
314 316
}
315 317

  
316 318
static void free_drive(DeviceState *dev, Property *prop)
317 319
{
318
    DriveInfo **ptr = qdev_get_prop_ptr(dev, prop);
320
    BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
319 321

  
320 322
    if (*ptr) {
321
        blockdev_auto_del((*ptr)->bdrv);
323
        blockdev_auto_del(*ptr);
322 324
    }
323 325
}
324 326

  
325 327
static int print_drive(DeviceState *dev, Property *prop, char *dest, size_t len)
326 328
{
327
    DriveInfo **ptr = qdev_get_prop_ptr(dev, prop);
328
    return snprintf(dest, len, "%s", (*ptr) ? (*ptr)->id : "<null>");
329
    BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
330
    return snprintf(dest, len, "%s",
331
                    *ptr ? bdrv_get_device_name(*ptr) : "<null>");
329 332
}
330 333

  
331 334
PropertyInfo qdev_prop_drive = {
332 335
    .name  = "drive",
333 336
    .type  = PROP_TYPE_DRIVE,
334
    .size  = sizeof(DriveInfo*),
337
    .size  = sizeof(BlockDriverState *),
335 338
    .parse = parse_drive,
336 339
    .print = print_drive,
337 340
    .free  = free_drive,
......
657 660
    qdev_prop_set(dev, name, &value, PROP_TYPE_STRING);
658 661
}
659 662

  
660
void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value)
663
void qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value)
661 664
{
662 665
    qdev_prop_set(dev, name, &value, PROP_TYPE_DRIVE);
663 666
}
b/hw/qdev.h
253 253
    DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, VLANClientState*)
254 254
#define DEFINE_PROP_VLAN(_n, _s, _f)             \
255 255
    DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, VLANState*)
256
#define DEFINE_PROP_DRIVE(_n, _s, _f)             \
257
    DEFINE_PROP(_n, _s, _f, qdev_prop_drive, DriveInfo*)
256
#define DEFINE_PROP_DRIVE(_n, _s, _f) \
257
    DEFINE_PROP(_n, _s, _f, qdev_prop_drive, BlockDriverState *)
258 258
#define DEFINE_PROP_MACADDR(_n, _s, _f)         \
259 259
    DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
260 260

  
......
275 275
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value);
276 276
void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value);
277 277
void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value);
278
void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value);
278
void qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value);
279 279
void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value);
280 280
/* FIXME: Remove opaque pointer properties.  */
281 281
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
b/hw/s390-virtio.c
262 262
        }
263 263

  
264 264
        dev = qdev_create((BusState *)s390_bus, "virtio-blk-s390");
265
        qdev_prop_set_drive(dev, "drive", dinfo);
265
        qdev_prop_set_drive(dev, "drive", dinfo->bdrv);
266 266
        qdev_init_nofail(dev);
267 267
    }
268 268
}
b/hw/scsi-bus.c
83 83
}
84 84

  
85 85
/* handle legacy '-drive if=scsi,...' cmd line args */
86
SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, DriveInfo *dinfo, int unit)
86
SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv, int unit)
87 87
{
88 88
    const char *driver;
89 89
    DeviceState *dev;
90 90

  
91
    driver = bdrv_is_sg(dinfo->bdrv) ? "scsi-generic" : "scsi-disk";
91
    driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
92 92
    dev = qdev_create(&bus->qbus, driver);
93 93
    qdev_prop_set_uint32(dev, "scsi-id", unit);
94
    qdev_prop_set_drive(dev, "drive", dinfo);
94
    qdev_prop_set_drive(dev, "drive", bdrv);
95 95
    if (qdev_init(dev) < 0)
96 96
        return NULL;
97 97
    return DO_UPCAST(SCSIDevice, qdev, dev);
......
107 107
        if (dinfo == NULL) {
108 108
            continue;
109 109
        }
110
        if (!scsi_bus_legacy_add_drive(bus, dinfo, unit)) {
110
        if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit)) {
111 111
            res = -1;
112 112
            break;
113 113
        }
b/hw/scsi-disk.c
1043 1043
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1044 1044

  
1045 1045
    scsi_disk_purge_requests(s);
1046
    blockdev_mark_auto_del(s->qdev.conf.dinfo->bdrv);
1046
    blockdev_mark_auto_del(s->qdev.conf.bs);
1047 1047
}
1048 1048

  
1049 1049
static int scsi_disk_initfn(SCSIDevice *dev)
1050 1050
{
1051 1051
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1052
    DriveInfo *dinfo;
1052 1053

  
1053
    if (!s->qdev.conf.dinfo || !s->qdev.conf.dinfo->bdrv) {
1054
    if (!s->qdev.conf.bs) {
1054 1055
        error_report("scsi-disk: drive property not set");
1055 1056
        return -1;
1056 1057
    }
1057
    s->bs = s->qdev.conf.dinfo->bdrv;
1058
    s->bs = s->qdev.conf.bs;
1058 1059

  
1059 1060
    if (!s->serial) {
1060
        if (*dev->conf.dinfo->serial) {
1061
            /* try to fall back to value set with legacy -drive serial=... */
1062
            s->serial = qemu_strdup(dev->conf.dinfo->serial);
1063
        } else {
1064
            s->serial = qemu_strdup("0");
1065
        }
1061
        /* try to fall back to value set with legacy -drive serial=... */
1062
        dinfo = drive_get_by_blockdev(s->bs);
1063
        s->serial = qemu_strdup(*dinfo->serial ? dinfo->serial : "0");
1066 1064
    }
1067 1065

  
1068 1066
    if (!s->version) {
b/hw/scsi-generic.c
453 453
        r = DO_UPCAST(SCSIGenericReq, req, QTAILQ_FIRST(&s->qdev.requests));
454 454
        scsi_remove_request(r);
455 455
    }
456
    blockdev_mark_auto_del(s->qdev.conf.dinfo->bdrv);
456
    blockdev_mark_auto_del(s->qdev.conf.bs);
457 457
}
458 458

  
459 459
static int scsi_generic_initfn(SCSIDevice *dev)
......
462 462
    int sg_version;
463 463
    struct sg_scsi_id scsiid;
464 464

  
465
    if (!s->qdev.conf.dinfo || !s->qdev.conf.dinfo->bdrv) {
465
    if (!s->qdev.conf.bs) {
466 466
        error_report("scsi-generic: drive property not set");
467 467
        return -1;
468 468
    }
469
    s->bs = s->qdev.conf.dinfo->bdrv;
469
    s->bs = s->qdev.conf.bs;
470 470

  
471 471
    /* check we are really using a /dev/sg* file */
472 472
    if (!bdrv_is_sg(s->bs)) {
b/hw/scsi.h
97 97
    return DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus);
98 98
}
99 99

  
100
SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, DriveInfo *dinfo, int unit);
100
SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv, int unit);
101 101
int scsi_bus_legacy_handle_cmdline(SCSIBus *bus);
102 102

  
103 103
void scsi_dev_clear_sense(SCSIDevice *dev);
b/hw/usb-msd.c
522 522
static int usb_msd_initfn(USBDevice *dev)
523 523
{
524 524
    MSDState *s = DO_UPCAST(MSDState, dev, dev);
525
    DriveInfo *dinfo = s->conf.dinfo;
525
    BlockDriverState *bs = s->conf.bs;
526 526

  
527
    if (!dinfo || !dinfo->bdrv) {
527
    if (!bs) {
528 528
        error_report("usb-msd: drive property not set");
529 529
        return -1;
530 530
    }
......
538 538
     *
539 539
     * The hack is probably a bad idea.
540 540
     */
541
    s->conf.dinfo = NULL;
541
    s->conf.bs = NULL;
542 542

  
543 543
    s->dev.speed = USB_SPEED_FULL;
544 544
    scsi_bus_new(&s->bus, &s->dev.qdev, 0, 1, usb_msd_command_complete);
545
    s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, dinfo, 0);
545
    s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0);
546 546
    if (!s->scsi_dev) {
547 547
        return -1;
548 548
    }
549 549
    s->bus.qbus.allow_hotplug = 0;
550 550
    usb_msd_handle_reset(dev);
551 551

  
552
    if (bdrv_key_required(dinfo->bdrv)) {
552
    if (bdrv_key_required(bs)) {
553 553
        if (cur_mon) {
554
            monitor_read_bdrv_key_start(cur_mon, dinfo->bdrv,
555
                                        usb_msd_password_cb, s);
554
            monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb, s);
556 555
            s->dev.auto_attach = 0;
557 556
        } else {
558 557
            autostart = 0;
......
610 609
    if (!dev) {
611 610
        return NULL;
612 611
    }
613
    qdev_prop_set_drive(&dev->qdev, "drive", dinfo);
612
    qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv);
614 613
    if (qdev_init(&dev->qdev) < 0)
615 614
        return NULL;
616 615

  
b/hw/virtio-blk.c
489 489
    s->vdev.get_config = virtio_blk_update_config;
490 490
    s->vdev.get_features = virtio_blk_get_features;
491 491
    s->vdev.reset = virtio_blk_reset;
492
    s->bs = conf->dinfo->bdrv;
492
    s->bs = conf->bs;
493 493
    s->conf = conf;
494 494
    s->rq = NULL;
495 495
    s->sector_mask = (s->conf->logical_block_size / BDRV_SECTOR_SIZE) - 1;
b/hw/virtio-pci.c
547 547
        proxy->class_code != PCI_CLASS_STORAGE_OTHER)
548 548
        proxy->class_code = PCI_CLASS_STORAGE_SCSI;
549 549

  
550
    if (!proxy->block.dinfo) {
550
    if (!proxy->block.bs) {
551 551
        error_report("virtio-blk-pci: drive property not set");
552 552
        return -1;
553 553
    }
......
571 571
{
572 572
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
573 573

  
574
    blockdev_mark_auto_del(proxy->block.dinfo->bdrv);
574
    blockdev_mark_auto_del(proxy->block.bs);
575 575
    return virtio_exit_pci(pci_dev);
576 576
}
577 577

  

Also available in: Unified diff