This new API function provides a way to start a persistently-defined
mediate device that was defined by virNodeDeviceDefineXML() (or one that
was defined externally via mdevctl)
Signed-off-by: Jonathon Jongsma
---
include/libvirt/libvirt-nodedev.h| 2 +
src/driver-nodedev.h | 4 ++
src/libvirt-nodedev.c| 35 +++
src/libvirt_public.syms | 1 +
src/node_device/node_device_driver.c | 63
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 | 13 +++-
src/remote_protocol-structs | 4 ++
tests/nodedevmdevctldata/mdevctl-create.argv | 1 +
tests/nodedevmdevctltest.c | 11 +++-
12 files changed, 140 insertions(+), 2 deletions(-)
create mode 100644 tests/nodedevmdevctldata/mdevctl-create.argv
diff --git a/include/libvirt/libvirt-nodedev.h
b/include/libvirt/libvirt-nodedev.h
index facc02d243..f826d5e534 100644
--- a/include/libvirt/libvirt-nodedev.h
+++ b/include/libvirt/libvirt-nodedev.h
@@ -138,6 +138,8 @@ virNodeDevicePtr virNodeDeviceDefineXML(virConnectPtr conn,
int virNodeDeviceUndefine(virNodeDevicePtr dev);
+int virNodeDeviceCreate(virNodeDevicePtr dev);
+
/**
* VIR_NODE_DEVICE_EVENT_CALLBACK:
*
diff --git a/src/driver-nodedev.h b/src/driver-nodedev.h
index e18029ab48..d00dd5845c 100644
--- a/src/driver-nodedev.h
+++ b/src/driver-nodedev.h
@@ -82,6 +82,9 @@ typedef virNodeDevicePtr
typedef int
(*virDrvNodeDeviceUndefine)(virNodeDevicePtr dev);
+typedef int
+(*virDrvNodeDeviceCreate)(virNodeDevicePtr def);
+
typedef int
(*virDrvConnectNodeDeviceEventRegisterAny)(virConnectPtr conn,
virNodeDevicePtr dev,
@@ -123,4 +126,5 @@ struct _virNodeDeviceDriver {
virDrvNodeDeviceDestroy nodeDeviceDestroy;
virDrvNodeDeviceDefineXML nodeDeviceDefineXML;
virDrvNodeDeviceUndefine nodeDeviceUndefine;
+virDrvNodeDeviceCreate nodeDeviceCreate;
};
diff --git a/src/libvirt-nodedev.c b/src/libvirt-nodedev.c
index 618778517b..1d13466fc1 100644
--- a/src/libvirt-nodedev.c
+++ b/src/libvirt-nodedev.c
@@ -843,6 +843,41 @@ virNodeDeviceUndefine(virNodeDevicePtr dev)
}
+/**
+ * virNodeDeviceCreate:
+ * @dev: a device object
+ *
+ * Start a defined node device:
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+int
+virNodeDeviceCreate(virNodeDevicePtr dev)
+{
+VIR_DEBUG("dev=%p", dev);
+
+virResetLastError();
+
+virCheckNodeDeviceReturn(dev, -1);
+virCheckReadOnlyGoto(dev->conn->flags, error);
+
+if (dev->conn->nodeDeviceDriver &&
+dev->conn->nodeDeviceDriver->nodeDeviceCreate) {
+int retval = dev->conn->nodeDeviceDriver->nodeDeviceCreate(dev);
+if (retval < 0)
+goto error;
+
+return 0;
+}
+
+virReportUnsupportedError();
+
+ error:
+virDispatchError(dev->conn);
+return -1;
+}
+
+
/**
* virConnectNodeDeviceEventRegisterAny:
* @conn: pointer to the connection
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 8382d5d313..4007fbc78e 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -883,6 +883,7 @@ LIBVIRT_7.1.0 {
global:
virNodeDeviceDefineXML;
virNodeDeviceUndefine;
+virNodeDeviceCreate;
} LIBVIRT_6.10.0;
# define new API here using predicted next version number
diff --git a/src/node_device/node_device_driver.c
b/src/node_device/node_device_driver.c
index a2aa4ce8be..d5cdf2b097 100644
--- a/src/node_device/node_device_driver.c
+++ b/src/node_device/node_device_driver.c
@@ -889,6 +889,17 @@ nodeDeviceGetMdevctlUndefineCommand(const char *uuid)
}
+virCommandPtr
+nodeDeviceGetMdevctlCreateCommand(const char *uuid)
+{
+return virCommandNewArgList(MDEVCTL,
+"start",
+"-u",
+uuid,
+NULL);
+
+}
+
static int
virMdevctlStop(virNodeDeviceDefPtr def)
{
@@ -919,6 +930,21 @@ virMdevctlUndefine(virNodeDeviceDefPtr def)
}
+static int
+virMdevctlCreate(virNodeDeviceDefPtr def)
+{
+int status;
+g_autoptr(virCommand) cmd = NULL;
+
+cmd = nodeDeviceGetMdevctlCreateCommand(def->caps->data.mdev.uuid);
+
+if (virCommandRun(cmd, &status) < 0 || status != 0)
+return -1;
+
+return 0;
+}
+
+
virCommandPtr
nodeDeviceGetMdevctlListCommand(bool defined,
char **output)
@@ -1237,6 +1263,43 @@ nodeDeviceUndefine(virNodeDevicePtr device)
}
+int nodeDeviceCreate(virNodeDevicePtr device)
+{
+int ret = -1;
+virNodeDeviceObjPtr obj = NULL;
+virNodeDeviceDefPtr def;
+
+if (!(obj = nodeDeviceObjFindByName(device->name)))
+return -1;
+
+if (virNodeDeviceObjIsAc