Index: generic/src/mm/slab.c
===================================================================
--- generic/src/mm/slab.c	(revision 3260ada0a610265704b488bdaf4d54effd91d7d6)
+++ generic/src/mm/slab.c	(revision e72b0a30a14e868957bf9f86c100110b82876f03)
@@ -235,4 +235,5 @@
 
 	ASSERT(slab->cache == cache);
+	ASSERT(slab->available < cache->objects);
 
 	spinlock_lock(&cache->slablock);
@@ -243,9 +244,4 @@
 
 	/* Move it to correct list */
-	if (slab->available == 1) {
-		/* It was in full, move to partial */
-		list_remove(&slab->link);
-		list_prepend(&slab->link, &cache->partial_slabs);
-	}
 	if (slab->available == cache->objects) {
 		/* Free associated memory */
@@ -255,4 +251,8 @@
 		 * keep all locks */
 		frames = slab_space_free(cache, slab);
+	} else if (slab->available == 1) {
+		/* It was in full, move to partial */
+		list_remove(&slab->link);
+		list_prepend(&slab->link, &cache->partial_slabs);
 	}
 
@@ -283,7 +283,7 @@
 		spinlock_unlock(&cache->slablock);
 		slab = slab_space_alloc(cache, flags);
+		if (!slab)
+			return NULL;
 		spinlock_lock(&cache->slablock);
-		if (!slab)
-			goto err;
 	} else {
 		slab = list_get_instance(cache->partial_slabs.next,
@@ -302,7 +302,4 @@
 	spinlock_unlock(&cache->slablock);
 	return obj;
-err:
-	spinlock_unlock(&cache->slablock);
-	return NULL;
 }
 
Index: test/mm/slab2/test.c
===================================================================
--- test/mm/slab2/test.c	(revision 3260ada0a610265704b488bdaf4d54effd91d7d6)
+++ test/mm/slab2/test.c	(revision e72b0a30a14e868957bf9f86c100110b82876f03)
@@ -200,4 +200,5 @@
 	multitest(128);
 	multitest(2048);
+	multitest(8192);
 	printf("All done.\n");
 }
