diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ef509c93e25fde33b3ab7eec24f50cd5235177b6..5c7abcc356ebc83a839788f620945732312812b9 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4698,59 +4698,32 @@ static int qemudDomainAttachUsbMassstorageDevice(virConnectPtr conn, virDomainObjPtr vm, virDomainDeviceDefPtr dev) { - int ret, i; - char *safe_path; - char *cmd, *reply; + int i; for (i = 0 ; i < vm->def->ndisks ; i++) { if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) { - qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED, + qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, _("target %s already exists"), dev->data.disk->dst); return -1; } } - if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks+1) < 0) { - virReportOOMError(conn); - return -1; - } - - safe_path = qemudEscapeMonitorArg(dev->data.disk->src); - if (!safe_path) { - virReportOOMError(conn); + if (!dev->data.disk->src) { + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + "%s", _("disk source path is missing")); return -1; } - ret = virAsprintf(&cmd, "usb_add disk:%s", safe_path); - VIR_FREE(safe_path); - if (ret == -1) { + if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks+1) < 0) { virReportOOMError(conn); - return ret; - } - - if (qemudMonitorCommand(vm, cmd, &reply) < 0) { - qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED, - "%s", _("cannot attach usb disk")); - VIR_FREE(cmd); return -1; } - DEBUG ("%s: attach_usb reply: %s",vm->def->name, reply); - /* If the command failed qemu prints: - * Could not add ... */ - if (strstr(reply, "Could not add ")) { - qemudReportError (conn, dom, NULL, VIR_ERR_OPERATION_FAILED, - "%s", - _("adding usb disk failed")); - VIR_FREE(reply); - VIR_FREE(cmd); + if (qemuMonitorAddUSBDisk(vm, dev->data.disk->src) < 0) return -1; - } virDomainDiskInsertPreAlloced(vm->def, dev->data.disk); - VIR_FREE(reply); - VIR_FREE(cmd); return 0; } diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 78b5dfec6c38e68f99727d7d8fca1d34930975c4..9e94a3ee569605362a055f1fb0bfd7aa538a4c72 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -1199,3 +1199,46 @@ cleanup: VIR_FREE(dest); return ret; } + + +int qemuMonitorAddUSBDisk(const virDomainObjPtr vm, + const char *path) +{ + char *cmd = NULL; + char *safepath; + int ret = -1; + char *info = NULL; + + safepath = qemudEscapeMonitorArg(path); + if (!safepath) { + virReportOOMError(NULL); + return -1; + } + + if (virAsprintf(&cmd, "usb_add disk:%s", safepath) < 0) { + virReportOOMError(NULL); + goto cleanup; + } + + if (qemudMonitorCommand(vm, cmd, &info) < 0) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + "%s", _("cannot run monitor command to add usb disk")); + goto cleanup; + } + + DEBUG ("%s: usb_add reply: %s", vm->def->name, info); + /* If the command failed qemu prints: + * Could not add ... */ + if (strstr(info, "Could not add ")) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED, + _("unable to add USB disk %s: %s"), path, info); + goto cleanup; + } + + ret = 0; + +cleanup: + VIR_FREE(cmd); + VIR_FREE(safepath); + return ret; +} diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index b43b410974a50528aab6a43da8c185c45b07d345..095e1f7848cd0c56974a0c0fb317848d7f736deb 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -136,4 +136,8 @@ int qemuMonitorMigrateToCommand(const virDomainObjPtr vm, const char * const *argv, const char *target); + +int qemuMonitorAddUSBDisk(const virDomainObjPtr vm, + const char *path); + #endif /* QEMU_MONITOR_TEXT_H */