]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Implement node attach/reattach/reset in the remote driver
authorDaniel Veillard <veillard@redhat.com>
Mon, 2 Mar 2009 16:30:59 +0000 (16:30 +0000)
committerDaniel Veillard <veillard@redhat.com>
Mon, 2 Mar 2009 16:30:59 +0000 (16:30 +0000)
* qemud/remote.c qemud/remote_dispatch_args.h
  qemud/remote_dispatch_prototypes.h qemud/remote_dispatch_table.h
  qemud/remote_protocol.c qemud/remote_protocol.h
  qemud/remote_protocol.x src/remote_internal.c: Implement
  attach/reattach/reset in the remote driver, patch by Mark
  McLoughlin.
Daniel

ChangeLog
qemud/remote.c
qemud/remote_dispatch_args.h
qemud/remote_dispatch_prototypes.h
qemud/remote_dispatch_table.h
qemud/remote_protocol.c
qemud/remote_protocol.h
qemud/remote_protocol.x
src/remote_internal.c

index b36aea1e68519aeaf6ed493453f37dfd462e5af6..ee3f56927b9e720f28b42e3b8ee2d6bc8a4136c0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Mon Mar  2 17:28:42 CET 2009 Daniel Veillard <veillard@redhat.com>
+
+       * qemud/remote.c qemud/remote_dispatch_args.h
+         qemud/remote_dispatch_prototypes.h qemud/remote_dispatch_table.h
+         qemud/remote_protocol.c qemud/remote_protocol.h
+         qemud/remote_protocol.x src/remote_internal.c: Implement
+         attach/reattach/reset in the remote driver, patch by Mark
+         McLoughlin.
+
 Mon Mar  2 17:26:48 CET 2009 Daniel Veillard <veillard@redhat.com>
 
        * src/virsh.c: add 3 new commands for node device detach,
index 78dda4260bde2e5f0326d123cd70f33324f26738..bb4cdb09415a74d489ecbe4d32593c130feb19a1 100644 (file)
@@ -4172,6 +4172,84 @@ remoteDispatchNodeDeviceListCaps (struct qemud_server *server ATTRIBUTE_UNUSED,
 }
 
 
+static int
+remoteDispatchNodeDeviceDettach (struct qemud_server *server ATTRIBUTE_UNUSED,
+                                 struct qemud_client *client ATTRIBUTE_UNUSED,
+                                 virConnectPtr conn,
+                                 remote_error *rerr,
+                                 remote_node_device_dettach_args *args,
+                                 void *ret ATTRIBUTE_UNUSED)
+{
+    virNodeDevicePtr dev;
+    CHECK_CONN(client);
+
+    dev = virNodeDeviceLookupByName(conn, args->name);
+    if (dev == NULL) {
+        remoteDispatchFormatError(rerr, "%s", _("node_device not found"));
+        return -1;
+    }
+
+    if (virNodeDeviceDettach(dev) == -1) {
+        remoteDispatchConnError(rerr, conn);
+        return -1;
+    }
+
+    return 0;
+}
+
+
+static int
+remoteDispatchNodeDeviceReAttach (struct qemud_server *server ATTRIBUTE_UNUSED,
+                                  struct qemud_client *client ATTRIBUTE_UNUSED,
+                                  virConnectPtr conn,
+                                  remote_error *rerr,
+                                  remote_node_device_re_attach_args *args,
+                                  void *ret ATTRIBUTE_UNUSED)
+{
+    virNodeDevicePtr dev;
+    CHECK_CONN(client);
+
+    dev = virNodeDeviceLookupByName(conn, args->name);
+    if (dev == NULL) {
+        remoteDispatchFormatError(rerr, "%s", _("node_device not found"));
+        return -1;
+    }
+
+    if (virNodeDeviceReAttach(dev) == -1) {
+        remoteDispatchConnError(rerr, conn);
+        return -1;
+    }
+
+    return 0;
+}
+
+
+static int
+remoteDispatchNodeDeviceReset (struct qemud_server *server ATTRIBUTE_UNUSED,
+                               struct qemud_client *client ATTRIBUTE_UNUSED,
+                               virConnectPtr conn,
+                               remote_error *rerr,
+                               remote_node_device_reset_args *args,
+                               void *ret ATTRIBUTE_UNUSED)
+{
+    virNodeDevicePtr dev;
+    CHECK_CONN(client);
+
+    dev = virNodeDeviceLookupByName(conn, args->name);
+    if (dev == NULL) {
+        remoteDispatchFormatError(rerr, "%s", _("node_device not found"));
+        return -1;
+    }
+
+    if (virNodeDeviceReset(dev) == -1) {
+        remoteDispatchConnError(rerr, conn);
+        return -1;
+    }
+
+    return 0;
+}
+
+
 /**************************
  * Async Events
  **************************/
