]> wimlib.net Git - wimlib/blobdiff - include/wimlib/inode_table.h
inode_table: make the inode table resizable
[wimlib] / include / wimlib / inode_table.h
index 9e8485a1b2502a2890394f70398b8099ef81e4d8..4d4fab5ec5678100d7dac4212d5e865985eb8d32 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "wimlib/list.h"
 #include "wimlib/types.h"
 
 #include "wimlib/list.h"
 #include "wimlib/types.h"
+#include "wimlib/util.h"
 
 struct wim_dentry;
 
 
 struct wim_dentry;
 
@@ -13,11 +14,20 @@ struct wim_dentry;
  * cases the inodes are linked by i_hlist_node.  */
 struct wim_inode_table {
        struct hlist_head *array;
  * cases the inodes are linked by i_hlist_node.  */
 struct wim_inode_table {
        struct hlist_head *array;
+       size_t filled;
        size_t capacity;
        struct hlist_head extra_inodes;
 };
 
 
        size_t capacity;
        struct hlist_head extra_inodes;
 };
 
 
+/* Compute the index of the hash bucket to use for the given inode number and
+ * device number.  */
+static inline size_t
+hash_inode(const struct wim_inode_table *table, u64 ino, u64 devno)
+{
+       return (hash_u64(ino) + devno) & (table->capacity - 1);
+}
+
 extern int
 init_inode_table(struct wim_inode_table *table, size_t capacity);
 
 extern int
 init_inode_table(struct wim_inode_table *table, size_t capacity);
 
@@ -26,6 +36,9 @@ inode_table_new_dentry(struct wim_inode_table *table, const tchar *name,
                       u64 ino, u64 devno, bool noshare,
                       struct wim_dentry **dentry_ret);
 
                       u64 ino, u64 devno, bool noshare,
                       struct wim_dentry **dentry_ret);
 
+extern void
+enlarge_inode_table(struct wim_inode_table *table);
+
 extern void
 inode_table_prepare_inode_list(struct wim_inode_table *table,
                               struct hlist_head *head);
 extern void
 inode_table_prepare_inode_list(struct wim_inode_table *table,
                               struct hlist_head *head);