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
/
file.c
diff --git
a/bluesky/file.c
b/bluesky/file.c
index
66f84e7
..
8be3ea1
100644
(file)
--- a/
bluesky/file.c
+++ b/
bluesky/file.c
@@
-44,6
+44,12
@@
void bluesky_block_touch(BlueSkyInode *inode, uint64_t i)
break;
}
break;
}
+ if (block->type != BLUESKY_BLOCK_CACHED
+ && block->type != BLUESKY_BLOCK_DIRTY)
+ g_atomic_int_add(&inode->fs->cache_total, 1);
+ if (block->type != BLUESKY_BLOCK_DIRTY)
+ g_atomic_int_add(&inode->fs->cache_dirty, 1);
+
block->type = BLUESKY_BLOCK_DIRTY;
}
block->type = BLUESKY_BLOCK_DIRTY;
}
@@
-87,6
+93,11
@@
void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size)
for (guint i = inode->blocks->len; i < blocks; i++) {
BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, i);
g_free(b->ref);
for (guint i = inode->blocks->len; i < blocks; i++) {
BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, i);
g_free(b->ref);
+ if (b->type == BLUESKY_BLOCK_CACHED
+ || b->type == BLUESKY_BLOCK_DIRTY)
+ g_atomic_int_add(&inode->fs->cache_total, -1);
+ if (b->type == BLUESKY_BLOCK_DIRTY)
+ g_atomic_int_add(&inode->fs->cache_dirty, -1);
bluesky_string_unref(b->data);
}
g_array_set_size(inode->blocks, blocks);
bluesky_string_unref(b->data);
}
g_array_set_size(inode->blocks, blocks);
@@
-230,6
+241,9
@@
void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block,
bluesky_store_add_barrier(barrier, async);
else
bluesky_store_async_wait(async);
bluesky_store_add_barrier(barrier, async);
else
bluesky_store_async_wait(async);
+
+ bluesky_store_async_unref(async);
+ g_atomic_int_add(&fs->cache_total, 1);
}
/* Write the given block to cloud-backed storage and mark it clean. */
}
/* Write the given block to cloud-backed storage and mark it clean. */
@@
-261,6
+275,7
@@
void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block,
block->ref = name;
block->type = BLUESKY_BLOCK_CACHED;
block->ref = name;
block->type = BLUESKY_BLOCK_CACHED;
+ g_atomic_int_add(&fs->cache_dirty, -1);
g_checksum_free(csum);
}
g_checksum_free(csum);
}
@@
-288,9
+303,12
@@
void bluesky_file_drop_cached(BlueSkyInode *inode)
"Dropping block %d of inode %"PRIu64" from cache",
i, inode->inum);
"Dropping block %d of inode %"PRIu64" from cache",
i, inode->inum);
+ g_log("bluesky/cache", G_LOG_LEVEL_DEBUG,
+ " (reference count was %d)", b->data->refcount);
bluesky_string_unref(b->data);
b->data = NULL;
b->type = BLUESKY_BLOCK_REF;
bluesky_string_unref(b->data);
b->data = NULL;
b->type = BLUESKY_BLOCK_REF;
+ g_atomic_int_add(&inode->fs->cache_total, -1);
}
}
}
}
}
}