diff -ru sos-code-article7.5/drivers/zero.c shrdzero-sos-code-article7.5/drivers/zero.c
--- sos-code-article7.5/drivers/zero.c	2005-04-27 20:17:13.000000000 +0200
+++ shrdzero-sos-code-article7.5/drivers/zero.c	2005-06-05 22:48:47.000000000 +0200
@@ -109,7 +109,7 @@
   zero_resource
     = (struct zero_mapped_resource*)
     sos_umem_vmm_get_mapped_resource_of_vr(vr)->custom_data;
-  
+
   /* Decrement ref coutner */
   SOS_ASSERT_FATAL(zero_resource->ref_cnt > 0);
   zero_resource->ref_cnt --;
@@ -121,9 +121,8 @@
       struct zero_mapped_page *zmp;
       list_collapse(zero_resource->list_mapped_pages, zmp)
 	{
-	  /* No need to free the underlying physical pages, since they
-	     should have been unmapped just before this unref is
-	     called */
+	  /* Unreference the underlying physical page */
+	  sos_physmem_unref_physpage(zmp->ppage_paddr);
 	  sos_kfree((sos_vaddr_t)zmp);
 	}
 
@@ -169,6 +168,7 @@
 				  SOS_PAGE_ALIGN_INF(uaddr),
 				  TRUE,
 				  vr_prot);
+
 	  return retval;
 	}
     }
@@ -182,7 +182,7 @@
       ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
       if (! ppage_paddr)
 	return -SOS_ENOMEM;
-      
+
       retval = sos_paging_map(ppage_paddr,
 			      SOS_PAGE_ALIGN_INF(uaddr),
 			      TRUE,
@@ -286,6 +286,7 @@
   zmp->ppage_paddr = ppage_paddr;
 
   list_add_head(mr->list_mapped_pages, zmp);
+  sos_physmem_ref_physpage_at(ppage_paddr);
   return SOS_OK;
 }
 