index a19ab79d81826f76d8ac246c43241f603f9d0a81..03a79374a4b62de729bd4b43abd4cd1e28bdac36 100644 (file)
@@ -99,3 +99,6 @@
     remote_node_device_get_parent_args val_remote_node_device_get_parent_args;
     remote_node_device_num_of_caps_args val_remote_node_device_num_of_caps_args;
     remote_node_device_list_caps_args val_remote_node_device_list_caps_args;
+    remote_node_device_dettach_args val_remote_node_device_dettach_args;
+    remote_node_device_re_attach_args val_remote_node_device_re_attach_args;
+    remote_node_device_reset_args val_remote_node_device_reset_args;
index 3ffb1645af6ac8320e6068bcb9c1afbbe9b66b82..4188c6a626d5e533e97dd70758a23a794ece2f78 100644 (file)
@@ -520,6 +520,13 @@ static int remoteDispatchNetworkUndefine(
     remote_error *err,
     remote_network_undefine_args *args,
     void *ret);
+static int remoteDispatchNodeDeviceDettach(
+    struct qemud_server *server,
+    struct qemud_client *client,
+    virConnectPtr conn,
+    remote_error *err,
+    remote_node_device_dettach_args *args,
+    void *ret);
 static int remoteDispatchNodeDeviceDumpXml(
     struct qemud_server *server,
     struct qemud_client *client,
@@ -555,6 +562,20 @@ static int remoteDispatchNodeDeviceNumOfCaps(
     remote_error *err,
     remote_node_device_num_of_caps_args *args,
     remote_node_device_num_of_caps_ret *ret);
+static int remoteDispatchNodeDeviceReAttach(
+    struct qemud_server *server,
+    struct qemud_client *client,
+    virConnectPtr conn,
+    remote_error *err,
+    remote_node_device_re_attach_args *args,
+    void *ret);
+static int remoteDispatchNodeDeviceReset(
+    struct qemud_server *server,
+    struct qemud_client *client,
+    virConnectPtr conn,
+    remote_error *err,
+    remote_node_device_reset_args *args,
+    void *ret);
 static int remoteDispatchNodeGetCellsFreeMemory(
     struct qemud_server *server,
     struct qemud_client *client,
index 60f0e1cce1a1ae037fdb58e11c9a8b571b4912aa..98be9f366e2efdf0026d27cdf184d68ff3e4295f 100644 (file)
     .args_filter = (xdrproc_t) xdr_remote_node_device_list_caps_args,
     .ret_filter = (xdrproc_t) xdr_remote_node_device_list_caps_ret,
 },
+{   /* NodeDeviceDettach => 118 */
+    .fn = (dispatch_fn) remoteDispatchNodeDeviceDettach,
+    .args_filter = (xdrproc_t) xdr_remote_node_device_dettach_args,
+    .ret_filter = (xdrproc_t) xdr_void,
+},
+{   /* NodeDeviceReAttach => 119 */
+    .fn = (dispatch_fn) remoteDispatchNodeDeviceReAttach,
+    .args_filter = (xdrproc_t) xdr_remote_node_device_re_attach_args,
+    .ret_filter = (xdrproc_t) xdr_void,
+},
+{   /* NodeDeviceReset => 120 */
+    .fn = (dispatch_fn) remoteDispatchNodeDeviceReset,
+    .args_filter = (xdrproc_t) xdr_remote_node_device_reset_args,
+    .ret_filter = (xdrproc_t) xdr_void,
+},
index 249614a132fa408bc8fb11853c61993c51c234af..b8724694575764aa1a9bd7ed43f211ebf093dd7b 100644 (file)
@@ -2165,6 +2165,33 @@ xdr_remote_node_device_list_caps_ret (XDR *xdrs, remote_node_device_list_caps_re
         return TRUE;
 }
 
+bool_t
+xdr_remote_node_device_dettach_args (XDR *xdrs, remote_node_device_dettach_args *objp)
+{
+
+         if (!xdr_remote_nonnull_string (xdrs, &objp->name))
+                 return FALSE;
+        return TRUE;
+}
+
+bool_t
+xdr_remote_node_device_re_attach_args (XDR *xdrs, remote_node_device_re_attach_args *objp)
+{
+
+         if (!xdr_remote_nonnull_string (xdrs, &objp->name))
+                 return FALSE;
+        return TRUE;
+}
+
+bool_t
+xdr_remote_node_device_reset_args (XDR *xdrs, remote_node_device_reset_args *objp)
+{
+
+         if (!xdr_remote_nonnull_string (xdrs, &objp->name))
+                 return FALSE;
+        return TRUE;
+}
+
 bool_t
 xdr_remote_domain_events_register_ret (XDR *xdrs, remote_domain_events_register_ret *objp)
 {
index 912d8e3020c98e57ed2d0dfc9ec2c1a99a7680d3..e73e5daaa3d0a7d4e465379aa6f75f069cd5ff3c 100644 (file)
@@ -1211,6 +1211,21 @@ struct remote_node_device_list_caps_ret {
 };
 typedef struct remote_node_device_list_caps_ret remote_node_device_list_caps_ret;
 
+struct remote_node_device_dettach_args {
+        remote_nonnull_string name;
+};
+typedef struct remote_node_device_dettach_args remote_node_device_dettach_args;
+
+struct remote_node_device_re_attach_args {
+        remote_nonnull_string name;
+};
+typedef struct remote_node_device_re_attach_args remote_node_device_re_attach_args;
+
+struct remote_node_device_reset_args {
+        remote_nonnull_string name;
+};
+typedef struct remote_node_device_reset_args remote_node_device_reset_args;
+
 struct remote_domain_events_register_ret {
         int cb_registered;
 };
@@ -1348,6 +1363,9 @@ enum remote_procedure {
         REMOTE_PROC_NODE_DEVICE_GET_PARENT = 115,
         REMOTE_PROC_NODE_DEVICE_NUM_OF_CAPS = 116,
         REMOTE_PROC_NODE_DEVICE_LIST_CAPS = 117,
+        REMOTE_PROC_NODE_DEVICE_DETTACH = 118,
+        REMOTE_PROC_NODE_DEVICE_RE_ATTACH = 119,
+        REMOTE_PROC_NODE_DEVICE_RESET = 120,
 };
 typedef enum remote_procedure remote_procedure;
 
@@ -1574,6 +1592,9 @@ extern  bool_t xdr_remote_node_device_num_of_caps_args (XDR *, remote_node_devic
 extern  bool_t xdr_remote_node_device_num_of_caps_ret (XDR *, remote_node_device_num_of_caps_ret*);
 extern  bool_t xdr_remote_node_device_list_caps_args (XDR *, remote_node_device_list_caps_args*);
 extern  bool_t xdr_remote_node_device_list_caps_ret (XDR *, remote_node_device_list_caps_ret*);
+extern  bool_t xdr_remote_node_device_dettach_args (XDR *, remote_node_device_dettach_args*);
+extern  bool_t xdr_remote_node_device_re_attach_args (XDR *, remote_node_device_re_attach_args*);
+extern  bool_t xdr_remote_node_device_reset_args (XDR *, remote_node_device_reset_args*);
 extern  bool_t xdr_remote_domain_events_register_ret (XDR *, remote_domain_events_register_ret*);
 extern  bool_t xdr_remote_domain_events_deregister_ret (XDR *, remote_domain_events_deregister_ret*);
 extern  bool_t xdr_remote_domain_event_ret (XDR *, remote_domain_event_ret*);
@@ -1779,6 +1800,9 @@ extern bool_t xdr_remote_node_device_num_of_caps_args ();
 extern bool_t xdr_remote_node_device_num_of_caps_ret ();
 extern bool_t xdr_remote_node_device_list_caps_args ();
 extern bool_t xdr_remote_node_device_list_caps_ret ();
+extern bool_t xdr_remote_node_device_dettach_args ();
+extern bool_t xdr_remote_node_device_re_attach_args ();
+extern bool_t xdr_remote_node_device_reset_args ();
 extern bool_t xdr_remote_domain_events_register_ret ();
 extern bool_t xdr_remote_domain_events_deregister_ret ();
 extern bool_t xdr_remote_domain_event_ret ();
index 2a6035be97163b1926c21eae5a3e1c7ab70cbab0..8f760644a5e8257efa9f9db895272a1d4de3fa80 100644 (file)
@@ -1068,6 +1068,18 @@ struct remote_node_device_list_caps_ret {
     remote_nonnull_string names<REMOTE_NODE_DEVICE_CAPS_LIST_MAX>;
 };
 
+struct remote_node_device_dettach_args {
+    remote_nonnull_string name;
+};
+
+struct remote_node_device_re_attach_args {
+    remote_nonnull_string name;
+};
+
+struct remote_node_device_reset_args {
+    remote_nonnull_string name;
+};
+
 
 /**
  * Events Register/Deregister:
@@ -1223,7 +1235,10 @@ enum remote_procedure {
     REMOTE_PROC_NODE_DEVICE_DUMP_XML = 114,
     REMOTE_PROC_NODE_DEVICE_GET_PARENT = 115,
     REMOTE_PROC_NODE_DEVICE_NUM_OF_CAPS = 116,
-    REMOTE_PROC_NODE_DEVICE_LIST_CAPS = 117
+    REMOTE_PROC_NODE_DEVICE_LIST_CAPS = 117,
+    REMOTE_PROC_NODE_DEVICE_DETTACH = 118,
+    REMOTE_PROC_NODE_DEVICE_RE_ATTACH = 119,
+    REMOTE_PROC_NODE_DEVICE_RESET = 120
 };
 
 /* Custom RPC structure. */
index 0439905fd60266db08c1283c4b482152147384ce..90c5a5d45fbcb47f63affdd093c0787d9be8d198 100644 (file)
@@ -4813,6 +4813,75 @@ done:
     return rv;
 }
 
+static int
+remoteNodeDeviceDettach (virNodeDevicePtr dev)
+{
+    int rv = -1;
+    remote_node_device_dettach_args args;
+    struct private_data *priv = dev->conn->privateData;
+
+    remoteDriverLock(priv);
+
+    args.name = dev->name;
+
+    if (call (dev->conn, priv, 0, REMOTE_PROC_NODE_DEVICE_DETTACH,
+              (xdrproc_t) xdr_remote_node_device_dettach_args, (char *) &args,
+              (xdrproc_t) xdr_void, (char *) NULL) == -1)
+        goto done;
+
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
+static int
+remoteNodeDeviceReAttach (virNodeDevicePtr dev)
+{
+    int rv = -1;
+    remote_node_device_re_attach_args args;
+    struct private_data *priv = dev->conn->privateData;
+
+    remoteDriverLock(priv);
+
+    args.name = dev->name;
+
+    if (call (dev->conn, priv, 0, REMOTE_PROC_NODE_DEVICE_RE_ATTACH,
+              (xdrproc_t) xdr_remote_node_device_re_attach_args, (char *) &args,
+              (xdrproc_t) xdr_void, (char *) NULL) == -1)
+        goto done;
+
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
+static int
+remoteNodeDeviceReset (virNodeDevicePtr dev)
+{
+    int rv = -1;
+    remote_node_device_reset_args args;
+    struct private_data *priv = dev->conn->privateData;
+
+    remoteDriverLock(priv);
+
+    args.name = dev->name;
+
+    if (call (dev->conn, priv, 0, REMOTE_PROC_NODE_DEVICE_RESET,
+              (xdrproc_t) xdr_remote_node_device_reset_args, (char *) &args,
+              (xdrproc_t) xdr_void, (char *) NULL) == -1)
+        goto done;
+
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
 
 /*----------------------------------------------------------------------*/
 
@@ -6742,6 +6811,9 @@ static virDriver driver = {
     .domainEventDeregister = remoteDomainEventDeregister,
     .domainMigratePrepare2 = remoteDomainMigratePrepare2,
     .domainMigrateFinish2 = remoteDomainMigrateFinish2,
+    .nodeDeviceDettach = remoteNodeDeviceDettach,
+    .nodeDeviceReAttach = remoteNodeDeviceReAttach,
+    .nodeDeviceReset = remoteNodeDeviceReset,
 };
 
 static virNetworkDriver network_driver = {