bug-hurd
[Top][All Lists]
Advanced

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

[PATCH] rumpdisk: Use rump_sys_pread/pwrite instead of lseek+r/w for ato


From: Damien Zammit
Subject: [PATCH] rumpdisk: Use rump_sys_pread/pwrite instead of lseek+r/w for atomic accesses
Date: Mon, 9 Nov 2020 18:09:06 +1100

TESTED by booting a QEMU passthrough disk via rumpdisk.static

---
 rumpdisk/block-rump.c | 21 ++++-----------------
 1 file changed, 4 insertions(+), 17 deletions(-)

diff --git a/rumpdisk/block-rump.c b/rumpdisk/block-rump.c
index e094a199..f7444260 100644
--- a/rumpdisk/block-rump.c
+++ b/rumpdisk/block-rump.c
@@ -248,18 +248,12 @@ device_write (void *d, mach_port_t reply_port,
              int *bytes_written)
 {
   struct block_data *bd = d;
-  int64_t written = 0;
+  ssize_t written;
 
   if ((bd->mode & D_WRITE) == 0)
     return D_INVALID_OPERATION;
 
-  if (rump_sys_lseek (bd->rump_fd, (off_t) bn * bd->block_size, SEEK_SET) < 0)
-    {
-      *bytes_written = 0;
-      return EIO;
-    }
-
-  written = rump_sys_write (bd->rump_fd, data, count);
+  written = rump_sys_pwrite (bd->rump_fd, (const void *)data, (size_t)count, 
(off_t)bn * bd->block_size);
   if (written < 0)
     {
       *bytes_written = 0;
@@ -282,7 +276,7 @@ device_read (void *d, mach_port_t reply_port,
   char *buf;
   int pagesize = sysconf (_SC_PAGE_SIZE);
   int npages = (count + pagesize - 1) / pagesize;
-  io_return_t err = D_SUCCESS;
+  ssize_t err;
 
   if ((bd->mode & D_READ) == 0)
     return D_INVALID_OPERATION;
@@ -296,13 +290,7 @@ device_read (void *d, mach_port_t reply_port,
   if (buf == MAP_FAILED)
     return errno;
 
-  if (rump_sys_lseek (bd->rump_fd, (off_t) bn * bd->block_size, SEEK_SET) < 0)
-    {
-      *bytes_read = 0;
-      return EIO;
-    }
-
-  err = rump_sys_read (bd->rump_fd, buf, count);
+  err = rump_sys_pread (bd->rump_fd, (void *)buf, (size_t)count, (off_t)bn * 
bd->block_size);
   if (err < 0)
     {
       *bytes_read = 0;
@@ -346,7 +334,6 @@ device_get_status (void *d, dev_flavor_t flavor, 
dev_status_t status,
 /* FIXME:
  * Short term strategy:
  *
- * Use rump_sys_pread/pwrite instead of rump_sys_lseek + rump_sys_read/write.
  * Make device_read/write multithreaded.
  *
  * Long term strategy:
-- 
2.28.0




reply via email to

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