Index: kernel/generic/include/mm/as.h
===================================================================
--- kernel/generic/include/mm/as.h	(revision 91507812516c0728a041c0c15107b417b5b927d3)
+++ kernel/generic/include/mm/as.h	(revision 0321109831bdc3ef68b98abcca525ea8d18e34a5)
@@ -229,4 +229,6 @@
 extern as_t *as_create(int);
 extern void as_destroy(as_t *);
+extern void as_hold(as_t *);
+extern void as_release(as_t *);
 extern void as_switch(as_t *, as_t *);
 extern int as_page_fault(uintptr_t, pf_access_t, istate_t *);
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision 91507812516c0728a041c0c15107b417b5b927d3)
+++ kernel/generic/src/mm/as.c	(revision 0321109831bdc3ef68b98abcca525ea8d18e34a5)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2001-2006 Jakub Jermar
+ * Copyright (c) 2010 Jakub Jermar
  * All rights reserved.
  *
@@ -258,4 +258,29 @@
 
 	slab_free(as_slab, as);
+}
+
+/** Hold a reference to an address space.
+ *
+ * Holding a reference to an address space prevents destruction of that address
+ * space.
+ *
+ * @param a		Address space to be held.
+ */
+void as_hold(as_t *as)
+{
+	atomic_inc(&as->refcount);
+}
+
+/** Release a reference to an address space.
+ *
+ * The last one to release a reference to an address space destroys the address
+ * space.
+ *
+ * @param a		Address space to be released.
+ */
+void as_release(as_t *as)
+{
+	if (atomic_predec(&as->refcount) == 0)
+		as_destroy(as);
 }
 
