From: Michael Vrable Date: Mon, 14 Sep 2009 17:23:25 +0000 (-0700) Subject: Update filesystem locking rules (in progress). X-Git-Url: https://git.vrable.net/?a=commitdiff_plain;h=3ffb892cbb0b96a57595b9962d018191c5b3d5af;p=bluesky.git Update filesystem locking rules (in progress). --- diff --git a/bluesky/inode.c b/bluesky/inode.c index 4d07a52..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. */