X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;ds=sidebyside;f=bluesky%2Finode.c;h=3430b19eeef21be93059b6cee714a3236cbde55e;hb=7ca401a44bfecb14b7e5ecf849aec31157382231;hp=a20b23be1fd8c9429e87f5af2b72106c4c213b5e;hpb=6357b9d1de3bfb09811297406688810b4900df7b;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index a20b23b..3430b19 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -141,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; } @@ -166,3 +173,17 @@ void bluesky_inode_flush(BlueSkyFS *fs, BlueSkyInode *inode) 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); + } +}