Hello.

I've got some results with defpager:

$ settrans -ca foo tmpfs/tmpfs 1M
$ echo baz > foo/bar
$ cat foo/bar 
baz
$ settrans -g foo

The patch I wrote is in attachment, but I'm not sure if the way I was
fixing defpager and tmpfs is right. So I'm looking forward for your
critique.

-- 
Thanks,

Maksym Planeta
>From 060c22d8fa2960ee53263669db1c6bcb2146fedd Mon Sep 17 00:00:00 2001
From: Maksym Planeta <mcsim.plan...@gmail.com>
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

Reply via email to