Add LRU lists for tracking inodes that are dirty/accessed.
[bluesky.git] / bluesky / inode.c
index 3e92e4f..ef6e75d 100644 (file)
@@ -44,6 +44,13 @@ void bluesky_inode_update_ctime(BlueSkyInode *inode, gboolean update_mtime)
 
     if (bluesky_options.writethrough_cache)
         bluesky_file_flush(inode, NULL);
+
+    g_mutex_lock(inode->fs->lock);
+    bluesky_list_unlink(&inode->fs->dirty_list, inode->dirty_list);
+    inode->dirty_list = bluesky_list_prepend(&inode->fs->dirty_list, inode);
+    bluesky_list_unlink(&inode->fs->accessed_list, inode->accessed_list);
+    inode->accessed_list = bluesky_list_prepend(&inode->fs->accessed_list, inode);
+    g_mutex_unlock(inode->fs->lock);
 }
 
 /* Unfortunately a glib hash table is only guaranteed to be able to store
@@ -104,6 +111,7 @@ BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store)
     root->nlink = 1;
     root->mode = 0755;
     bluesky_insert_inode(fs, root);
+    bluesky_inode_update_ctime(root, TRUE);
 
     bluesky_inode_flush(fs, root);
     bluesky_superblock_flush(fs);
@@ -124,10 +132,16 @@ void bluesky_inode_unref(BlueSkyInode *inode)
                 inode->inum);
 
         /* Sanity check: Is the inode clean? */
-        if (inode->change_commit < inode->change_count) {
-            g_warning("Dropping inode which is not clean (commit %"PRIi64" < change %"PRIi64")\n", inode->change_commit, inode->change_count);
+        if (inode->change_commit < inode->change_count
+                || inode->dirty_list != NULL) {
+            g_warning("Dropping inode which is not clean (commit %"PRIi64" < change %"PRIi64"; dirty_list = %p)\n", inode->change_commit, inode->change_count, inode->dirty_list);
         }
 
+        g_mutex_lock(inode->fs->lock);
+        bluesky_list_unlink(&inode->fs->accessed_list, inode->accessed_list);
+        bluesky_list_unlink(&inode->fs->dirty_list, inode->dirty_list);
+        g_mutex_unlock(inode->fs->lock);
+
         /* Free file type specific data.  It should be an error for there to be
          * dirty data to commit when the reference count has reaches zero. */
         switch (inode->type) {
@@ -328,6 +342,9 @@ static void complete_inode_fetch(BlueSkyStoreAsync *async, BlueSkyInode *inode)
     }
 
     inode->access_time = bluesky_get_current_time();
+    g_mutex_lock(inode->fs->lock);
+    inode->accessed_list = bluesky_list_prepend(&inode->fs->accessed_list, inode);
+    g_mutex_unlock(inode->fs->lock);
 
     g_mutex_unlock(inode->lock);
     bluesky_inode_unref(inode);