X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fcache.c;h=f11168ce42147f6f3e07359759b4bd735c7df1d9;hb=80b412586b3cf15eb5877be8d3e96eb757281b8a;hp=5f16ab0afc710afa059d2ad2d9ea77e56920ce0f;hpb=641411b0a7ce9afa309bea28c01320eda913b2d2;p=bluesky.git diff --git a/bluesky/cache.c b/bluesky/cache.c index 5f16ab0..f11168c 100644 --- a/bluesky/cache.c +++ b/bluesky/cache.c @@ -124,6 +124,11 @@ static void flushd_dirty_inode(BlueSkyInode *inode) { BlueSkyFS *fs = inode->fs; + g_mutex_lock(fs->lock); + bluesky_list_unlink(&fs->dirty_list, inode->dirty_list); + inode->dirty_list = NULL; + g_mutex_unlock(fs->lock); + /* Inode is clean; nothing to do. */ if (inode->change_count == inode->change_commit) return; @@ -184,9 +189,6 @@ static void flushd_dirty(BlueSkyFS *fs) bluesky_inode_ref(inode); - bluesky_list_unlink(&fs->dirty_list, fs->dirty_list.prev); - inode->dirty_list = NULL; - g_mutex_unlock(fs->lock); g_mutex_lock(inode->lock); @@ -230,13 +232,17 @@ static void flushd_clean(BlueSkyFS *fs) bluesky_inode_ref(inode); - bluesky_list_unlink(&fs->accessed_list, fs->accessed_list.prev); - inode->accessed_list = bluesky_list_prepend(&fs->accessed_list, inode); - g_mutex_unlock(fs->lock); g_mutex_lock(inode->lock); + + g_mutex_lock(fs->lock); + bluesky_list_unlink(&fs->accessed_list, inode->accessed_list); + inode->accessed_list = bluesky_list_prepend(&fs->accessed_list, inode); + g_mutex_unlock(fs->lock); + drop_caches(inode); + g_mutex_unlock(inode->lock); bluesky_inode_unref(inode);