Commit f8b6cc00 authored by Markus Armbruster's avatar Markus Armbruster Committed by Kevin Wolf
Browse files

qdev: Decouple qdev_prop_drive from DriveInfo



Make the property point to BlockDriverState, cutting out the DriveInfo
middleman.  This prepares the ground for block devices that don't have
a DriveInfo.

Currently all user-defined ones have a DriveInfo, because the only way
to define one is -drive & friends (they go through drive_init()).
DriveInfo is closely tied to -drive, and like -drive, it mixes
information about host and guest part of the block device.  I'm
working towards a new way to define block devices, with clean
host/guest separation, and I need to get DriveInfo out of the way for
that.

Fortunately, the device models are perfectly happy with
BlockDriverState, except for two places: ide_drive_initfn() and
scsi_disk_initfn() need to check the DriveInfo for a serial number set
with legacy -drive serial=...  Use drive_get_by_blockdev() there.

Device model code should now use DriveInfo only when explicitly
dealing with drives defined the old way, i.e. without -device.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 14bafc54
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -210,10 +210,8 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size);
int is_windows_drive(const char *filename);
#endif

struct DriveInfo;

typedef struct BlockConf {
    struct DriveInfo *dinfo;
    BlockDriverState *bs;
    uint16_t physical_block_size;
    uint16_t logical_block_size;
    uint16_t min_io_size;
@@ -234,7 +232,7 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
}

#define DEFINE_BLOCK_PROPERTIES(_state, _conf)                          \
    DEFINE_PROP_DRIVE("drive", _state, _conf.dinfo),                    \
    DEFINE_PROP_DRIVE("drive", _state, _conf.bs),                       \
    DEFINE_PROP_UINT16("logical_block_size", _state,                    \
                       _conf.logical_block_size, 512),                  \
    DEFINE_PROP_UINT16("physical_block_size", _state,                   \
+10 −12
Original line number Diff line number Diff line
@@ -80,7 +80,6 @@ typedef enum FDiskFlags {
} FDiskFlags;

typedef struct FDrive {
    DriveInfo *dinfo;
    BlockDriverState *bs;
    /* Drive status */
    FDriveType drive;
@@ -100,7 +99,6 @@ typedef struct FDrive {
static void fd_init(FDrive *drv)
{
    /* Drive */
    drv->bs = drv->dinfo ? drv->dinfo->bdrv : NULL;
    drv->drive = FDRIVE_DRV_NONE;
    drv->perpendicular = 0;
    /* Disk */
@@ -1862,10 +1860,10 @@ FDCtrl *fdctrl_init_isa(DriveInfo **fds)

    dev = isa_create("isa-fdc");
    if (fds[0]) {
        qdev_prop_set_drive(&dev->qdev, "driveA", fds[0]);
        qdev_prop_set_drive(&dev->qdev, "driveA", fds[0]->bdrv);
    }
    if (fds[1]) {
        qdev_prop_set_drive(&dev->qdev, "driveB", fds[1]);
        qdev_prop_set_drive(&dev->qdev, "driveB", fds[1]->bdrv);
    }
    if (qdev_init(&dev->qdev) < 0)
        return NULL;
@@ -1884,10 +1882,10 @@ FDCtrl *fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
    fdctrl = &sys->state;
    fdctrl->dma_chann = dma_chann; /* FIXME */
    if (fds[0]) {
        qdev_prop_set_drive(dev, "driveA", fds[0]);
        qdev_prop_set_drive(dev, "driveA", fds[0]->bdrv);
    }
    if (fds[1]) {
        qdev_prop_set_drive(dev, "driveB", fds[1]);
        qdev_prop_set_drive(dev, "driveB", fds[1]->bdrv);
    }
    qdev_init_nofail(dev);
    sysbus_connect_irq(&sys->busdev, 0, irq);
@@ -1905,7 +1903,7 @@ FDCtrl *sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base,

    dev = qdev_create(NULL, "SUNW,fdtwo");
    if (fds[0]) {
        qdev_prop_set_drive(dev, "drive", fds[0]);
        qdev_prop_set_drive(dev, "drive", fds[0]->bdrv);
    }
    qdev_init_nofail(dev);
    sys = DO_UPCAST(FDCtrlSysBus, busdev.qdev, dev);
@@ -2030,8 +2028,8 @@ static ISADeviceInfo isa_fdc_info = {
    .qdev.vmsd  = &vmstate_isa_fdc,
    .qdev.reset = fdctrl_external_reset_isa,
    .qdev.props = (Property[]) {
        DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].dinfo),
        DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].dinfo),
        DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].bs),
        DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].bs),
        DEFINE_PROP_END_OF_LIST(),
    },
};
@@ -2053,8 +2051,8 @@ static SysBusDeviceInfo sysbus_fdc_info = {
    .qdev.vmsd  = &vmstate_sysbus_fdc,
    .qdev.reset = fdctrl_external_reset_sysbus,
    .qdev.props = (Property[]) {
        DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].dinfo),
        DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].dinfo),
        DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].bs),
        DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].bs),
        DEFINE_PROP_END_OF_LIST(),
    },
};
@@ -2066,7 +2064,7 @@ static SysBusDeviceInfo sun4m_fdc_info = {
    .qdev.vmsd  = &vmstate_sysbus_fdc,
    .qdev.reset = fdctrl_external_reset_sysbus,
    .qdev.props = (Property[]) {
        DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].dinfo),
        DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].bs),
        DEFINE_PROP_END_OF_LIST(),
    },
};
+9 −8
Original line number Diff line number Diff line
@@ -2594,15 +2594,15 @@ void ide_bus_reset(IDEBus *bus)
    ide_clear_hob(bus);
}

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

    s->bs = dinfo->bdrv;
    bdrv_get_geometry(s->bs, &nb_sectors);
    bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
    s->bs = bs;
    bdrv_get_geometry(bs, &nb_sectors);
    bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
    s->cylinders = cylinders;
    s->heads = heads;
    s->sectors = secs;
