]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Convert Xen domain stats/peek driver methods to use virDomainDefPtr
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 2 May 2013 10:24:49 +0000 (11:24 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 21 May 2013 15:11:39 +0000 (16:11 +0100)
Introduce use of a virDomainDefPtr in the domain stats &
peek APIs to simplify introduction of ACL security checks.
The virDomainPtr cannot be safely used, since the app
may have supplied mis-matching name/uuid/id fields. eg
the name points to domain X, while the uuid points to
domain Y. Resolving the virDomainPtr to a virDomainDefPtr
ensures a consistent name/uuid/id set.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/xen/block_stats.c
src/xen/block_stats.h
src/xen/xen_driver.c
src/xen/xen_hypervisor.c
src/xen/xen_hypervisor.h
src/xen/xend_internal.c
src/xen/xend_internal.h
src/xen/xm_internal.c
src/xen/xm_internal.h

index ded8d7f5f12c063b7c27165bd7ff87770d4fca05..56a3901e02c28307cade99bdaec656737d54013f 100644 (file)
@@ -359,16 +359,16 @@ xenLinuxDomainDeviceID(int domid, const char *path)
 
 int
 xenLinuxDomainBlockStats(xenUnifiedPrivatePtr priv,
-                         virDomainPtr dom,
+                         virDomainDefPtr def,
                          const char *path,
                          struct _virDomainBlockStats *stats)
 {
-    int device = xenLinuxDomainDeviceID(dom->id, path);
+    int device = xenLinuxDomainDeviceID(def->id, path);
 
     if (device < 0)
         return -1;
 
-    return read_bd_stats(priv, device, dom->id, stats);
+    return read_bd_stats(priv, device, def->id, stats);
 }
 
 #endif /* __linux__ */
index 0a3c40a064a7c8400db4f667012c98f361306d20..6633d972d0cb051dedad6ac06cdff9f451c5e60e 100644 (file)
@@ -28,7 +28,7 @@
 #  include "xen_driver.h"
 
 extern int xenLinuxDomainBlockStats (xenUnifiedPrivatePtr priv,
-                                     virDomainPtr dom, const char *path,
+                                     virDomainDefPtr def, const char *path,
                                      struct _virDomainBlockStats *stats);
 
 extern int xenLinuxDomainDeviceID(int domid, const char *dev);
index 7d06b95b9f7295da0c6907619614de9f2497eb11..3a5db55e914d3045d5dbbc52c7c14259554d55cc 100644 (file)
@@ -1955,14 +1955,34 @@ static int
 xenUnifiedDomainBlockStats(virDomainPtr dom, const char *path,
                            struct _virDomainBlockStats *stats)
 {
-    return xenHypervisorDomainBlockStats(dom, path, stats);
+    virDomainDefPtr def = NULL;
+    int ret = -1;
+
+    if (!(def = xenGetDomainDefForDom(dom)))
+        goto cleanup;
+
+    ret = xenHypervisorDomainBlockStats(dom->conn, def, path, stats);
+
+cleanup:
+    virDomainDefFree(def);
+    return ret;
 }
 
 static int
 xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path,
                                struct _virDomainInterfaceStats *stats)
 {
-    return xenHypervisorDomainInterfaceStats(dom, path, stats);
+    virDomainDefPtr def = NULL;
+    int ret = -1;
+
+    if (!(def = xenGetDomainDefForDom(dom)))
+        goto cleanup;
+
+    ret = xenHypervisorDomainInterfaceStats(def, path, stats);
+
+cleanup:
+    virDomainDefFree(def);
+    return ret;
 }
 
 static int
