Add the two commands( "xm usb-add" and "xm usb-del") to add or delete the usb device instead of do it in QEMU console.
diff -r 41dbce3c96ea tools/ioemu-remote/xenstore.c --- a/tools/ioemu-remote/xenstore.c Tue Oct 13 14:23:10 2009 +0800 +++ b/tools/ioemu-remote/xenstore.c Wed Oct 14 15:10:24 2009 +0800 @@ -908,6 +908,7 @@ char *path = NULL, *command = NULL, *par = NULL; unsigned int len; extern char* snapshot_name; + extern void do_usb_add(const char *devname);
if (pasprintf(&path, "/local/domain/0/device-model/%u/command", domid) == -1) { @@ -932,6 +933,34 @@ }
snapshot_name = xs_read(xsh, XBT_NULL, path, &len); + } else if (!strncmp(command, "usb-add", len)) { + fprintf(logfile, "dm-command: usb-add a usb device\n"); + if (pasprintf(&path, + "/local/domain/0/device-model/%u/parameter", domid) == -1) { + fprintf(logfile, "out of memory reading dm command parameter\n"); + goto out; + } + par = xs_read(xsh, XBT_NULL, path, &len); + fprintf(logfile, "dm-command: usb-add a usb device: %s \n", par); + if (!par) + goto out; + do_usb_add(par); + xenstore_record_dm_state("usb-added"); + fprintf(logfile, "dm-command: finish usb-add a usb device:%s\n",par); + } else if (!strncmp(command, "usb-del", len)) { + fprintf(logfile, "dm-command: usb-del a usb device\n"); + if (pasprintf(&path, + "/local/domain/0/device-model/%u/parameter", domid) == -1) { + fprintf(logfile, "out of memory reading dm command parameter\n"); + goto out; + } + par = xs_read(xsh, XBT_NULL, path, &len);
+ fprintf(logfile, "dm-command: usb-del a usb device: %s \n", par); + if (!par) + goto out; + do_usb_del(par); + xenstore_record_dm_state("usb-deleted"); + fprintf(logfile, "dm-command: finish usb-del a usb device:%s\n",par); } else if (!strncmp(command, "snapshot-delete", len)) { if (pasprintf(&path, "/local/domain/0/device-model/%u/parameter", domid) == -1) { diff -r 41dbce3c96ea tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py Tue Oct 13 14:23:10 2009 +0800 +++ b/tools/python/xen/xend/XendDomain.py Wed Oct 14 15:10:24 2009 +0800 @@ -1561,6 +1561,28 @@ raise XendError("Unable to read snapshot file file %s: %s" % (snap_file, ex[1]))
+ def domain_usb_add(self, domid, dev_id): + dominfo = self.domain_lookup_nr(domid) + if not dominfo: + raise XendInvalidDomain(str(domid)) + + if dominfo._stateGet() != DOM_STATE_HALTED: + dominfo.image.signalDeviceModel("usb-add", + "usb-added", dev_id) + else: + log.debug("error: Domain is not running!") + + def domain_usb_del(self, domid, dev_id): + dominfo = self.domain_lookup_nr(domid) + if not dominfo: + raise XendInvalidDomain(str(domid)) + + if dominfo._stateGet() != DOM_STATE_HALTED: + dominfo.image.signalDeviceModel("usb-del", + "usb-deleted", dev_id) + else: + log.debug("error: Domain is not running!")
+ def domain_snapshot_delete(self, domid, name): """Delete domain snapshot
diff -r 41dbce3c96ea tools/python/xen/xend/server/SrvDomain.py --- a/tools/python/xen/xend/server/SrvDomain.py Tue Oct 13 14:23:10 2009 +0800 +++ b/tools/python/xen/xend/server/SrvDomain.py Wed Oct 14 15:10:24 2009 +0800 @@ -120,6 +120,20 @@ def do_snapshot_delete(self, _, req): return self.xd.domain_snapshot_delete(self.dom.getName(), req.args['name'][0])
+ def op_usb_add(self, op, req): + self.acceptCommand(req) + return req.threadRequest(self.do_usb_add, op, req) + + def do_usb_add(self, _, req): + return self.xd.domain_usb_add(self.dom.getName(), req) + + def op_usb_del(self, op, req): + self.acceptCommand(req) + return req.threadRequest(self.do_usb_add, op, req) + + def do_usb_del(self, _, req): + return self.xd.domain_usb_add(self.dom.getName(), req) + def op_dump(self, op, req): self.acceptCommand(req) return req.threadRequest(self.do_dump, op, req) diff -r 41dbce3c96ea tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Tue Oct 13 14:23:10 2009 +0800 +++ b/tools/python/xen/xm/main.py Wed Oct 14 15:10:24 2009 +0800 @@ -168,6 +168,9 @@ 'vcpu-set' : ('<Domain> <vCPUs>', 'Set the number of active VCPUs for allowed for the' ' domain.'), + #usb + 'usb-add' : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'),
+ 'usb-del' : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Delete the usb device to FV VM.'),
# device commands
@@ -325,6 +328,8 @@ "top", "unpause", "uptime", + "usb-add", + "usb-del", "vcpu-set", ]
@@ -361,6 +366,8 @@ "top", "unpause", "uptime", + "usb-add", + "usb-del", "vcpu-list", "vcpu-pin", "vcpu-set", @@ -1500,6 +1507,14 @@ mem_target = int_unit(args[1], 'm') server.xend.domain.setMemoryTarget(dom, mem_target)
+def xm_usb_add(args): + arg_check(args, "usb-add", 2) + server.xend.domain.usb_add(args[0],args[1]) + +def xm_usb_del(args): + arg_check(args, "usb-del", 2) + server.xend.domain.usb_del(args[0],args[1]) + def xm_vcpu_set(args): arg_check(args, "vcpu-set", 2)
@@ -2990,6 +3005,9 @@ "scsi-attach": xm_scsi_attach, "scsi-detach": xm_scsi_detach, "scsi-list": xm_scsi_list, + #usb + "usb-add": xm_usb_add, + "usb-del": xm_usb_del, }
## The commands supported by a separate argument parser in xend.xm.
|