Hi, This patch adds ability to libstore to open a device node that is not a mach device. This is in preparation for rump kernel to provide disk access.
Tested as follows: demo@debian:~$ sudo settrans /dev/z0 /hurd/devnode hd2 demo@debian:~$ sudo settrans /dev/hd2 /hurd/storeio /dev/z0 demo@debian:~$ sudo showtrans /dev/hd2 /hurd/storeio /dev/z0 demo@debian:~$ sudo showtrans /dev/z0 /hurd/devnode hd2 demo@debian:~$ sudo fdisk /dev/hd2 Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/hd2: 10 MiB, 10485760 bytes, 20480 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000 Command (m for help): See attached for patch. Thanks, Damien
>From b24bbaad7227749286a3c081fc471e5da91cd59a Mon Sep 17 00:00:00 2001 From: Damien Zammit <dam...@zamaudio.com> Date: Sun, 23 Dec 2018 23:59:29 -0500 Subject: [PATCH] Prepare for rump disk access by making libstore take non-mach device --- libstore/device.c | 71 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/libstore/device.c b/libstore/device.c index b350bc7b..7d6eb20e 100644 --- a/libstore/device.c +++ b/libstore/device.c @@ -94,25 +94,66 @@ static error_t dopen (const char *name, device_t *device, int *mod_flags) { device_t dev_master; - error_t err = get_privileged_ports (0, &dev_master); - if (! err) + error_t err; + if (*mod_flags & STORE_HARD_READONLY) + { + dev_master = file_name_lookup (name, O_READ, 0); + if (dev_master != MACH_PORT_NULL) { - if (*mod_flags & STORE_HARD_READONLY) - err = device_open (dev_master, D_READ, (char *)name, device); + err = device_open (dev_master, D_READ, "disk", device); + if (! err) + mach_port_deallocate (mach_task_self (), dev_master); else - { - err = device_open (dev_master, D_WRITE | D_READ, (char *)name, device); - if (err == ED_READ_ONLY) - { - err = device_open (dev_master, D_READ, (char *)name, device); - if (! err) - *mod_flags |= STORE_HARD_READONLY; - } - else if (! err) - *mod_flags &= ~STORE_HARD_READONLY; - } + err = ENODEV; + } + else + err = ENODEV; + } + else + { + dev_master = file_name_lookup (name, O_READ | O_WRITE, 0); + if (dev_master != MACH_PORT_NULL) + { + err = device_open (dev_master, D_READ | D_WRITE, "disk", device); + if (err == ED_READ_ONLY) + { + err = device_open (dev_master, D_READ, "disk", device); + if (! err) + *mod_flags |= STORE_HARD_READONLY; + else + err = ENODEV; + } + else if (! err) + *mod_flags &= ~STORE_HARD_READONLY; + mach_port_deallocate (mach_task_self (), dev_master); } + else + err = ENODEV; + } + + if (err) + { + err = get_privileged_ports (0, &dev_master); + if (! err) + { + if (*mod_flags & STORE_HARD_READONLY) + err = device_open (dev_master, D_READ, (char *)name, device); + else + { + err = device_open (dev_master, D_WRITE | D_READ, (char *)name, device); + if (err == ED_READ_ONLY) + { + err = device_open (dev_master, D_READ, (char *)name, device); + if (! err) + *mod_flags |= STORE_HARD_READONLY; + } + else if (! err) + *mod_flags &= ~STORE_HARD_READONLY; + } + mach_port_deallocate (mach_task_self (), dev_master); + } + } return err; } -- 2.17.1