[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
- [RFC PATCH tarfs 0/6] mmap support for tarfs, Sergey Bugaev, 2021/04/29
- [RFC PATCH tarfs 2/6] Link to libpager and initialize it on startup, Sergey Bugaev, 2021/04/29
- [RFC PATCH tarfs 4/6] Implement basic support for writable mappings,
Sergey Bugaev <=
- [RFC PATCH tarfs 5/6] Attempt to implement mmap coherence, Sergey Bugaev, 2021/04/29
- [RFC PATCH tarfs 3/6] Implement basic read-only mmap support, Sergey Bugaev, 2021/04/29
- [RFC PATCH tarfs 6/6] Update TODO and BUGS, Sergey Bugaev, 2021/04/29
- [RFC PATCH tarfs 1/6] Plumb io_map () through the backend layer, Sergey Bugaev, 2021/04/29