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
bluesky_fs_key_equal_func);
fs->next_inum = BLUESKY_ROOT_INUM + 1;
fs->store = bluesky_store_new("file");
+ fs->flushd_lock = g_mutex_new();
return fs;
}
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);
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->accessed_list != NULL
+ || inode->dirty_list != NULL) {
+ g_warning("Dropping inode which is not clean (commit %"PRIi64" < change %"PRIi64"; accessed_list = %p; dirty_list = %p)\n", inode->change_commit, inode->change_count, inode->accessed_list, inode->dirty_list);
}
+ /* These shouldn't be needed, but in case the above warning fires and
+ * we delete the inode anyway, we ought to be sure the inode is not on
+ * any LRU 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) {
}
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);