diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2021-05-21 13:00:51 +0300 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-08-10 22:04:28 +0200 |
commit | 1ed64a8674d3359822831d4ac9a016c04d3e8b14 (patch) | |
tree | bd550fe8f670cc1c81ac322b0f1f3cec953b3194 | |
parent | 736c90333e887da5215e3c8a0bb489342b5fd23c (diff) | |
download | hurd-1ed64a8674d3359822831d4ac9a016c04d3e8b14.tar.gz hurd-1ed64a8674d3359822831d4ac9a016c04d3e8b14.tar.bz2 hurd-1ed64a8674d3359822831d4ac9a016c04d3e8b14.zip |
fatfs: Return read-only memory objects when appropriate
-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; } |