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 | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c
index 9c0bd90..c196e7a 100644
--- a/tools/virsh-nodedev.c
+++ b/tools/virsh-nodedev.c
@@ -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;
}
--
1.7.11.7