| 
 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. 
  
  
  
 |