bug-hurd
[Top][All Lists]
Advanced

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

[RFC PATCH tarfs 4/6] Implement basic support for writable mappings


From: Sergey Bugaev
Subject: [RFC PATCH tarfs 4/6] Implement basic support for writable mappings
Date: Thu, 29 Apr 2021 21:57:14 +0300

No mmap coherence is implemented yet.
---
 pager.c | 30 +++++++++++++++++++++++++++---
 tarfs.c |  2 +-
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/pager.c b/pager.c
index ecd564020..8756a2a4b 100644
--- a/pager.c
+++ b/pager.c
@@ -11,6 +11,9 @@
 #include "pager.h"
 #include "cache.h"
 #include "backend.h"
+#include "tarfs.h"
+
+extern struct tarfs_opts tarfs_options;
 
 error_t
 pager_read_page (struct user_pager_info *upi, vm_offset_t page,
@@ -39,7 +42,7 @@ pager_read_page (struct user_pager_info *upi, vm_offset_t 
page,
     }
 
   memset(data + actual, 0, vm_page_size - actual);
-  *writelock = 1;
+  *writelock = tarfs_options.readonly;
 
   return 0;
 }
@@ -49,14 +52,35 @@ pager_write_page (struct user_pager_info *upi,
                   vm_offset_t page,
                   vm_address_t buf)
 {
-  assert_backtrace (!"we only create read-only pages");
+  error_t err;
+  struct node *node;
+  size_t to_write, actual;
+
+  node = (struct node *) upi;
+
+  pthread_mutex_lock (&node->lock);
+
+  if (page + vm_page_size > node->nn_stat.st_size)
+    to_write = node->nn_stat.st_size - page;
+  else
+    to_write = vm_page_size;
+  err = cache_write (node, page, (void *) buf, to_write, &actual);
+
+  pthread_mutex_unlock (&node->lock);
+
+  if (!err && actual < vm_page_size)
+    err = EIO;
+
+  vm_deallocate (mach_task_self (), buf, vm_page_size);
+
+  return err;
 }
 
 error_t
 pager_unlock_page (struct user_pager_info *upi,
                    vm_offset_t address)
 {
-  return EROFS;
+  return tarfs_options.readonly ? EROFS : 0;
 }
 
 void
diff --git a/tarfs.c b/tarfs.c
index 2f5c53dad..3b9bcf590 100644
--- a/tarfs.c
+++ b/tarfs.c
@@ -1030,7 +1030,7 @@ tarfs_io_map (struct node *node, memory_object_t *rdobj, 
memory_object_t *wrobj)
   if (rdobj)
     *rdobj = obj;
   if (wrobj)
-    *wrobj = MACH_PORT_NULL;
+    *wrobj = tarfs_options.readonly ? MACH_PORT_NULL : obj;
 
   return 0;
 }
-- 
2.31.1




reply via email to

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