projects
/
bluesky.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Try to clean up the locking for LRU lists.
[bluesky.git]
/
bluesky
/
cache.c
diff --git
a/bluesky/cache.c
b/bluesky/cache.c
index
5f16ab0
..
f11168c
100644
(file)
--- a/
bluesky/cache.c
+++ b/
bluesky/cache.c
@@
-124,6
+124,11
@@
static void flushd_dirty_inode(BlueSkyInode *inode)
{
BlueSkyFS *fs = inode->fs;
{
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;
/* 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_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);
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_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_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);
drop_caches(inode);
+
g_mutex_unlock(inode->lock);
bluesky_inode_unref(inode);
g_mutex_unlock(inode->lock);
bluesky_inode_unref(inode);