]> Zhao Yanbai Git Server - kernel.git/commitdiff
compute_qstr_hash算法问题修正
authoracevest <zhaoyanbai@126.com>
Fri, 6 Sep 2024 11:57:43 +0000 (19:57 +0800)
committeracevest <zhaoyanbai@126.com>
Fri, 6 Sep 2024 11:57:43 +0000 (19:57 +0800)
fs/dentry.c
fs/path.c

index ab3d8df697ab10ae1e4c386c3fc9c41927277ce5..7bf7d714fd8ea6535d88bc879065e6c98263012f 100644 (file)
@@ -28,9 +28,15 @@ dentry_hash_entry_t dentry_hash_table[DENTRY_HASH_TABLE_SIZE] = {
 uint32_t mod64(uint64_t x, uint32_t y) {
 #if 1
     // TODO FIXME
-    uint32_t d = (uint32_t)x;
-    return d % y;
-#else
+    uint32_t a = (uint32_t)x;
+    uint32_t b = (x >> 32);
+
+    a %= y;
+    b %= y;
+
+    return (a + b) % y;
+#endif
+#if 0
     uint32_t mod;
 
     asm("div %3;" : "=d"(mod) : "a"((uint32_t)x), "d"((uint32_t)(x >> 32)), "r"(y) : "cc");
index d647244b6fbbceb2c69b72b78bc1d7fcd0a4eda3..905678fe91798e20f77d0f808777691211f2997f 100644 (file)
--- a/fs/path.c
+++ b/fs/path.c
@@ -104,14 +104,14 @@ void follow_dotdot(namei_t *ni) {
 uint64_t compute_qstr_hash(qstr_t *q) {
     q->hash = 0;
     for (int i = 0; i < q->len; i++) {
-        uint64_t x = (uint64_t)(q->name[i]);
+        uint64_t c = (uint64_t)(q->name[i]);
+        uint64_t x = q->hash;
         q->hash = (x << 4) | (x >> (8 * sizeof(q->hash) - 4));
+        q->hash ^= c;
     }
 
     q->hash += q->hash >> (4 * sizeof(q->hash));
 
-    q->hash &= 0x00000000FFFFFFFF;
-
     return q->hash;
 }