+/* Unfortunately a glib hash table is only guaranteed to be able to store
+ * 32-bit keys if we use the key directly. If we want 64-bit inode numbers,
+ * we'll have to allocate memory to store the 64-bit inumber, and use a pointer
+ * to it. Rather than allocate the memory for the key, we'll just include a
+ * pointer to the 64-bit inum stored in the inode itself, so that we don't need
+ * to do any more memory management. */
+static guint bluesky_fs_key_hash_func(gconstpointer key)
+{
+ uint64_t inum = *(const uint64_t *)key;
+ return (guint)inum;
+}
+
+static gboolean bluesky_fs_key_equal_func(gconstpointer a, gconstpointer b)
+{
+ uint64_t i1 = *(const uint64_t *)a;
+ uint64_t i2 = *(const uint64_t *)b;
+ return i1 == i2;
+}
+
+/* Filesystem-level operations. A filesystem is like a directory tree that we
+ * are willing to export. */
+BlueSkyFS *bluesky_new_fs(gchar *name)
+{
+ BlueSkyFS *fs = g_new0(BlueSkyFS, 1);
+ fs->lock = g_mutex_new();
+ fs->name = g_strdup(name);
+ fs->inodes = g_hash_table_new(bluesky_fs_key_hash_func,
+ bluesky_fs_key_equal_func);
+ fs->next_inum = BLUESKY_ROOT_INUM + 1;
+
+ return fs;
+}
+