mirror of https://github.com/xqemu/xqemu.git
Fix pci_add storage not to exit on bad first argument
Monitor command "pci_add ADDR storage ..." does its work in qemu_pci_hot_add_nic(). It called pci_create(..., ADDR) to create the device. That's wrong, because pci_create() terminates the program when ADDR is invalid. Use pci_get_bus_devfn() and pci_create_noinit() instead. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
48042d861e
commit
49bd1458da
|
@ -114,6 +114,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
|
||||||
DriveInfo *dinfo = NULL;
|
DriveInfo *dinfo = NULL;
|
||||||
int type = -1;
|
int type = -1;
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
PCIBus *bus;
|
||||||
|
int devfn;
|
||||||
|
|
||||||
if (get_param_value(buf, sizeof(buf), "if", opts)) {
|
if (get_param_value(buf, sizeof(buf), "if", opts)) {
|
||||||
if (!strcmp(buf, "scsi"))
|
if (!strcmp(buf, "scsi"))
|
||||||
|
@ -141,16 +143,22 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
|
||||||
dinfo = NULL;
|
dinfo = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bus = pci_get_bus_devfn(&devfn, devaddr);
|
||||||
|
if (!bus) {
|
||||||
|
monitor_printf(mon, "Invalid PCI device address %s\n", devaddr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case IF_SCSI:
|
case IF_SCSI:
|
||||||
dev = pci_create("lsi53c895a", devaddr);
|
dev = pci_create_noinit(bus, devfn, "lsi53c895a");
|
||||||
break;
|
break;
|
||||||
case IF_VIRTIO:
|
case IF_VIRTIO:
|
||||||
if (!dinfo) {
|
if (!dinfo) {
|
||||||
monitor_printf(mon, "virtio requires a backing file/device.\n");
|
monitor_printf(mon, "virtio requires a backing file/device.\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
dev = pci_create("virtio-blk-pci", devaddr);
|
dev = pci_create_noinit(bus, devfn, "virtio-blk-pci");
|
||||||
qdev_prop_set_drive(&dev->qdev, "drive", dinfo);
|
qdev_prop_set_drive(&dev->qdev, "drive", dinfo);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
2
hw/pci.c
2
hw/pci.c
|
@ -317,7 +317,7 @@ int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
|
PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
|
||||||
{
|
{
|
||||||
int dom, bus;
|
int dom, bus;
|
||||||
unsigned slot;
|
unsigned slot;
|
||||||
|
|
1
hw/pci.h
1
hw/pci.h
|
@ -262,6 +262,7 @@ int pci_bus_num(PCIBus *s);
|
||||||
void pci_for_each_device(int bus_num, void (*fn)(PCIDevice *d));
|
void pci_for_each_device(int bus_num, void (*fn)(PCIDevice *d));
|
||||||
PCIBus *pci_find_bus(int bus_num);
|
PCIBus *pci_find_bus(int bus_num);
|
||||||
PCIDevice *pci_find_device(int bus_num, int slot, int function);
|
PCIDevice *pci_find_device(int bus_num, int slot, int function);
|
||||||
|
PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr);
|
||||||
|
|
||||||
int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
|
int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
|
||||||
unsigned *slotp);
|
unsigned *slotp);
|
||||||
|
|
Loading…
Reference in New Issue