[libvirt PATCH v2 12/16] api: add virNodeDeviceUndefine()
Erik Skultety
eskultet at redhat.com
Tue Aug 25 11:49:51 UTC 2020
On Tue, Aug 18, 2020 at 09:48:02AM -0500, Jonathon Jongsma wrote:
> This interface allows you to undefine a persistently defined (but
> inactive) mediated devices. It is implemented via 'mdevctl'
>
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> ---
> include/libvirt/libvirt-nodedev.h | 2 +
> src/driver-nodedev.h | 4 ++
> src/libvirt-nodedev.c | 36 ++++++++++
> src/libvirt_public.syms | 1 +
> src/node_device/node_device_driver.c | 68 +++++++++++++++++++
> src/node_device/node_device_driver.h | 6 ++
> src/node_device/node_device_udev.c | 1 +
> src/remote/remote_driver.c | 1 +
> src/remote/remote_protocol.x | 14 +++-
> src/remote_protocol-structs | 4 ++
> .../nodedevmdevctldata/mdevctl-undefine.argv | 1 +
> tests/nodedevmdevctltest.c | 56 ++++++++++++---
> 12 files changed, 185 insertions(+), 9 deletions(-)
> create mode 100644 tests/nodedevmdevctldata/mdevctl-undefine.argv
...
>
> +virCommandPtr
> +nodeDeviceGetMdevctlUndefineCommand(const char *uuid)
> +{
> + return virCommandNewArgList(MDEVCTL,
> + "undefine",
> + "-u",
> + uuid,
> + NULL);
> +
> +}
> +
> static int
> virMdevctlStop(virNodeDeviceDefPtr def)
> {
> @@ -848,6 +859,21 @@ virMdevctlStop(virNodeDeviceDefPtr def)
> }
>
>
> +static int
> +virMdevctlUndefine(virNodeDeviceDefPtr def)
> +{
> + int status;
> + g_autoptr(virCommand) cmd = NULL;
> +
> + cmd = nodeDeviceGetMdevctlUndefineCommand(def->caps->data.mdev.uuid);
> +
> + if (virCommandRun(cmd, &status) < 0 || status != 0)
> + return -1;
> +
> + return 0;
> +}
> +
> +
Depending on 10/16 comments, ^this would need some micro adjustments.
> virCommandPtr
> nodeDeviceGetMdevctlListCommand(bool defined,
> char **output)
> @@ -1093,6 +1119,48 @@ nodeDeviceDefineXML(virConnectPtr conn,
> }
>
>
> +int
> +nodeDeviceUndefine(virNodeDevicePtr device)
> +{
> + int ret = -1;
> + virNodeDeviceObjPtr obj = NULL;
> + virNodeDeviceDefPtr def;
> + g_autofree char *parent = NULL;
> +
> + if (nodeDeviceWaitInit() < 0)
> + return -1;
> +
> + if (!(obj = nodeDeviceObjFindByName(device->name)))
> + return -1;
> + def = virNodeDeviceObjGetDef(obj);
> +
> + if (virNodeDeviceUndefineEnsureACL(device->conn, def) < 0)
> + goto cleanup;
> +
> + if (virNodeDeviceObjIsActive(obj)) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("node device '%s' is still active"),
> + def->name);
> + goto cleanup;
> + }
> +
> + if (nodeDeviceHasCapability(def, VIR_NODE_DEV_CAP_MDEV)) {
> + if (virMdevctlUndefine(def) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Unable to undefine mediated device"));
> + goto cleanup;
I haven't had a deep look at the mdevctl thread yet, so I hope we won't get to
a racy kind of situation where we'd try to undefine a device that doesn't
exist either transient or persistent in mdevctl anymore.
> + }
> + ret = 0;
> + } else {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Unsupported device type"));
> + }
> +
> + cleanup:
> + virNodeDeviceObjEndAPI(&obj);
> + return ret;
> +}
> +
...
> static int
> -testMdevctlStop(const void *data)
> +testMdevctlUuidCommand(const char *uuid, GetStopUndefineCmdFunc func, const char *outfile)
Hopefully with comments in 10/16 ^this could become testMdevctlCommand and
simplify these test code bits more.
Regards,
Erik
More information about the libvir-list
mailing list