diff options
author | Damien Zammit <damien@zamaudio.com> | 2020-07-25 11:18:47 +1000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-07-25 13:14:55 +0200 |
commit | 94779df38295bcd1b07795970685e0e5e2ce2a81 (patch) | |
tree | e82e3ffe97065eacf4d2b32587d2e028ca0c0bbd /rumpdisk/block-rump.c | |
parent | 06906d97984e6de0567b652e108cc4d8d764e561 (diff) | |
download | hurd-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.c | 39 |
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; |