X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=ef6e75d0718b179758827eacbc75542f8a7a584c;hb=e26a903ddf80011e3b72a780d7392a8333c996af;hp=3e92e4f2a7f75f508978081117f52fd3e88fc065;hpb=5b3aafc6c34c798f9ad74539f24c9b278e820163;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index 3e92e4f..ef6e75d 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -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);