summaryrefslogtreecommitdiff
path: root/src/node_device
diff options
context:
space:
mode:
authorJonathon Jongsma <jjongsma@redhat.com>2020-05-11 11:40:26 -0500
committerJonathon Jongsma <jjongsma@redhat.com>2021-04-07 15:10:28 -0500
commit7e386cde1f7f6761ac189277e07d74f7d98a8254 (patch)
treeb90f7406b39f70543834cb8f1798cbccae00949e /src/node_device
parenta48a2abe601d3efbd97de4215ffa2d44ddf071c6 (diff)
downloadlibvirt-7e386cde1f7f6761ac189277e07d74f7d98a8254.tar.gz
api: add virNodeDeviceDefineXML()
With mediated devices, we can now define persistent node devices that can be started and stopped. In order to take advantage of this, we need an API to define new node devices. Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com> Reviewed-by: Erik Skultety <eskultet@redhat.com>
Diffstat (limited to 'src/node_device')
-rw-r--r--src/node_device/node_device_driver.c72
-rw-r--r--src/node_device/node_device_driver.h5
-rw-r--r--src/node_device/node_device_udev.c1
3 files changed, 78 insertions, 0 deletions
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
index de59c71b54..64e84e4faf 100644
--- a/src/node_device/node_device_driver.c
+++ b/src/node_device/node_device_driver.c
@@ -776,6 +776,27 @@ virMdevctlStart(virNodeDeviceDefPtr def, char **uuid, char **errmsg)
}
+static int
+virMdevctlDefine(virNodeDeviceDefPtr def, char **uuid, char **errmsg)
+{
+ int status;
+ g_autoptr(virCommand) cmd = nodeDeviceGetMdevctlDefineCommand(def, uuid, errmsg);
+
+ if (!cmd)
+ return -1;
+
+ /* an auto-generated uuid is returned via stdout if no uuid is specified in
+ * the mdevctl args */
+ if (virCommandRun(cmd, &status) < 0 || status != 0)
+ return -1;
+
+ /* remove newline */
+ *uuid = g_strstrip(*uuid);
+
+ return 0;
+}
+
+
static virNodeDevicePtr
nodeDeviceCreateXMLMdev(virConnectPtr conn,
virNodeDeviceDefPtr def)
@@ -1116,6 +1137,57 @@ nodeDeviceDestroy(virNodeDevicePtr device)
return ret;
}
+virNodeDevice*
+nodeDeviceDefineXML(virConnect *conn,
+ const char *xmlDesc,
+ unsigned int flags)
+{
+ g_autoptr(virNodeDeviceDef) def = NULL;
+ virNodeDevice *device = NULL;
+ const char *virt_type = NULL;
+ g_autofree char *uuid = NULL;
+ g_autofree char *errmsg = NULL;
+
+ virCheckFlags(0, NULL);
+
+ if (nodeDeviceWaitInit() < 0)
+ return NULL;
+
+ virt_type = virConnectGetType(conn);
+
+ if (!(def = virNodeDeviceDefParseString(xmlDesc, CREATE_DEVICE, virt_type)))
+ return NULL;
+
+ if (virNodeDeviceDefineXMLEnsureACL(conn, def) < 0)
+ return NULL;
+
+ if (!nodeDeviceHasCapability(def, VIR_NODE_DEV_CAP_MDEV)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Unsupported device type"));
+ return NULL;
+ }
+
+ if (!def->parent) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("cannot define a mediated device without a parent"));
+ return NULL;
+ }
+
+ if (virMdevctlDefine(def, &uuid, &errmsg) < 0) {
+ if (errmsg)
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unable to define mediated device: %s"), errmsg);
+ return NULL;
+ }
+
+ def->caps->data.mdev.uuid = g_strdup(uuid);
+ mdevGenerateDeviceName(def);
+ device = nodeDeviceFindNewMediatedDevice(conn, uuid);
+
+ return device;
+}
+
+
int
nodeConnectNodeDeviceEventRegisterAny(virConnectPtr conn,
diff --git a/src/node_device/node_device_driver.h b/src/node_device/node_device_driver.h
index 99967fb810..15f8a2a2ab 100644
--- a/src/node_device/node_device_driver.h
+++ b/src/node_device/node_device_driver.h
@@ -102,6 +102,11 @@ nodeDeviceCreateXML(virConnectPtr conn,
int
nodeDeviceDestroy(virNodeDevicePtr dev);
+virNodeDevice*
+nodeDeviceDefineXML(virConnect *conn,
+ const char *xmlDesc,
+ unsigned int flags);
+
int
nodeConnectNodeDeviceEventRegisterAny(virConnectPtr conn,
virNodeDevicePtr dev,
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
index 8a96681f07..20507c73aa 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -2325,6 +2325,7 @@ static virNodeDeviceDriver udevNodeDeviceDriver = {
.nodeDeviceListCaps = nodeDeviceListCaps, /* 0.7.3 */
.nodeDeviceCreateXML = nodeDeviceCreateXML, /* 0.7.3 */
.nodeDeviceDestroy = nodeDeviceDestroy, /* 0.7.3 */
+ .nodeDeviceDefineXML = nodeDeviceDefineXML, /* 7.2.0 */
};