diff options
-rw-r--r-- | ext2fs/pager.c | 6 | ||||
-rw-r--r-- | fatfs/pager.c | 6 | ||||
-rw-r--r-- | libdiskfs/node-drop.c | 1 | ||||
-rw-r--r-- | libpager/object-terminate.c | 5 | ||||
-rw-r--r-- | libpager/pager-create.c | 1 | ||||
-rw-r--r-- | libpager/pager-ro-port.c | 35 | ||||
-rw-r--r-- | libpager/pager.h | 3 | ||||
-rw-r--r-- | libpager/priv.h | 2 | ||||
-rw-r--r-- | tmpfs/node.c | 16 |
9 files changed, 22 insertions, 53 deletions
diff --git a/ext2fs/pager.c b/ext2fs/pager.c index 105dc93d..baf2d4b7 100644 --- a/ext2fs/pager.c +++ b/ext2fs/pager.c @@ -1338,11 +1338,7 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot) 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); - } + right = pager_create_ro_port (pager); ports_port_deref (pager); diff --git a/fatfs/pager.c b/fatfs/pager.c index d60c2eca..9a8b8d6c 100644 --- a/fatfs/pager.c +++ b/fatfs/pager.c @@ -861,11 +861,7 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot) 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); - } + right = pager_create_ro_port (pager); ports_port_deref (pager); diff --git a/libdiskfs/node-drop.c b/libdiskfs/node-drop.c index aa00cf05..6a8ebd6d 100644 --- a/libdiskfs/node-drop.c +++ b/libdiskfs/node-drop.c @@ -41,6 +41,7 @@ diskfs_drop_node (struct node *np) if (np->dn_stat.st_nlink == 0) { diskfs_check_readonly (); + // Pb when remounted readonly :/ assert_backtrace (!diskfs_readonly); if (np->dn_stat.st_mode & S_IPTRANS) diff --git a/libpager/object-terminate.c b/libpager/object-terminate.c index 8e8205b5..3e7df167 100644 --- a/libpager/object-terminate.c +++ b/libpager/object-terminate.c @@ -115,11 +115,6 @@ _pager_free_structure (struct pager *p) mach_port_deallocate (mach_task_self (), p->memobjname); p->memobjname = MACH_PORT_NULL; } - if (p->ro_proxy != MACH_PORT_NULL) - { - mach_port_deallocate (mach_task_self (), p->ro_proxy); - p->ro_proxy = MACH_PORT_NULL; - } /* Free the pagemap */ if (p->pagemapsize) diff --git a/libpager/pager-create.c b/libpager/pager-create.c index 9c3fba99..7f2f7d6e 100644 --- a/libpager/pager-create.c +++ b/libpager/pager-create.c @@ -42,7 +42,6 @@ _pager_create (size_t size, p->notify_on_evict = notify_on_evict; p->memobjcntl = MACH_PORT_NULL; p->memobjname = MACH_PORT_NULL; - p->ro_proxy = MACH_PORT_NULL; p->noterm = 0; p->termwaiting = 0; p->pagemap = 0; diff --git a/libpager/pager-ro-port.c b/libpager/pager-ro-port.c index 713b0423..7772ba30 100644 --- a/libpager/pager-ro-port.c +++ b/libpager/pager-ro-port.c @@ -20,7 +20,7 @@ #include <mach/mach4.h> mach_port_t -pager_get_ro_port (struct pager *p) +pager_create_ro_port (struct pager *p) { error_t err = 0;; mach_port_t port = MACH_PORT_NULL; @@ -29,33 +29,22 @@ pager_get_ro_port (struct pager *p) vm_offset_t start = 0; vm_size_t len = ~0; - pthread_mutex_lock (&p->interlock); - - if (!MACH_PORT_VALID (p->ro_proxy)) + rw_port = ports_get_send_right (p); + if (!MACH_PORT_VALID (rw_port)) { - rw_port = ports_get_send_right (p); - if (!MACH_PORT_VALID (rw_port)) - { - err = errno; - goto out; - } - - err = memory_object_create_proxy (mach_task_self (), - VM_PROT_READ | VM_PROT_EXECUTE, - &rw_port, 1, - &offset, 1, &start, 1, &len, 1, - &p->ro_proxy); - - mach_port_deallocate (mach_task_self (), rw_port); - - if (err) - goto out; + err = errno; + goto out; } - port = p->ro_proxy; + err = memory_object_create_proxy (mach_task_self (), + VM_PROT_READ | VM_PROT_EXECUTE, + &rw_port, 1, + &offset, 1, &start, 1, &len, 1, + &port); + + mach_port_deallocate (mach_task_self (), rw_port); out: - pthread_mutex_unlock (&p->interlock); errno = err; return port; } diff --git a/libpager/pager.h b/libpager/pager.h index 16b47def..3b1c7251 100644 --- a/libpager/pager.h +++ b/libpager/pager.h @@ -155,8 +155,9 @@ pager_change_attributes (struct pager *pager, mach_port_t pager_get_port (struct pager *pager); +/* Create a read-only proxy for requests to the pager. */ mach_port_t -pager_get_ro_port (struct pager *pager); +pager_create_ro_port (struct pager *pager); /* Force termination of a pager. After this returns, no more paging requests on the pager will be honored, and the diff --git a/libpager/priv.h b/libpager/priv.h index 0c38a7c0..89af52ba 100644 --- a/libpager/priv.h +++ b/libpager/priv.h @@ -55,8 +55,6 @@ struct pager memory_object_control_t memobjcntl; memory_object_name_t memobjname; - memory_object_t ro_proxy; - int noterm; /* number of threads blocking termination */ int termwaiting:1; diff --git a/tmpfs/node.c b/tmpfs/node.c index 1a73a164..ed04a8df 100644 --- a/tmpfs/node.c +++ b/tmpfs/node.c @@ -73,11 +73,9 @@ diskfs_free_node (struct node *np, mode_t mode) switch (np->dn->type) { case DT_REG: + if (np->dn->u.reg.memobj != MACH_PORT_NULL) { /* XXX GNU Mach will terminate the object, and thus existing mappings * will get SIGBUS. */ - if (np->dn->u.reg.ro_memobj != MACH_PORT_NULL) - mach_port_deallocate (mach_task_self (), np->dn->u.reg.ro_memobj); - if (np->dn->u.reg.memobj != MACH_PORT_NULL) { vm_deallocate (mach_task_self (), np->dn->u.reg.memref, 4096); mach_port_deallocate (mach_task_self (), np->dn->u.reg.memobj); } @@ -567,7 +565,7 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot) if (prot & VM_PROT_WRITE) right = np->dn->u.reg.memobj; - else if (np->dn->u.reg.ro_memobj == MACH_PORT_NULL) + else { vm_offset_t offset = 0; vm_offset_t start = 0; @@ -576,21 +574,17 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot) VM_PROT_READ | VM_PROT_EXECUTE, &np->dn->u.reg.memobj, 1, &offset, 1, &start, 1, &len, 1, - &np->dn->u.reg.ro_memobj); + &right); if (err) { errno = err; return MACH_PORT_NULL; } - - right = np->dn->u.reg.ro_memobj; } - else - right = np->dn->u.reg.ro_memobj; /* Add a reference for each call, the caller will deallocate it. */ - err = mach_port_mod_refs (mach_task_self (), right, - MACH_PORT_RIGHT_SEND, +1); + err = mach_port_mod_refs (mach_task_self (), np->dn->u.reg.memobj, + MACH_PORT_RIGHT_SEND, +1); assert_perror_backtrace (err); return right; |