X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=5e91432677fde71b33e7ec0e7981711fe6680c79;hb=0325ee9e9afb02b08bdec3497e8cc54cb942989d;hp=59b915a29f2298c2d443a34ed4d0620e375e7f77;hpb=0a6dbd76f58caad61a494a64e9bd421de61f6aa6;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index 59b915a..5e91432 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -8,10 +8,11 @@ #include #include +#include #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 @@ -72,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) { @@ -81,7 +112,7 @@ void bluesky_inode_ref(BlueSkyInode *inode) void bluesky_inode_unref(BlueSkyInode *inode) { if (g_atomic_int_dec_and_test(&inode->refcount)) { - g_error("Reference count for inode %lld dropped to zero!\n", + g_error("Reference count for inode %"PRIu64" dropped to zero!\n", inode->inum); } } @@ -95,6 +126,8 @@ uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs) inum = fs->next_inum; fs->next_inum++; + bluesky_superblock_flush(fs); + return inum; } @@ -116,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: @@ -169,7 +203,7 @@ void bluesky_inode_flush(BlueSkyFS *fs, BlueSkyInode *inode) BlueSkyRCStr *data = bluesky_string_new(g_string_free(buf, FALSE), len); char key[64]; - sprintf(key, "inode-%016llx", inode->inum); + sprintf(key, "inode-%016"PRIx64, inode->inum); bluesky_store_put(fs->store, key, data); } @@ -178,7 +212,7 @@ void bluesky_inode_flush(BlueSkyFS *fs, BlueSkyInode *inode) void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum) { char key[64]; - sprintf(key, "inode-%016llx", inum); + sprintf(key, "inode-%016"PRIx64, inum); BlueSkyRCStr *data = bluesky_store_get(fs->store, key); if (data == NULL) return; @@ -186,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 %lld\n", (long long)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); +} +