WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] New XS_SET_TARGET

# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1201094533 0
# Node ID 26fc953a89bb398410800610c9dc6727f389795b
# Parent  cff4c8a1aa28fa8856d61969618f8db9075e593c
New XS_SET_TARGET
Stubdomains (and probably other domain disagregation elements too)
need to be able to tinker with another domain.  This adds
XS_SET_TARGET so that XenStore allows domains to have permissions on
files on which the "target" has permissions.  This also adds
xs_set_target, called by the domain builder when the 'target' option
is used in the configuration.

Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
---
 tools/python/xen/lowlevel/xs/xs.c        |   31 +++++++++++++++++++++
 tools/python/xen/xend/XendDomainInfo.py  |   20 +++++++++++++
 tools/python/xen/xend/image.py           |    6 ++++
 tools/python/xen/xend/xenstore/xsutil.py |    3 ++
 tools/xenstore/xenstored_core.c          |   13 +++++++-
 tools/xenstore/xenstored_core.h          |    3 ++
 tools/xenstore/xenstored_domain.c        |   45 +++++++++++++++++++++++++++++++
 tools/xenstore/xenstored_domain.h        |    3 ++
 tools/xenstore/xs.c                      |   19 +++++++++++++
 tools/xenstore/xs.h                      |    9 ++++++
 xen/include/public/io/xs_wire.h          |    3 +-
 11 files changed, 151 insertions(+), 4 deletions(-)

diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/lowlevel/xs/xs.c
--- a/tools/python/xen/lowlevel/xs/xs.c Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/lowlevel/xs/xs.c Wed Jan 23 13:22:13 2008 +0000
@@ -619,6 +619,36 @@ static PyObject *xspy_introduce_domain(X
     return none(result);
 }
 
+#define xspy_set_target_doc "\n"                                       \
+        "Tell xenstore that a domain is targetting another one so it\n" \
+        "should let it tinker with it.\n"                              \
+       " dom    [int]   : domain id\n"                                 \
+       " target [int]   : domain id of the target\n"                   \
+       "\n"                                                            \
+       "Returns None on success.\n"                                    \
+       "Raises xen.lowlevel.xs.Error on error.\n"                      \
+       "\n"
+
+static PyObject *xspy_set_target(XsHandle *self, PyObject *args)
+{
+    uint32_t dom;
+    uint32_t target;
+
+    struct xs_handle *xh = xshandle(self);
+    bool result = 0;
+
+    if (!xh)
+        return NULL;
+    if (!PyArg_ParseTuple(args, "ii", &dom, &target))
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    result = xs_set_target(xh, dom, target);
+    Py_END_ALLOW_THREADS
+
+    return none(result);
+}
+
 #define xspy_resume_domain_doc "\n"                                \
        "Tell xenstore to clear its shutdown flag for a domain.\n" \
        "This ensures that a subsequent shutdown will fire the\n"  \
@@ -817,6 +847,7 @@ static PyMethodDef xshandle_methods[] = 
     XSPY_METH(transaction_start, METH_NOARGS),
     XSPY_METH(transaction_end,   METH_VARARGS | METH_KEYWORDS),
     XSPY_METH(introduce_domain,  METH_VARARGS),
+    XSPY_METH(set_target,        METH_VARARGS),
     XSPY_METH(resume_domain,     METH_VARARGS),
     XSPY_METH(release_domain,    METH_VARARGS),
     XSPY_METH(close,             METH_NOARGS),
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py   Wed Jan 23 13:22:13 2008 +0000
@@ -47,7 +47,7 @@ from xen.xend.XendDevices import XendDev
 from xen.xend.XendDevices import XendDevices
 from xen.xend.XendTask import XendTask
 from xen.xend.xenstore.xstransact import xstransact, complete
-from xen.xend.xenstore.xsutil import GetDomainPath, IntroduceDomain, 
ResumeDomain
+from xen.xend.xenstore.xsutil import GetDomainPath, IntroduceDomain, 
SetTarget, ResumeDomain
 from xen.xend.xenstore.xswatch import xswatch
 from xen.xend.XendConstants import *
 from xen.xend.XendAPIConstants import *
@@ -883,6 +883,9 @@ class XendDomainInfo:
     def storeVm(self, *args):
         return xstransact.Store(self.vmpath, *args)
 
+    def permissionsVm(self, *args):
+        return xstransact.SetPermissions(self.vmpath, *args)
+
 
     def _readVmTxn(self, transaction,  *args):
         paths = map(lambda x: self.vmpath + "/" + x, args)
@@ -903,6 +906,10 @@ class XendDomainInfo:
     def storeVmTxn(self, transaction,  *args):
         paths = map(lambda x: self.vmpath + "/" + x, args)
         return transaction.store(*paths)
+
+    def permissionsVmTxn(self, transaction,  *args):
+        paths = map(lambda x: self.vmpath + "/" + x, args)
+        return transaction.set_permissions(*paths)
 
     #
     # Function to update xenstore /dom/*
