Switch to 31-bit directory cookies and a separate hashtable for lookups.
[bluesky.git] / bluesky.h
index c85fd70..793daa4 100644 (file)
--- a/bluesky.h
+++ b/bluesky.h
@@ -68,17 +68,19 @@ typedef struct {
     GArray *blocks;
 
     /* Directory-specific fields */
-    GSequence *dirents;
+    GSequence *dirents;         /* List of entries for READDIR */
+    GHashTable *dirhash;        /* Hash table by name for LOOKUP */
     uint64_t parent_inum;       /* inode for ".."; 0 if the root directory */
 } BlueSkyInode;
 
 /* A directory entry.  The name is UTF-8 and is a freshly-allocated string.
- * The name is hashed to a 64-bit value, and the directory entries are sorted
- * by hash value (the hash value can then be used as a cookie for resuming a
- * READDIR call). */
+ * Each directory entry is listed in two indices: dirents is indexed by cookie
+ * and dirhash by name.  The cookie is a randomly-assigned 32-bit value, unique
+ * within the directory, that remains unchanged until the entry is deleted.  It
+ * is used to provide a stable key for restarting a READDIR call. */
 typedef struct {
     gchar *name;
-    uint64_t hash;
+    uint32_t cookie;
     uint64_t inum;
 } BlueSkyDirent;
 
@@ -103,6 +105,7 @@ typedef struct {
 
 BlueSkyFS *bluesky_new_fs(gchar *name);
 int64_t bluesky_get_current_time();
+void bluesky_inode_update_ctime(BlueSkyInode *inode, gboolean update_mtime);
 uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs);
 BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFileType type);