@@ -1971,13 +1991,22 @@ xenUnifiedDomainBlockPeek(virDomainPtr dom, const char *path,
                           void *buffer, unsigned int flags)
 {
     xenUnifiedPrivatePtr priv = dom->conn->privateData;
+    virDomainDefPtr def = NULL;
+    int ret = -1;
 
     virCheckFlags(0, -1);
 
+    if (!(def = xenGetDomainDefForDom(dom)))
+        goto cleanup;
+
     if (dom->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
-        return xenXMDomainBlockPeek(dom, path, offset, size, buffer);
+        ret = xenXMDomainBlockPeek(dom->conn, def, path, offset, size, buffer);
     else
-        return xenDaemonDomainBlockPeek(dom, path, offset, size, buffer);
+        ret = xenDaemonDomainBlockPeek(dom->conn, def, path, offset, size, buffer);
+
+cleanup:
+    virDomainDefFree(def);
+    return ret;
 }
 
 static int
index 9e8e593f6e7f127bfa5999e013e2ec18beb0a29e..fa2171752937e3858fe521865e64a34fc74ec892 100644 (file)
@@ -1370,17 +1370,18 @@ xenHypervisorSetSchedulerParameters(virConnectPtr conn,
 
 
 int
-xenHypervisorDomainBlockStats(virDomainPtr dom,
+xenHypervisorDomainBlockStats(virConnectPtr conn,
+                              virDomainDefPtr def,
                               const char *path,
                               struct _virDomainBlockStats *stats)
 {
 #ifdef __linux__
-    xenUnifiedPrivatePtr priv = dom->conn->privateData;
+    xenUnifiedPrivatePtr priv = conn->privateData;
     int ret;
 
     xenUnifiedLock(priv);
     /* Need to lock because it hits the xenstore handle :-( */
-    ret = xenLinuxDomainBlockStats(priv, dom, path, stats);
+    ret = xenLinuxDomainBlockStats(priv, def, path, stats);
     xenUnifiedUnlock(priv);
     return ret;
 #else
@@ -1398,7 +1399,7 @@ xenHypervisorDomainBlockStats(virDomainPtr dom,
  * virNetwork interface, as yet not decided.
  */
 int
-xenHypervisorDomainInterfaceStats(virDomainPtr dom,
+xenHypervisorDomainInterfaceStats(virDomainDefPtr def,
                                   const char *path,
                                   struct _virDomainInterfaceStats *stats)
 {
@@ -1413,7 +1414,7 @@ xenHypervisorDomainInterfaceStats(virDomainPtr dom,
                        _("invalid path, should be vif<domid>.<n>."));
         return -1;
     }
-    if (rqdomid != dom->id) {
+    if (rqdomid != def->id) {
         virReportError(VIR_ERR_INVALID_ARG, "%s",
                        _("invalid path, vif<domid> should match this domain ID"));
         return -1;
index 1e5bb6763f6d397731859bc26c26d66406cee5fc..6aeab7975cc657741b06e3440ad5ab7b30957494 100644 (file)
@@ -122,13 +122,14 @@ int     xenHypervisorSetSchedulerParameters(virConnectPtr conn,
                                             int nparams)
           ATTRIBUTE_NONNULL (1);
 
-int     xenHypervisorDomainBlockStats   (virDomainPtr domain,
+int     xenHypervisorDomainBlockStats   (virConnectPtr conn,
+                                         virDomainDefPtr def,
                                          const char *path,
                                          struct _virDomainBlockStats *stats)
           ATTRIBUTE_NONNULL (1);
-int     xenHypervisorDomainInterfaceStats (virDomainPtr domain,
-                                         const char *path,
-                                         struct _virDomainInterfaceStats *stats)
+int     xenHypervisorDomainInterfaceStats (virDomainDefPtr def,
+                                           const char *path,
+                                           struct _virDomainInterfaceStats *stats)
           ATTRIBUTE_NONNULL (1);
 
 int     xenHypervisorNodeGetCellsFreeMemory(virConnectPtr conn,
index 34bacad1ca86fa7a13c77840ae0005031fb4504a..bd5a43417d5a9faa28b2b760d949b70c768d8c85 100644 (file)
@@ -3256,7 +3256,8 @@ error:
 
 /**
  * xenDaemonDomainBlockPeek:
- * @domain: domain object
+ * @conn: the hypervisor connection
+ * @minidef: minimal domain configuration
  * @path: path to the file or device
  * @offset: offset
  * @size: size
@@ -3265,13 +3266,14 @@ error:
  * Returns 0 if successful, -1 if error
  */
 int
-xenDaemonDomainBlockPeek(virDomainPtr domain,
+xenDaemonDomainBlockPeek(virConnectPtr conn,
+                         virDomainDefPtr minidef,
                          const char *path,
                          unsigned long long offset,
                          size_t size,
                          void *buffer)
 {
-    xenUnifiedPrivatePtr priv = domain->conn->privateData;
+    xenUnifiedPrivatePtr priv = conn->privateData;
     struct sexpr *root = NULL;
     int fd = -1, ret = -1;
     virDomainDefPtr def;
@@ -3281,12 +3283,12 @@ xenDaemonDomainBlockPeek(virDomainPtr domain,
     const char *actual;
 
     /* Security check: The path must correspond to a block device. */
-    if (domain->id > 0)
-        root = sexpr_get(domain->conn, "/xend/domain/%d?detail=1",
-                         domain->id);
-    else if (domain->id < 0)
-        root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1",
-                         domain->name);
+    if (minidef->id > 0)
+        root = sexpr_get(conn, "/xend/domain/%d?detail=1",
+                         minidef->id);
+    else if (minidef->id < 0)
+        root = sexpr_get(conn, "/xend/domain/%s?detail=1",
+                         minidef->name);
     else {
         /* This call always fails for dom0. */
         virReportError(VIR_ERR_OPERATION_INVALID,
@@ -3301,8 +3303,8 @@ xenDaemonDomainBlockPeek(virDomainPtr domain,
 
     id = xenGetDomIdFromSxpr(root, priv->xendConfigVersion);
     xenUnifiedLock(priv);
-    tty = xenStoreDomainGetConsolePath(domain->conn, id);
-    vncport = xenStoreDomainGetVNCPort(domain->conn, id);
+    tty = xenStoreDomainGetConsolePath(conn, id);
+    vncport = xenStoreDomainGetVNCPort(conn, id);
     xenUnifiedUnlock(priv);
 
     if (!(def = xenParseSxpr(root, priv->xendConfigVersion, NULL, tty,
@@ -3348,7 +3350,8 @@ xenDaemonDomainBlockPeek(virDomainPtr domain,
 
 /**
  * virDomainXMLDevID:
- * @domain: pointer to domain object
+ * @conn: the hypervisor connection
+ * @minidef: minimal domain configuration
  * @dev: pointer to device config object
  * @class: Xen device class "vbd" or "vif" (OUT)
  * @ref: Xen device reference (OUT)
index 9ab184b939154c44aca83bfc0052862f8d312669..cb9898bf7a6c9c9c572d9a2441c8af1e6ff15e43 100644 (file)
@@ -194,7 +194,12 @@ int xenDaemonDomainMigratePerform (virConnectPtr conn,
                                    const char *uri, unsigned long flags,
                                    const char *dname, unsigned long resource);
 
-int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer);
+int xenDaemonDomainBlockPeek(virConnectPtr conn,
+                             virDomainDefPtr def,
+                             const char *path,
+                             unsigned long long offset,
+                             size_t size,
+                             void *buffer);
 
 char * xenDaemonGetSchedulerType(virConnectPtr conn,
                                  int *nparams);
index 170b9284e6d1558fcf6459b202a6fb5c183db233..39a43febe62a9f89feac5f45e08827a499a09711 100644 (file)
@@ -1410,7 +1410,8 @@ xenXMDomainDetachDeviceFlags(virConnectPtr conn,
 }
 
 int
-xenXMDomainBlockPeek(virDomainPtr dom ATTRIBUTE_UNUSED,
+xenXMDomainBlockPeek(virConnectPtr conn ATTRIBUTE_UNUSED,
+                     virDomainDefPtr def ATTRIBUTE_UNUSED,
                      const char *path ATTRIBUTE_UNUSED,
                      unsigned long long offset ATTRIBUTE_UNUSED,
                      size_t size ATTRIBUTE_UNUSED,
index 78cd15c8e1d8fd86798211b31961322712493db1..25b4fd565166d5e15c371aeeb59f5fa9788d5b27 100644 (file)
@@ -80,7 +80,12 @@ int xenXMDomainCreate(virConnectPtr conn,
 int xenXMDomainDefineXML(virConnectPtr con, virDomainDefPtr def);
 int xenXMDomainUndefine(virConnectPtr conn, virDomainDefPtr def);
 
-int xenXMDomainBlockPeek (virDomainPtr dom, const char *path, unsigned long long offset, size_t size, void *buffer);
+int xenXMDomainBlockPeek(virConnectPtr conn,
+                         virDomainDefPtr def,
+                         const char *path,
+                         unsigned long long offset,
+                         size_t size,
+                         void *buffer);
 
 int xenXMDomainGetAutostart(virDomainDefPtr def,
                             int *autostart);