[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 26/29] tools/xenstored: mount 9pfs device in stubdom



Mount the 9pfs device in stubdom enabling it to use files.

This has to happen in a worker thread in order to allow the main thread
handling the required Xenstore accesses in parallel.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Jason Andryuk <jandryuk@xxxxxxxxx>
---
 tools/xenstored/core.h   |  4 ++++
 tools/xenstored/domain.c |  2 ++
 tools/xenstored/minios.c | 36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 42 insertions(+)

diff --git a/tools/xenstored/core.h b/tools/xenstored/core.h
index 3c28007d11..a0d3592961 100644
--- a/tools/xenstored/core.h
+++ b/tools/xenstored/core.h
@@ -389,6 +389,10 @@ static inline bool domain_is_unprivileged(const struct 
connection *conn)
 evtchn_port_t get_xenbus_evtchn(void);
 void early_init(void);
 
+#ifdef __MINIOS__
+void mount_9pfs(void);
+#endif
+
 /* Write out the pidfile */
 void write_pidfile(const char *pidfile);
 
diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c
index 162b87b460..4263c1360f 100644
--- a/tools/xenstored/domain.c
+++ b/tools/xenstored/domain.c
@@ -1236,6 +1236,8 @@ void stubdom_init(void)
                barf_perror("Failed to initialize stubdom");
 
        xenevtchn_notify(xce_handle, stubdom->port);
+
+       mount_9pfs();
 #endif
 }
 
diff --git a/tools/xenstored/minios.c b/tools/xenstored/minios.c
index 202d70387a..fddbede869 100644
--- a/tools/xenstored/minios.c
+++ b/tools/xenstored/minios.c
@@ -19,8 +19,16 @@
 #include <sys/mman.h>
 #include "core.h"
 #include <xen/grant_table.h>
+#include <mini-os/9pfront.h>
 #include <mini-os/events.h>
 #include <mini-os/gnttab.h>
+#include <mini-os/sched.h>
+#include <mini-os/xenbus.h>
+#include <mini-os/xmalloc.h>
+
+#define P9_STATE_PATH  "device/9pfs/0/state"
+
+static void *p9_device;
 
 void write_pidfile(const char *pidfile)
 {
@@ -62,3 +70,31 @@ void early_init(void)
        if (stub_domid == DOMID_INVALID)
                barf("could not get own domid");
 }
+
+static void mount_thread(void *p)
+{
+       xenbus_event_queue events = NULL;
+       char *err;
+       char *dummy;
+
+       free(xenbus_watch_path_token(XBT_NIL, P9_STATE_PATH, "9pfs", &events));
+
+       for (;;) {
+               xenbus_wait_for_watch(&events);
+               err = xenbus_read(XBT_NIL, P9_STATE_PATH, &dummy);
+               if (!err)
+                       break;
+               free(err);
+       }
+
+       free(dummy);
+
+       free(xenbus_unwatch_path_token(XBT_NIL, P9_STATE_PATH, "9pfs"));
+
+       p9_device = init_9pfront(0, XENSTORE_LIB_DIR);
+}
+
+void mount_9pfs(void)
+{
+       create_thread("mount-9pfs", mount_thread, NULL);
+}
-- 
2.35.3




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.