+#else
+#define rot(x,k) (((x)<<(k)) ^ ((x)>>(32-(k))))
+ /* Based on Jenkins hashword() from lookup3.c. */
+ {
+ uint32 a, b, c;
+
+ /* Set up the internal state */
+ a = b = c = 0xdeadbeef + (8 << 2);
+
+ b += (uint32)(key >> 32);
+ a += (uint32)key;
+ c ^= b; c -= rot(b, 14);
+ a ^= c; a -= rot(c, 11);
+ b ^= a; b -= rot(a, 25);
+ c ^= b; c -= rot(b, 16);
+ a ^= c; a -= rot(c, 4);
+ b ^= a; b -= rot(a, 14);
+ c ^= b; c -= rot(b, 24);
+ bkt = c;
+ }
+#endif
+
+ /* If it already exists, return it. */
+ while (1) {
+ bkt &= tbl->size - 1;
+ if (tbl->buckets[bkt].key == key)
+ return &tbl->buckets[bkt];
+ if (tbl->buckets[bkt].key == 0)
+ break;
+ bkt++;
+ }
+
+ /* Otherwise, take over this empty spot and then return it. */
+ tbl->buckets[bkt].key = key;
+ tbl->entries++;
+ return &tbl->buckets[bkt];
+}
+
+struct idev_node *idev_node(int64 dev, int64 ino)
+{
+ static struct idev_node *dev_node = NULL;
+ struct ihash_table *tbl;
+
+ if (!dev_node || dev_node->key != dev) {
+ /* We keep a separate hash table of inodes for every device. */
+ dev_node = ihash_node(dev_tbl, dev);
+ if (!(tbl = dev_node->data))
+ tbl = dev_node->data = ihash_create(512);
+ } else
+ tbl = dev_node->data;
+
+ return ihash_node(tbl, ino);
+}