提交 49bd1458 编写于 作者: M Markus Armbruster 提交者: Anthony Liguori

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: NMarkus Armbruster <armbru@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 48042d86
...@@ -114,6 +114,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, ...@@ -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, ...@@ -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:
......
...@@ -317,7 +317,7 @@ int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp, ...@@ -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;
......
...@@ -262,6 +262,7 @@ int pci_bus_num(PCIBus *s); ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册