Kernel/vfs - Fixing OpenInode support
[tpg/acess2.git] / Kernel / drv / iocache.c
index 271fc84..774c497 100644 (file)
@@ -3,6 +3,8 @@
  * - IO Cache
  * 
  * By thePowersGang (John Hodge)
+ * 
+ * TODO: Convert to use spare physical pages instead
  */
 #define DEBUG  0
 #include <acess.h>
@@ -10,6 +12,7 @@
 
 // === TYPES ===
 typedef struct sIOCache_Ent    tIOCache_Ent;
+typedef struct sIOCache_PageInfo       tIOCache_PageInfo;
 
 // === STRUCTURES ===
 struct sIOCache_Ent
@@ -21,6 +24,15 @@ struct sIOCache_Ent
        Uint8   Data[];
 };
 
+struct sIOCache_PageInfo
+{
+       tIOCache_PageInfo       *GlobalNext;
+       tIOCache_PageInfo       *CacheNext;
+       tIOCache        *Owner;
+       tPAddr  BasePhys;
+       Uint64  BaseOffset;
+};
+
 struct sIOCache
 {
        tIOCache        *Next;
@@ -38,6 +50,7 @@ struct sIOCache
 tShortSpinlock glIOCache_Caches;
 tIOCache       *gIOCache_Caches = NULL;
  int   giIOCache_NumCaches = 0;
+tIOCache_PageInfo      *gIOCache_GlobalPages;
 
 // === CODE ===
 /**
@@ -177,6 +190,10 @@ int IOCache_Add( tIOCache *Cache, Uint64 Sector, void *Buffer )
                                oldestPrev = prev;
                        }
                }
+               if( !oldest ) {
+                       Log_Error("IOCache", "Cache full, but also empty");
+                       return -1;
+               }
                // Remove from list, write back and free
                oldestPrev->Next = oldest->Next;
                if(oldest->LastWrite && Cache->Mode != IOCACHE_VIRTUAL)
@@ -305,14 +322,14 @@ void IOCache_Destroy( tIOCache *Cache )
        // Remove from list
        SHORTLOCK( &glIOCache_Caches );
        {
-               tIOCache        *ent;
-               tIOCache        *prev = (tIOCache*)&gIOCache_Caches;
-               for(ent = gIOCache_Caches;
-                       ent;
-                       prev = ent, ent = ent->Next )
+               tIOCache        *cache;
+               tIOCache        *prev_cache = (tIOCache*)&gIOCache_Caches;
+               for(cache = gIOCache_Caches;
+                       cache;
+                       prev_cache = cache, cache = cache->Next )
                {
-                       if(ent == Cache) {
-                               prev->Next = ent->Next;
+                       if(cache == Cache) {
+                               prev_cache->Next = cache->Next;
                                break;
                        }
                }

UCC git Repository :: git.ucc.asn.au