X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=f3f3198e44396d71438b44222b8f2a3ca3a04cf4;hb=92a6fa8cd45e12f70f65f9d9fc6d1cdd6592878a;hp=4d07a5244ffd3605ebb8421998235958b2f18968;hpb=07eac8709bced5f814a65fa0d5dd62e4bd649a9a;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index 4d07a52..f3f3198 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -28,7 +29,7 @@ int64_t bluesky_get_current_time() /* Update an inode to indicate that a modification was made. This increases * the change counter, updates the ctime to the current time, and optionally - * updates the mtime. */ + * updates the mtime. inode must already be locked. */ void bluesky_inode_update_ctime(BlueSkyInode *inode, gboolean update_mtime) { int64_t now = bluesky_get_current_time(); @@ -81,21 +82,19 @@ void bluesky_inode_ref(BlueSkyInode *inode) void bluesky_inode_unref(BlueSkyInode *inode) { if (g_atomic_int_dec_and_test(&inode->refcount)) { - g_error("Reference count for inode %lld dropped to zero!\n", + g_error("Reference count for inode %"PRIu64" dropped to zero!\n", inode->inum); } } /* Allocate a fresh inode number which has not been used before within a - * filesystem. */ + * filesystem. fs must already be locked. */ uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs) { uint64_t inum; - g_mutex_lock(fs->lock); inum = fs->next_inum; fs->next_inum++; - g_mutex_unlock(fs->lock); return inum; } @@ -132,31 +131,33 @@ BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFS *fs, /* Retrieve an inode from the filesystem. Eventually this will be a cache and * so we might need to go fetch the inode from elsewhere; for now all - * filesystem state is stored here. */ + * filesystem state is stored here. inode is returned locked with a reference + * held. */ BlueSkyInode *bluesky_get_inode(BlueSkyFS *fs, uint64_t inum) { BlueSkyInode *inode = NULL; g_mutex_lock(fs->lock); inode = (BlueSkyInode *)g_hash_table_lookup(fs->inodes, &inum); - g_mutex_unlock(fs->lock); if (inode == NULL) { bluesky_inode_fetch(fs, inum); - g_mutex_lock(fs->lock); inode = (BlueSkyInode *)g_hash_table_lookup(fs->inodes, &inum); - g_mutex_unlock(fs->lock); } + if (inode != NULL) { + bluesky_inode_ref(inode); + } + + g_mutex_unlock(fs->lock); + return inode; } -/* Insert an inode into the filesystem inode cache. */ +/* Insert an inode into the filesystem inode cache. fs should be locked. */ void bluesky_insert_inode(BlueSkyFS *fs, BlueSkyInode *inode) { - g_mutex_lock(fs->lock); g_hash_table_insert(fs->inodes, &inode->inum, inode); - g_mutex_unlock(fs->lock); } /* Synchronize an inode to stable storage. */ @@ -169,7 +170,7 @@ void bluesky_inode_flush(BlueSkyFS *fs, BlueSkyInode *inode) BlueSkyRCStr *data = bluesky_string_new(g_string_free(buf, FALSE), len); char key[64]; - sprintf(key, "inode-%016llx", inode->inum); + sprintf(key, "inode-%016"PRIx64, inode->inum); bluesky_store_put(fs->store, key, data); } @@ -178,7 +179,7 @@ void bluesky_inode_flush(BlueSkyFS *fs, BlueSkyInode *inode) void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum) { char key[64]; - sprintf(key, "inode-%016llx", inum); + sprintf(key, "inode-%016"PRIx64, inum); BlueSkyRCStr *data = bluesky_store_get(fs->store, key); if (data == NULL) return; @@ -186,6 +187,6 @@ void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum) BlueSkyInode *inode = bluesky_deserialize_inode(fs, data->data); if (inode != NULL) { bluesky_insert_inode(fs, inode); - g_print("Loaded inode %lld\n", (long long)inum); + g_print("Loaded inode %"PRIu64"\n", inum); } }