Re: [libvirt PATCH v4 21/25] api: add virNodeDeviceCreate()

2021-02-21 Thread Erik Skultety
On Wed, Feb 03, 2021 at 11:39:05AM -0600, Jonathon Jongsma wrote:
> 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 
> ---
...

> +int nodeDeviceCreate(virNodeDevicePtr device)
> +{
> +int ret = -1;
> +virNodeDeviceObjPtr obj = NULL;
> +virNodeDeviceDefPtr def;

...actually, please initialize ^this pointer as well to remain consistent.
Erik

(The RB still stands)



[libvirt PATCH v4 21/25] api: add virNodeDeviceCreate()

2021-02-03 Thread Jonathon Jongsma
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