@@ -2613,11 +2613,11 @@ void ide_init_drive(IDEState *s, DriveInfo *dinfo,
    s->smart_autosave = 1;
    s->smart_errors = 0;
    s->smart_selftest_count = 0;
    if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
    if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
        s->is_cdrom = 1;
        bdrv_set_change_cb(s->bs, cdrom_change_cb, s);
        bdrv_set_change_cb(bs, cdrom_change_cb, s);
    }
    if (serial && *serial) {
    if (serial) {
        strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
    } else {
        snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
@@ -2668,7 +2668,8 @@ void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
        dinfo = i == 0 ? hd0 : hd1;
        ide_init1(bus, i);
        if (dinfo) {
            ide_init_drive(&bus->ifs[i], dinfo, NULL, dinfo->serial);
            ide_init_drive(&bus->ifs[i], dinfo->bdrv, NULL,
                           *dinfo->serial ? dinfo->serial : NULL);
        } else {
            ide_reset(&bus->ifs[i]);
        }
+1 −1
Original line number Diff line number Diff line
@@ -555,7 +555,7 @@ uint32_t ide_data_readw(void *opaque, uint32_t addr);
void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
uint32_t ide_data_readl(void *opaque, uint32_t addr);

void ide_init_drive(IDEState *s, DriveInfo *dinfo,
void ide_init_drive(IDEState *s, BlockDriverState *bs,
                    const char *version, const char *serial);
void ide_init2(IDEBus *bus, qemu_irq irq);
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
+8 −4
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ static int ide_qdev_init(DeviceState *qdev, DeviceInfo *base)
    IDEDeviceInfo *info = DO_UPCAST(IDEDeviceInfo, qdev, base);
    IDEBus *bus = DO_UPCAST(IDEBus, qbus, qdev->parent_bus);

    if (!dev->conf.dinfo) {
    if (!dev->conf.bs) {
        fprintf(stderr, "%s: no drive specified\n", qdev->info->name);
        goto err;
    }
@@ -83,7 +83,7 @@ IDEDevice *ide_create_drive(IDEBus *bus, int unit, DriveInfo *drive)

    dev = qdev_create(&bus->qbus, "ide-drive");
    qdev_prop_set_uint32(dev, "unit", unit);
    qdev_prop_set_drive(dev, "drive", drive);
    qdev_prop_set_drive(dev, "drive", drive->bdrv);
    qdev_init_nofail(dev);
    return DO_UPCAST(IDEDevice, qdev, dev);
}
@@ -99,14 +99,18 @@ static int ide_drive_initfn(IDEDevice *dev)
    IDEBus *bus = DO_UPCAST(IDEBus, qbus, dev->qdev.parent_bus);
    IDEState *s = bus->ifs + dev->unit;
    const char *serial;
    DriveInfo *dinfo;

    serial = dev->serial;
    if (!serial) {
        /* try to fall back to value set with legacy -drive serial=... */
        serial = dev->conf.dinfo->serial;
        dinfo = drive_get_by_blockdev(dev->conf.bs);
        if (*dinfo->serial) {
            serial = dinfo->serial;
        }
    }

    ide_init_drive(s, dev->conf.dinfo, dev->version, serial);
    ide_init_drive(s, dev->conf.bs, dev->version, serial);

    if (!dev->version) {
        dev->version = qemu_strdup(s->version);
Loading