X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;ds=sidebyside;f=bluesky%2Finode.c;h=3430b19eeef21be93059b6cee714a3236cbde55e;hb=7ca401a44bfecb14b7e5ecf849aec31157382231;hp=8fdd882ec83da54970627dcd247e382a5a4fa2bb;hpb=91689059f908a46b2fc3b29e2436e16d39f9dde9;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index 8fdd882..3430b19 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -6,6 +6,7 @@ * TODO: Licensing */ +#include #include #include #include @@ -140,6 +141,13 @@ BlueSkyInode *bluesky_get_inode(BlueSkyFS *fs, uint64_t inum) 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); + } + return inode; } @@ -150,3 +158,32 @@ void bluesky_insert_inode(BlueSkyFS *fs, BlueSkyInode *inode) g_hash_table_insert(fs->inodes, &inode->inum, inode); g_mutex_unlock(fs->lock); } + +/* Synchronize an inode to stable storage. */ +void bluesky_inode_flush(BlueSkyFS *fs, BlueSkyInode *inode) +{ + GString *buf = g_string_new(""); + bluesky_serialize_inode(buf, inode); + + gsize len = buf->len; + BlueSkyRCStr *data = bluesky_string_new(g_string_free(buf, FALSE), len); + + char key[64]; + sprintf(key, "inode-%016llx", inode->inum); + + bluesky_store_put(fs->store, key, data); +} + +/* Fetch an inode from stable storage. */ +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); + + 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); + } +}