diff -dur orig2/hurd-20111206/libdiskfs/disk-pager.c orig/hurd-20111106/libdiskfs/disk-pager.c
--- orig2/hurd-20111206/libdiskfs/disk-pager.c	2011-12-28 21:18:48.000000000 +0000
+++ orig/hurd-20111106/libdiskfs/disk-pager.c	2011-12-28 20:40:51.000000000 +0000
@@ -59,7 +59,7 @@
 
   /* Create the pager.  */
   diskfs_disk_pager = pager_create (upi, pager_bucket,
-				    may_cache, MEMORY_OBJECT_COPY_NONE,
+				    may_cache, /*MEMORY_OBJECT_COPY_NONE*/ 4,
 				    notify_on_evict);
   assert (diskfs_disk_pager);
 
diff -dur orig2/hurd-20111206/libpager/data-unlock.c orig/hurd-20111106/libpager/data-unlock.c
--- orig2/hurd-20111206/libpager/data-unlock.c	2011-12-06 00:44:58.000000000 +0000
+++ orig/hurd-20111106/libpager/data-unlock.c	2011-12-28 20:44:53.000000000 +0000
@@ -41,6 +41,14 @@
   _pager_release_seqno (p, seqno);
   mutex_unlock (&p->interlock);
 
+  if (length == 4097)
+    {
+      printf("advisory_pageout\n");
+      fflush(stdout);
+      length = 4096;
+      pager_advisory_pageout(p);
+    }
+
   if (p->pager_state != NORMAL)
     {
       printf ("pager in wrong state for unlock\n");
diff -dur orig2/hurd-20111206/libpager/pager.h orig/hurd-20111106/libpager/pager.h
--- orig2/hurd-20111206/libpager/pager.h	2011-12-28 21:18:48.000000000 +0000
+++ orig/hurd-20111106/libpager/pager.h	2011-12-28 20:50:23.000000000 +0000
@@ -207,4 +207,7 @@
 void
 pager_dropweak (struct user_pager_info *p);
 
+void
+pager_advisory_pageout (struct pager *pager);
+
 #endif
diff -dur orig2/hurd-20111206/ext2fs/inode.c orig/hurd-20111106/ext2fs/inode.c
--- orig2/hurd-20111206/ext2fs/inode.c	2011-12-28 21:18:48.000000000 +0000
+++ orig/hurd-20111106/ext2fs/inode.c	2011-12-28 20:36:51.000000000 +0000
@@ -572,9 +572,11 @@
       node = *p++;
       if (!err)
 	{
-	  mutex_lock (&node->lock);
-	  err = (*fun)(node);
-	  mutex_unlock (&node->lock);
+	  if (mutex_try_lock (&node->lock))
+	    {
+	      err = (*fun)(node);
+	      mutex_unlock (&node->lock);
+	    } 
 	}
       diskfs_nrele (node);
     }
diff -dur orig2/hurd-20111206/ext2fs/pager.c orig/hurd-20111106/ext2fs/pager.c
--- orig2/hurd-20111206/ext2fs/pager.c	2011-12-28 21:18:48.000000000 +0000
+++ orig/hurd-20111106/ext2fs/pager.c	2011-12-28 20:39:55.000000000 +0000
@@ -1358,6 +1358,24 @@
   /* Do things on the the disk pager.  */
   sync_global (wait);
 }
+
+void
+pager_advisory_pageout(struct pager *this_pager)
+{
+  error_t sync_one (void *v_p)
+    {
+      struct pager *p = v_p;
+      if (p != diskfs_disk_pager)
+       pager_sync (p, p == this_pager ? 0 : 1);
+      return 0;
+    }
+
+  ports_bucket_iterate (pager_bucket, sync_one);
+  write_all_disknodes ();
+
+  /* Do things on the the disk pager.  */
+  sync_global (1);
+}
 
 static void
 disable_caching ()
diff -dur orig2/hurd-20111206/console/pager.c hurd-20111106/console/pager.c
--- orig2/hurd-20111206/console/pager.c	2011-12-28 21:18:48.000000000 +0000
+++ hurd-20111106/console/pager.c	2011-12-29 22:21:08.000000000 +0000
@@ -119,6 +119,10 @@
 {
 }
 
+void
+pager_advisory_pageout(struct pager *this_pager)
+{
+}
 
 /* A top-level function for the paging thread that just services paging
    requests.  */
diff -dur orig2/hurd-20111206/fatfs/pager.c hurd-20111106/fatfs/pager.c
--- orig2/hurd-20111206/fatfs/pager.c	2011-12-28 21:18:48.000000000 +0000
+++ hurd-20111106/fatfs/pager.c	2011-12-29 22:16:44.000000000 +0000
@@ -1027,3 +1027,19 @@
 
   return max_prot;
 }
+
+void
+pager_advisory_pageout(struct pager *this_pager)
+{
+  error_t sync_one (void *v_p)
+    {
+      struct pager *p = v_p;
+      if (p != diskfs_disk_pager)
+        pager_sync (p, p == this_pager ? 0 : 1);
+      return 0;
+    }
+
+  ports_bucket_iterate (pager_bucket, sync_one);
+  write_all_disknodes ();
+  pager_sync (diskfs_disk_pager, 1);
+}
diff -dur orig2/hurd-20111206/isofs/pager.c hurd-20111106/isofs/pager.c
--- orig2/hurd-20111206/isofs/pager.c	2011-12-28 21:18:48.000000000 +0000
+++ hurd-20111106/isofs/pager.c	2011-12-29 22:15:18.000000000 +0000
@@ -358,3 +358,10 @@
 {
   /* ditto */
 }
+
+void
+pager_advisory_pageout(struct pager *this_pager)
+{
+  /* ditto */
+}
+
diff -dur orig2/hurd-20111206/storeio/pager.c hurd-20111106/storeio/pager.c
--- orig2/hurd-20111206/storeio/pager.c	2011-12-28 21:18:48.000000000 +0000
+++ hurd-20111106/storeio/pager.c	2011-12-29 22:18:56.000000000 +0000
@@ -177,6 +177,11 @@
 pager_dropweak (struct user_pager_info *upi __attribute__ ((unused)))
 {
 }
+
+void
+pager_advisory_pageout(struct pager *this_pager)
+{
+}
 
 /* Try to stop all paging activity on DEV, returning true if we were
    successful.  If NOSYNC is true, then we won't write back any (kernel)
diff -dur orig2/hurd-20111206/ufs/pager.c hurd-20111106/ufs/pager.c
--- orig2/hurd-20111206/ufs/pager.c	2011-12-28 21:18:48.000000000 +0000
+++ hurd-20111106/ufs/pager.c	2011-12-29 22:14:32.000000000 +0000
@@ -811,3 +811,21 @@
   ports_bucket_iterate (pager_bucket, sync_one);
   sync_disk (wait);
 }
+
+void
+pager_advisory_pageout(struct pager *this_pager)
+{
+  error_t sync_one (void *v_p)
+    {
+      struct pager *p = v_p;
+      if (p != diskfs_disk_pager)
+        pager_sync (p, p == this_pager ? 0 : 1);
+      return 0;
+    }
+
+  copy_sblock ();
+  write_all_disknodes ();
+  ports_bucket_iterate (pager_bucket, sync_one);
+  sync_disk (1);
+}
+
