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;
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);