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