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

Reply via email to