]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
virsh: use new virNodeDeviceDetachFlags
authorLaine Stump <laine@laine.org>
Wed, 24 Apr 2013 18:22:36 +0000 (14:22 -0400)
committerLaine Stump <laine@laine.org>
Fri, 26 Apr 2013 01:28:43 +0000 (21:28 -0400)
The virsh nodedev-detach command has a new --driver option. If it's
given virsh will attempt to use the new virNodeDeviceDetachFlags API
instead of virNodeDeviceDettach. Validation of the driver name string
is left to the hypervisor (qemu accepts "kvm" or "vfio". The only
other hypervisor that implements these functions is xen, and it only
accepts NULL).

tools/virsh-nodedev.c

index 9c0bd90e933837098540a7f8d44beb2a4b4345a5..c196e7aeadbf4e0318bdd158077d07d50ecfdba1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * virsh-nodedev.c: Commands in node device group
  *
- * Copyright (C) 2005, 2007-2012 Red Hat, Inc.
+ * Copyright (C) 2005, 2007-2013 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -600,6 +600,10 @@ static const vshCmdOptDef opts_node_device_detach[] = {
      .flags = VSH_OFLAG_REQ,
      .help = N_("device key")
     },
+    {.name = "driver",
+     .type = VSH_OT_STRING,
+     .help = N_("pci device assignment backend driver (e.g. 'vfio' or 'kvm'")
+    },
     {.name = NULL}
 };
 
@@ -607,26 +611,36 @@ static bool
 cmdNodeDeviceDetach(vshControl *ctl, const vshCmd *cmd)
 {
     const char *name = NULL;
+    const char *driverName = NULL;
     virNodeDevicePtr device;
     bool ret = true;
 
     if (vshCommandOptStringReq(ctl, cmd, "device", &name) < 0)
         return false;
 
+    ignore_value(vshCommandOptString(cmd, "driver", &driverName));
+
     if (!(device = virNodeDeviceLookupByName(ctl->conn, name))) {
         vshError(ctl, _("Could not find matching device '%s'"), name);
         return false;
     }
 
-    /* Yes, our public API is misspelled.  At least virsh can accept
-     * either spelling.  */
-    if (virNodeDeviceDettach(device) == 0) {
-        vshPrint(ctl, _("Device %s detached\n"), name);
+    if (driverName) {
+        /* we must use the newer API that accepts a driverName */
+        if (virNodeDeviceDetachFlags(device, driverName, 0) < 0)
+            ret = false;
     } else {
-        vshError(ctl, _("Failed to detach device %s"), name);
-        ret = false;
+        /* Yes, our (old) public API is misspelled.  At least virsh
+         * can accept either spelling.  */
+        if (virNodeDeviceDettach(device) < 0)
+            ret = false;
     }
 
+    if (ret)
+        vshPrint(ctl, _("Device %s detached\n"), name);
+    else
+        vshError(ctl, _("Failed to detach device %s"), name);
+
     virNodeDeviceFree(device);
     return ret;
 }