diff options
-rw-r--r-- | fatfs/pager.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fatfs/pager.c b/fatfs/pager.c index c1da666f..d60c2eca 100644 --- a/fatfs/pager.c +++ b/fatfs/pager.c @@ -832,7 +832,7 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot) pager = diskfs_node_disknode (node)->pager; if (pager) { - right = pager_get_port (pager); + ports_port_ref (pager); pager_get_upi (pager)->max_prot |= prot; } else @@ -854,15 +854,22 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot) /* A weak reference for being part of the node. */ ports_port_ref_weak (pager); - - right = pager_get_port (pager); - ports_port_deref (pager); } pthread_spin_unlock (&node_to_page_lock); - mach_port_insert_right (mach_task_self (), right, right, - MACH_MSG_TYPE_MAKE_SEND); + if (prot & VM_PROT_WRITE) + right = ports_get_send_right (pager); + else + { + right = pager_get_ro_port (pager); + mach_port_mod_refs (mach_task_self (), right, + MACH_PORT_RIGHT_SEND, +1); + } + + ports_port_deref (pager); + + assert_backtrace (MACH_PORT_VALID (right)); return right; } |