bug-hurd
[Top][All Lists]
Advanced

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

[PATCH 5/5] rumpdisk: Use bootstrap resume of fs task in machdev


From: Damien Zammit
Subject: [PATCH 5/5] rumpdisk: Use bootstrap resume of fs task in machdev
Date: Fri, 24 Jul 2020 23:20:39 +1000

---
 rumpdisk/block-rump.c | 38 +++++++++++++----
 rumpdisk/main.c       | 95 +++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 123 insertions(+), 10 deletions(-)

diff --git a/rumpdisk/block-rump.c b/rumpdisk/block-rump.c
index 42ace30d..94df9be8 100644
--- a/rumpdisk/block-rump.c
+++ b/rumpdisk/block-rump.c
@@ -25,8 +25,6 @@
 #include <unistd.h>
 #include <sys/mman.h>
 
-#include "mach_U.h"
-
 #include <mach.h>
 #include <hurd.h>
 #include <hurd/ports.h>
@@ -34,8 +32,6 @@
 #define MACH_INCLUDE
 
 #include "libmachdev/machdev.h"
-#include "device_reply_U.h"
-
 #include <rump/rump.h>
 #include <rump/rump_syscalls.h>
 #include <rump/rumperrno2host.h>
@@ -45,6 +41,7 @@
 #define DIOCGSECTORSIZE _IOR('d', 133, unsigned int)
 
 #define DISK_NAME_LEN 32
+#define MAX_DISK_DEV 2
 
 /* One of these is associated with each open instance of a device.  */
 struct block_data
@@ -92,6 +89,29 @@ translate_name (char *output, int len, char *name)
   snprintf (output, len, "%sd", name);
 }
 
+static int
+is_disk_device (char *name, int len)
+{
+  char *dev;
+  const char *allowed_devs[MAX_DISK_DEV] = {
+    "/dev/wd",
+    "/dev/cd"
+  };
+  uint8_t i;
+
+  if (len < 8)
+    return 0;
+
+  for (i = 0; i < MAX_DISK_DEV; i++)
+    {
+      dev = (char *)allowed_devs[i];
+      /* /dev/XXN but we only care about /dev/XX prefix */
+      if (! strncmp(dev, name, 7))
+        return 1;
+    }
+  return 0;
+}
+
 static int
 dev_mode_to_rump_mode (const dev_mode_t mode)
 {
@@ -136,11 +156,15 @@ device_open (mach_port_t reply_port, mach_msg_type_name_t 
reply_port_type,
             dev_mode_t mode, char *name, device_t * devp,
             mach_msg_type_name_t * devicePoly)
 {
-  io_return_t err = D_SUCCESS;
+  io_return_t err = D_ALREADY_OPEN;
   struct block_data *bd = NULL;
   char dev_name[DISK_NAME_LEN];
   off_t media_size;
   uint32_t block_size;
+  uint8_t namelen = (strlen(name) > 8) ? 8 : strlen(name);
+
+  if (! is_disk_device(name, namelen))
+    return D_NO_SUCH_DEVICE;
 
   translate_name (dev_name, DISK_NAME_LEN, name);
 
@@ -167,7 +191,7 @@ device_open (mach_port_t reply_port, mach_msg_type_name_t 
reply_port_type,
       if (err < 0)
        {
          mach_print ("DIOCGMEDIASIZE ioctl fails\n");
-         err = D_NO_SUCH_DEVICE;
+         err = rump_errno2host (errno);
          goto out;
        }
 
@@ -175,7 +199,7 @@ device_open (mach_port_t reply_port, mach_msg_type_name_t 
reply_port_type,
       if (err < 0)
        {
          mach_print ("DIOCGSECTORSIZE ioctl fails\n");
-         err = D_NO_SUCH_DEVICE;
+         err = rump_errno2host (errno);
          goto out;
        }
       bd->media_size = media_size;
diff --git a/rumpdisk/main.c b/rumpdisk/main.c
index 0181f685..27a8ea38 100644
--- a/rumpdisk/main.c
+++ b/rumpdisk/main.c
@@ -16,24 +16,113 @@
  * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <stdarg.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <error.h>
+#include <argp.h>
+#include <version.h>
+
 #include "libmachdev/machdev.h"
 #include "block-rump.h"
 #include <pthread.h>
 #include <mach.h>
 
+/* TODO: Add api to pciaccess to allow selecting backend.
+ * For now we pretend to be the arbiter and claim x86 method.
+ */
+char *netfs_server_name = "pci-arbiter";
+
+mach_port_t bootstrap_resume_task = MACH_PORT_NULL;
+
+static const struct argp_option options[] = {
+  {"host-priv-port",   'h', "PORT", 0, "Host private port PORT"},
+  {"device-master-port",'d', "PORT", 0, "Device master port PORT"},
+  {"filesystem-task",  'f', "TASK", 0, "Filesystem task TASK"},
+  {0}
+};
+
+
+/* Parse a command line option.  */
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+  /* We save our parsed values in this structure, hung off STATE->hook.
+     Only after parsing all options successfully will we use these values.  */
+  struct
+  {
+    int host_priv;
+    int dev_master;
+    int fs_task;
+  } *values = state->hook;
+
+  switch (key)
+    {
+    case 'h':
+      values->host_priv = atoi(arg);
+      break;
+    case 'd':
+      values->dev_master = atoi(arg);
+      break;
+    case 'f':
+      values->fs_task = atoi(arg);
+      break;
+
+    case ARGP_KEY_INIT:
+      state->child_inputs[0] = state->input;
+      values = malloc (sizeof *values);
+      if (values == 0)
+        return ENOMEM;
+      state->hook = values;
+      memset (values, 0, sizeof *values);
+      break;
+
+    case ARGP_KEY_SUCCESS:
+      /* All options parsed successfully */
+      _hurd_host_priv = values->host_priv;
+      _hurd_device_master = values->dev_master;
+      bootstrap_resume_task = values->fs_task;
+      break;
+
+    default:
+      return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+static struct argp_child empty_argp_children[] = {{0}};
+static struct argp rumpdisk_argp = {options, parse_opt, 0, 0, 
empty_argp_children};
+static const struct argp *rumpdisk_argp_bootup = &rumpdisk_argp;
+
 int
-main ()
+main (int argc, char **argv)
 {
+  mach_port_t bootstrap = MACH_PORT_NULL;
   int err;
   pthread_t t;
 
+  setenv ("RUMP_NCPU", "1", 1);
+  setenv ("RUMP_VERBOSE", "1", 1);
+  setenv ("RUMP_HOSTNAME", "HURD0", 1);
+  setenv ("HOSTNAME", "HURD0", 1);
+  setenv ("RUMP_PANIC", "1", 1);
+
+  err = argp_parse (rumpdisk_argp_bootup, argc, argv, 0, 0, NULL);
+  if (err)
+    {
+      error(1, err, "Missing parameters for bootstrap");
+    }
+
   rump_register_block ();
   machdev_device_init ();
-  machdev_trivfs_init ();
+  machdev_trivfs_init (bootstrap_resume_task, "fs", &bootstrap);
   err = pthread_create (&t, NULL, machdev_server, NULL);
   if (err)
     return err;
   pthread_detach (t);
-  machdev_trivfs_server ();
+  machdev_trivfs_server (bootstrap);
   return 0;
 }
-- 
2.25.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]