X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=8faafa412b9861e5dfabca5258407c7e44828369;hb=3ffb892cbb0b96a57595b9962d018191c5b3d5af;hp=3430b19eeef21be93059b6cee714a3236cbde55e;hpb=7ca401a44bfecb14b7e5ecf849aec31157382231;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index 3430b19..8faafa4 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -28,7 +28,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(); @@ -87,15 +87,13 @@ void bluesky_inode_unref(BlueSkyInode *inode) } /* 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 +130,34 @@ 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) { + g_mutex_lock(inode->lock); + 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. */ @@ -180,6 +181,8 @@ void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum) char key[64]; sprintf(key, "inode-%016llx", inum); BlueSkyRCStr *data = bluesky_store_get(fs->store, key); + if (data == NULL) + return; BlueSkyInode *inode = bluesky_deserialize_inode(fs, data->data); if (inode != NULL) {