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