X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=5e91432677fde71b33e7ec0e7981711fe6680c79;hb=afdaf6a249027cccc296b8923dd95fd38736b70d;hp=f3f3198e44396d71438b44222b8f2a3ca3a04cf4;hpb=92a6fa8cd45e12f70f65f9d9fc6d1cdd6592878a;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index f3f3198..5e91432 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -12,7 +12,7 @@ #include #include -#include "bluesky.h" +#include "bluesky-private.h" /* Core filesystem. Different proxies, such as the NFSv3 one, interface to * this, but the core actually tracks the data which is stored. So far we just @@ -73,6 +73,36 @@ BlueSkyFS *bluesky_new_fs(gchar *name) return fs; } +BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store) +{ + BlueSkyRCStr *data = bluesky_store_get(store, "superblock"); + if (data != NULL) { + BlueSkyFS *fs = bluesky_deserialize_superblock(data->data); + if (fs != NULL) { + fs->store = store; + g_print("Loaded filesystem superblock\n"); + g_free(fs->name); + fs->name = g_strdup(name); + return fs; + } + } + + g_print("Initializing fresh filesystem\n"); + BlueSkyFS *fs = bluesky_new_fs(name); + fs->store = store; + + BlueSkyInode *root = bluesky_new_inode(BLUESKY_ROOT_INUM, fs, + BLUESKY_DIRECTORY); + root->nlink = 1; + root->mode = 0755; + bluesky_insert_inode(fs, root); + + bluesky_inode_flush(fs, root); + bluesky_superblock_flush(fs); + + return fs; +} + /* Inode reference counting. */ void bluesky_inode_ref(BlueSkyInode *inode) { @@ -96,6 +126,8 @@ uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs) inum = fs->next_inum; fs->next_inum++; + bluesky_superblock_flush(fs); + return inum; } @@ -117,6 +149,7 @@ BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFS *fs, case BLUESKY_DIRECTORY: i->dirents = g_sequence_new(bluesky_dirent_destroy); i->dirhash = g_hash_table_new(g_str_hash, g_str_equal); + i->dirhash_folded = g_hash_table_new(g_str_hash, g_str_equal); break; case BLUESKY_BLOCK: case BLUESKY_CHARACTER: @@ -187,6 +220,19 @@ 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 %"PRIu64"\n", inum); } } + +/* Synchronize filesystem superblock to stable storage. */ +void bluesky_superblock_flush(BlueSkyFS *fs) +{ + GString *buf = g_string_new(""); + bluesky_serialize_superblock(buf, fs); + + g_print("Syncing superblock...\n"); + + gsize len = buf->len; + BlueSkyRCStr *data = bluesky_string_new(g_string_free(buf, FALSE), len); + bluesky_store_put(fs->store, "superblock", data); +} +