@@ -1692,6 +1699,15 @@ class XendDomainInfo:
         except RuntimeError, exn:
             raise XendError(str(exn))
 
+    def _setTarget(self, target):
+        assert self.domid is not None
+
+        try:
+            SetTarget(self.domid, target)
+            self.storeDom('target', target)
+        except RuntimeError, exn:
+            raise XendError(str(exn))
+
 
     def _initDomain(self):
         log.debug('XendDomainInfo.initDomain: %s %s',
@@ -1756,6 +1772,8 @@ class XendDomainInfo:
                 self.native_protocol = channel_details['native_protocol'];
 
             self._introduceDomain()
+            if self.info.target():
+                self._setTarget(self.info.target())
 
             self._createDevices()
 
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/xend/image.py    Wed Jan 23 13:22:13 2008 +0000
@@ -222,6 +222,7 @@ class ImageHandler:
             vncopts = ""
             if passwd:
                 self.vm.storeVm("vncpasswd", passwd)
+                self.vm.permissionsVm("vncpasswd", { 'dom': 
self.vm.getDomid(), 'read': True } )
                 vncopts = vncopts + ",password"
                 log.debug("Stored a VNC password for vfb access")
             else:
@@ -280,6 +281,9 @@ class ImageHandler:
             env['XAUTHORITY'] = self.xauthority
         if self.vncconsole:
             args = args + ([ "-vncviewer" ])
+        xstransact.Mkdir("/local/domain/0/device-model/%i" % 
self.vm.getDomid())
+        xstransact.SetPermissions("/local/domain/0/device-model/%i" % 
self.vm.getDomid(),
+                        { 'dom': self.vm.getDomid(), 'read': True, 'write': 
True })
         log.info("spawning device models: %s %s", self.device_model, args)
         # keep track of pid and spawned options to kill it later
         self.pid = os.spawnve(os.P_NOWAIT, self.device_model, args, env)
@@ -422,7 +426,9 @@ class HVMImageHandler(ImageHandler):
         self.vm.storeVm(("image/dmargs", " ".join(self.dmargs)),
                         ("image/device-model", self.device_model),
                         ("image/display", self.display))
+        self.vm.permissionsVm("image/dmargs", { 'dom': self.vm.getDomid(), 
'read': True } )
         self.vm.storeVm(("rtc/timeoffset", rtc_timeoffset))
+        self.vm.permissionsVm("rtc/timeoffset", { 'dom': self.vm.getDomid(), 
'read': True } )
 
         self.apic = int(vmConfig['platform'].get('apic', 0))
         self.acpi = int(vmConfig['platform'].get('acpi', 0))
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/xend/xenstore/xsutil.py
--- a/tools/python/xen/xend/xenstore/xsutil.py  Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/xend/xenstore/xsutil.py  Wed Jan 23 13:22:13 2008 +0000
@@ -22,6 +22,9 @@ def IntroduceDomain(domid, page, port):
 def IntroduceDomain(domid, page, port):
     return xshandle().introduce_domain(domid, page, port)
 
+def SetTarget(domid, target):
+    return xshandle().set_target(domid, target)
+
 def GetDomainPath(domid):
     return xshandle().get_domain_path(domid)
 
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c   Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_core.c   Wed Jan 23 13:22:13 2008 +0000
@@ -119,6 +119,7 @@ static char *sockmsg_string(enum xsd_soc
        case XS_ERROR: return "ERROR";
        case XS_IS_DOMAIN_INTRODUCED: return "XS_IS_DOMAIN_INTRODUCED";
        case XS_RESUME: return "RESUME";
+       case XS_SET_TARGET: return "SET_TARGET";
        default:
                return "**UNKNOWN**";
        }
@@ -283,6 +284,8 @@ static int destroy_conn(void *_conn)
                                break;
                close(conn->fd);
        }
+        if (conn->target)
+                talloc_unlink(conn, conn->target);
        list_del(&conn->list);
        trace_destroy(conn, "connection");
        return 0;
