Index: sys/arch/amiga/amiga/cc.c
===================================================================
RCS file: /cvsroot/src/sys/arch/amiga/amiga/cc.c,v
retrieving revision 1.24
diff -u -r1.24 cc.c
--- sys/arch/amiga/amiga/cc.c   27 Nov 2013 17:24:43 -0000      1.24
+++ sys/arch/amiga/amiga/cc.c   31 Dec 2013 12:59:21 -0000
@@ -513,7 +513,7 @@
                * for a new node in between.
                */
               TAILQ_REMOVE(&free_list, mn, free_link);
-               TAILQ_NEXT(mn, free_link) = NULL;
+               mn->type = MNODE_USED;
               size = mn->size;         /* increase size. (or same) */
               chip_total -= mn->size;
               splx(s);
@@ -533,7 +533,7 @@
        * and mark as not on free list
        */
       TAILQ_INSERT_AFTER(&chip_list, new, mn, link);
-       TAILQ_NEXT(mn, free_link) = NULL;
+       mn->type = MNODE_USED;

       chip_total -= size + sizeof(struct mem_node);
       splx(s);
@@ -557,52 +557,53 @@
       /*
        * check ahead of us.
        */
-       if (TAILQ_NEXT(next, link) != NULL &&
-           TAILQ_NEXT(next, free_link) != NULL) {
+       if (next->type == MNODE_FREE) {
               /*
                * if next is: a valid node and a free node. ==> merge
                */
               TAILQ_INSERT_BEFORE(next, mn, free_link);
+               mn->type = MNODE_FREE;
               TAILQ_REMOVE(&chip_list, next, link);
-               TAILQ_REMOVE(&chip_list, next, free_link);
+               TAILQ_REMOVE(&free_list, next, free_link);
               chip_total += mn->size + sizeof(struct mem_node);
               mn->size += next->size + sizeof(struct mem_node);
       }
-       if (TAILQ_PREV(prev, chiplist, link) != NULL &&
-           TAILQ_PREV(prev, freelist, free_link) != NULL) {
+       if (prev->type == MNODE_FREE) {
               /*
                * if prev is: a valid node and a free node. ==> merge
                */
-               if (TAILQ_NEXT(mn, free_link) == NULL)
+               if (mn->type != MNODE_FREE)
                       chip_total += mn->size + sizeof(struct mem_node);
               else {
                       /* already on free list */
                       TAILQ_REMOVE(&free_list, mn, free_link);
+                       mn->type = MNODE_USED;
                       chip_total += sizeof(struct mem_node);
               }
               TAILQ_REMOVE(&chip_list, mn, link);
               prev->size += mn->size + sizeof(struct mem_node);
-       } else if (TAILQ_NEXT(mn, free_link) == NULL) {
+       } else if (mn->type != MNODE_FREE) {
               /*
                * we still are not on free list and we need to be.
                * <-- | -->
                */
-               while (TAILQ_NEXT(next, link) != NULL &&
-                   TAILQ_PREV(prev, chiplist, link) != NULL) {
-                       if (TAILQ_NEXT(next, free_link) != NULL) {
+               while (next != NULL && prev != NULL) {
+                       if (next->type == MNODE_FREE) {
                               TAILQ_INSERT_BEFORE(next, mn, free_link);
+                               mn->type = MNODE_FREE;
                               break;
                       }
-                       if (TAILQ_NEXT(prev, free_link) != NULL) {
+                       if (prev->type == MNODE_FREE) {
                               TAILQ_INSERT_AFTER(&free_list, prev, mn,
                                   free_link);
+                               mn->type = MNODE_FREE;
                               break;
                       }
                       prev = TAILQ_PREV(prev, chiplist, link);
                       next = TAILQ_NEXT(next, link);
               }
-               if (TAILQ_NEXT(mn, free_link) == NULL) {
-                       if (TAILQ_NEXT(next, link) == NULL) {
+               if (mn->type != MNODE_FREE) {
+                       if (next == NULL) {
                               /*
                                * we are not on list so we can add
                                * ourselves to the tail. (we walked to it.)
@@ -611,6 +612,7 @@
                       } else {
                               TAILQ_INSERT_HEAD(&free_list,mn,free_link);
                       }
+                       mn->type = MNODE_FREE;
               }
               chip_total += mn->size; /* add our helpings to the pool. */
       }
Index: sys/arch/amiga/amiga/cc.h
===================================================================
RCS file: /cvsroot/src/sys/arch/amiga/amiga/cc.h,v
retrieving revision 1.17
diff -u -r1.17 cc.h
--- sys/arch/amiga/amiga/cc.h   23 Nov 2013 22:48:00 -0000      1.17
+++ sys/arch/amiga/amiga/cc.h   31 Dec 2013 12:59:21 -0000
@@ -160,7 +160,10 @@
       TAILQ_ENTRY(mem_node) link;
       TAILQ_ENTRY(mem_node) free_link;
       u_long size;            /* size of memory following node. */
+       u_char type;            /* free, used */
};
+#define MNODE_FREE 0
+#define MNODE_USED 1

#define CM_BLOCKSIZE 0x4
#define CM_BLOCKMASK (~(CM_BLOCKSIZE - 1))