aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2021-05-21 13:00:51 +0300
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-08-10 22:04:28 +0200
commit1ed64a8674d3359822831d4ac9a016c04d3e8b14 (patch)
treebd550fe8f670cc1c81ac322b0f1f3cec953b3194
parent736c90333e887da5215e3c8a0bb489342b5fd23c (diff)
downloadhurd-1ed64a8674d3359822831d4ac9a016c04d3e8b14.tar.gz
hurd-1ed64a8674d3359822831d4ac9a016c04d3e8b14.tar.bz2
hurd-1ed64a8674d3359822831d4ac9a016c04d3e8b14.zip
fatfs: Return read-only memory objects when appropriate
-rw-r--r--fatfs/pager.c19
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;
}