@@ -472,11 +475,13 @@ static enum xs_perm_type perm_for_conn(s
                mask &= ~XS_PERM_WRITE;
 
        /* Owners and tools get it all... */
-       if (!conn->id || perms[0].id == conn->id)
+       if (!conn->id || perms[0].id == conn->id
+                || (conn->target && perms[0].id == conn->target->id))
                return (XS_PERM_READ|XS_PERM_WRITE|XS_PERM_OWNER) & mask;
 
        for (i = 1; i < num; i++)
-               if (perms[i].id == conn->id)
+               if (perms[i].id == conn->id
+                        || (conn->target && perms[i].id == conn->target->id))
                        return perms[i].perms & mask;
 
        return perms[0].perms & mask;
@@ -1243,6 +1248,10 @@ static void process_message(struct conne
 
        case XS_RESUME:
                do_resume(conn, onearg(in));
+               break;
+
+       case XS_SET_TARGET:
+               do_set_target(conn, in);
                break;
 
        default:
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_core.h
--- a/tools/xenstore/xenstored_core.h   Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_core.h   Wed Jan 23 13:22:13 2008 +0000
@@ -84,6 +84,9 @@ struct connection
        /* The domain I'm associated with, if any. */
        struct domain *domain;
 
+        /* The target of the domain I'm associated with. */
+        struct connection *target;
+
        /* My watches. */
        struct list_head watches;
 
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_domain.c
--- a/tools/xenstore/xenstored_domain.c Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_domain.c Wed Jan 23 13:22:13 2008 +0000
@@ -381,6 +381,51 @@ void do_introduce(struct connection *con
        send_ack(conn, XS_INTRODUCE);
 }
 
+void do_set_target(struct connection *conn, struct buffered_data *in)
+{
+       char *vec[2];
+       unsigned int domid, tdomid;
+        struct domain *domain, *tdomain;
+       if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec)) {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+       if (conn->id != 0 || !conn->can_write) {
+               send_error(conn, EACCES);
+               return;
+       }
+
+       domid = atoi(vec[0]);
+       tdomid = atoi(vec[1]);
+
+        domain = find_domain_by_domid(domid);
+       if (!domain) {
+               send_error(conn, ENOENT);
+               return;
+       }
+        if (!domain->conn) {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+        tdomain = find_domain_by_domid(tdomid);
+       if (!tdomain) {
+               send_error(conn, ENOENT);
+               return;
+       }
+
+        if (!tdomain->conn) {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+        talloc_reference(domain->conn, tdomain->conn);
+        domain->conn->target = tdomain->conn;
+
+       send_ack(conn, XS_SET_TARGET);
+}
+
 /* domid */
 void do_release(struct connection *conn, const char *domid_str)
 {
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_domain.h
--- a/tools/xenstore/xenstored_domain.h Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_domain.h Wed Jan 23 13:22:13 2008 +0000
@@ -34,6 +34,9 @@ void do_release(struct connection *conn,
 /* domid */
 void do_resume(struct connection *conn, const char *domid_str);
 
+/* domid, target */
+void do_set_target(struct connection *conn, struct buffered_data *in);
+
 /* domid */
 void do_get_domain_path(struct connection *conn, const char *domid_str);
 
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xs.c
--- a/tools/xenstore/xs.c       Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xs.c       Wed Jan 23 13:22:13 2008 +0000
@@ -708,6 +708,25 @@ bool xs_introduce_domain(struct xs_handl
                                ARRAY_SIZE(iov), NULL));
 }
 
+bool xs_set_target(struct xs_handle *h,
+                        unsigned int domid, unsigned int target)
+{
+       char domid_str[MAX_STRLEN(domid)];
+       char target_str[MAX_STRLEN(target)];
+       struct iovec iov[2];
+
+       snprintf(domid_str, sizeof(domid_str), "%u", domid);
+       snprintf(target_str, sizeof(target_str), "%u", target);
+
+       iov[0].iov_base = domid_str;
+       iov[0].iov_len = strlen(domid_str) + 1;
+       iov[1].iov_base = target_str;
+       iov[1].iov_len = strlen(target_str) + 1;
+
+       return xs_bool(xs_talkv(h, XBT_NULL, XS_SET_TARGET, iov,
+                               ARRAY_SIZE(iov), NULL));
+}
+
 static void * single_with_domid(struct xs_handle *h,
                                enum xsd_sockmsg_type type,
                                unsigned int domid)
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xs.h
--- a/tools/xenstore/xs.h       Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xs.h       Wed Jan 23 13:22:13 2008 +0000
@@ -132,6 +132,15 @@ bool xs_introduce_domain(struct xs_handl
                         unsigned int domid,
                         unsigned long mfn,
                          unsigned int eventchn); 
+
+/* Set the target of a domain
+ * This tells the store daemon that a domain is targetting another one, so
+ * it should let it tinker with it.
+ */
+bool xs_set_target(struct xs_handle *h,
+                  unsigned int domid,
+                  unsigned int target);
+
 /* Resume a domain.
  * Clear the shutdown flag for this domain in the store.
  */
diff -r cff4c8a1aa28 -r 26fc953a89bb xen/include/public/io/xs_wire.h
--- a/xen/include/public/io/xs_wire.h   Wed Jan 23 13:21:44 2008 +0000
+++ b/xen/include/public/io/xs_wire.h   Wed Jan 23 13:22:13 2008 +0000
@@ -46,7 +46,8 @@ enum xsd_sockmsg_type
     XS_WATCH_EVENT,
     XS_ERROR,
     XS_IS_DOMAIN_INTRODUCED,
-    XS_RESUME
+    XS_RESUME,
+    XS_SET_TARGET
 };
 
 #define XS_WRITE_NONE "NONE"

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] New XS_SET_TARGET, Xen patchbot-unstable <=