>From 060c22d8fa2960ee53263669db1c6bcb2146fedd Mon Sep 17 00:00:00 2001 From: Maksym Planeta Date: Sun, 13 Nov 2011 23:04:13 +0200 Subject: [PATCH] Fix defpager and tmpfs to make reading/writing in tmpfs work. * hurd/default_pager.defs (default_pager_object_set_size): Remove unused parameter. * mach-defpager/default_pager.c: Make default pager use it's own memory object controll ports for external objects. * tmpfs/node.c (diskfs_get_filemap): Work with memory object only after vm_map has been performed. --- hurd/default_pager.defs | 1 - mach-defpager/default_pager.c | 10 +++++++--- tmpfs/node.c | 11 ++++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/hurd/default_pager.defs b/hurd/default_pager.defs index 7b1549a..8ad82dc 100644 --- a/hurd/default_pager.defs +++ b/hurd/default_pager.defs @@ -91,6 +91,5 @@ routine default_pager_paging_storage( will fail. */ routine default_pager_object_set_size( memory_object : mach_port_t; - sreplyport reply_port : mach_port_send_once_t; msgseqno seqno : mach_port_seqno_t; object_size_limit : vm_size_t); diff --git a/mach-defpager/default_pager.c b/mach-defpager/default_pager.c index 5944e4e..3771c3a 100644 --- a/mach-defpager/default_pager.c +++ b/mach-defpager/default_pager.c @@ -2476,6 +2476,7 @@ seqnos_memory_object_terminate(pager, seqno, pager_request, pager_name) ds = pager_port_lookup(pager); if (ds == DEFAULT_PAGER_NULL) panic(here, my_name); + ddprintf ("seqnos_memory_object_terminate <%p>: pager_port_lock: <%p>[s:%d,r:%d,w:%d,l:%d], %d\n", &kr, ds, ds->seqno, ds->readers, ds->writers, ds->lock.held, seqno); pager_port_lock(ds, seqno); @@ -2500,6 +2501,8 @@ ddprintf ("seqnos_memory_object_terminate <%p>: pager_port_lock: <%p>[s:%d,r:%d, pager_port_wait_for_refs(ds); + if (ds->external) + pager_request = ds->pager_request; ds->pager_request = MACH_PORT_NULL; request_refs = ds->request_refs; ds->request_refs = 0; @@ -2515,6 +2518,8 @@ ddprintf ("seqnos_memory_object_terminate <%p>: pager_port_unlock: <%p>[s:%d,r:% * Now we deallocate our various port rights. */ + kr = mach_port_get_refs(default_pager_self, pager_request, + MACH_PORT_RIGHT_SEND, &request_refs); kr = mach_port_mod_refs(default_pager_self, pager_request, MACH_PORT_RIGHT_SEND, -request_refs); if (kr != KERN_SUCCESS) @@ -3724,7 +3729,6 @@ S_default_pager_object_pages (mach_port_t pager, kern_return_t S_default_pager_object_set_size (mach_port_t pager, - mach_port_t reply_to, mach_port_seqno_t seqno, vm_size_t limit) { @@ -3736,7 +3740,7 @@ S_default_pager_object_set_size (mach_port_t pager, return KERN_INVALID_ARGUMENT; pager_port_lock(ds, seqno); - pager_port_check_request(ds, reply_to); + pager_port_check_request(ds, ds->pager_request); pager_port_wait_for_readers(ds); pager_port_wait_for_writers(ds); @@ -3760,7 +3764,7 @@ S_default_pager_object_set_size (mach_port_t pager, VM_PROT_ALL, ds->pager); if (kr != KERN_SUCCESS) panic ("memory_object_lock_request: %d", kr); - ds->lock_request = reply_to; + ds->lock_request = ds->pager_request; kr = MIG_NO_REPLY; } else diff --git a/tmpfs/node.c b/tmpfs/node.c index 17fe8ce..b2503a0 100644 --- a/tmpfs/node.c +++ b/tmpfs/node.c @@ -498,17 +498,18 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot) return MACH_PORT_NULL; } assert (np->dn->u.reg.memobj != MACH_PORT_NULL); - /* A new-fangled default pager lets us prevent user accesses - past the specified size of the file. */ - err = default_pager_object_set_size (np->dn->u.reg.memobj, - np->allocsize); - assert_perror (err); /* XXX we need to keep a reference to the object, or GNU Mach will terminate it when we release the map. */ vm_map (mach_task_self (), &np->dn->u.reg.memref, 4096, 0, 1, np->dn->u.reg.memobj, 0, 0, VM_PROT_NONE, VM_PROT_NONE, VM_INHERIT_NONE); + + /* A new-fangled default pager lets us prevent user accesses + past the specified size of the file. */ + err = default_pager_object_set_size (np->dn->u.reg.memobj, + np->allocsize); + assert_perror (err); } /* XXX always writable */ -- 1.7.2.3