aboutsummaryrefslogtreecommitdiff
path: root/rumpdisk/block-rump.c
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2020-07-25 11:18:47 +1000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-07-25 13:14:55 +0200
commit94779df38295bcd1b07795970685e0e5e2ce2a81 (patch)
treee82e3ffe97065eacf4d2b32587d2e028ca0c0bbd /rumpdisk/block-rump.c
parent06906d97984e6de0567b652e108cc4d8d764e561 (diff)
downloadhurd-94779df38295bcd1b07795970685e0e5e2ce2a81.tar.gz
hurd-94779df38295bcd1b07795970685e0e5e2ce2a81.tar.bz2
hurd-94779df38295bcd1b07795970685e0e5e2ce2a81.zip
rumpdisk: Use bootstrap resume of fs task in machdev
Message-Id: <20200725011847.186969-4-damien@zamaudio.com>
Diffstat (limited to 'rumpdisk/block-rump.c')
-rw-r--r--rumpdisk/block-rump.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/rumpdisk/block-rump.c b/rumpdisk/block-rump.c
index 42ace30d..474852cd 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
@@ -89,7 +86,30 @@ search_bd (char *name)
static void
translate_name (char *output, int len, char *name)
{
- snprintf (output, len, "%sd", name);
+ snprintf (output, len - 1, "%sd", name);
+}
+
+static boolean_t
+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 FALSE;
+
+ 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 TRUE;
+ }
+ return FALSE;
}
static int
@@ -136,12 +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;
+ if (! is_disk_device (name, 8))
+ return D_NO_SUCH_DEVICE;
+
translate_name (dev_name, DISK_NAME_LEN, name);
/* Find previous device or open if new */
@@ -167,7 +190,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 +198,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;