]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] 04-hash_autodetect_fix.diff
authorHans Reiser <reiser@namesys.com>
Mon, 11 Feb 2002 13:15:35 +0000 (05:15 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Mon, 11 Feb 2002 13:15:35 +0000 (05:15 -0800)
   Correctly detect and print hash values, when manual hash detection is used.

fs/reiserfs/prints.c
fs/reiserfs/super.c
include/linux/reiserfs_fs.h

index 16bf7ce51220c31bcd545b6a2c249311325f8aa6..d87dfa0c27cc41017a093c05e4ef20f7488d4d6e 100644 (file)
@@ -477,6 +477,17 @@ static int print_leaf (struct buffer_head * bh, int print_mode, int first, int l
     return 0;
 }
 
+char * reiserfs_hashname(int code)
+{
+    if ( code == YURA_HASH)
+       return "rupasov";
+    if ( code == TEA_HASH)
+       return "tea";
+    if ( code == R5_HASH)
+       return "r5";
+
+    return "unknown";
+}
 /* return 1 if this is not super block */
 static int print_super_block (struct buffer_head * bh)
 {
@@ -519,8 +530,7 @@ static int print_super_block (struct buffer_head * bh)
     printk ("Journal orig size %d\n", sb_jp_journal_size(rs));
     printk ("FS state %d\n", sb_fs_state(rs));
     printk ("Hash function \"%s\"\n",
-            sb_hash_function_code(rs) == TEA_HASH ? "tea" :
-           ( sb_hash_function_code(rs) == YURA_HASH ? "rupasov" : (sb_hash_function_code(rs) == R5_HASH ? "r5" : "unknown")));
+           reiserfs_hashname(sb_hash_function_code(rs)));
     
     printk ("Tree height %d\n", sb_tree_height(rs));
     return 0;
index 3666681d8a94fd16d8a2851abe34ce18e7c9ff9e..45c67226e15fbec5d3d4918e21e6ca3342937b3c 100644 (file)
@@ -850,7 +850,9 @@ __u32 find_hash_out (struct super_block * s)
 
     inode = s->s_root->d_inode;
 
-    while (1) {
+    do { // Some serious "goto"-hater was there ;)
+       u32 teahash, r5hash, yurahash;
+
        make_cpu_key (&key, inode, ~0, TYPE_DIRENTRY, 3);
        retval = search_by_entry_key (s, &key, &path, &de);
        if (retval == IO_ERROR) {
@@ -869,20 +871,30 @@ __u32 find_hash_out (struct super_block * s)
                             "is using the default hash\n");
            break;
        }
-       if (GET_HASH_VALUE(yura_hash (de.de_name, de.de_namelen)) == 
-           GET_HASH_VALUE(keyed_hash (de.de_name, de.de_namelen))) {
-           reiserfs_warning ("reiserfs: Could not detect hash function "
-                             "please mount with -o hash={tea,rupasov,r5}\n") ;
-           hash = UNSET_HASH ;
+       r5hash=GET_HASH_VALUE (r5_hash (de.de_name, de.de_namelen));
+       teahash=GET_HASH_VALUE (keyed_hash (de.de_name, de.de_namelen));
+       yurahash=GET_HASH_VALUE (yura_hash (de.de_name, de.de_namelen));
+       if ( ( (teahash == r5hash) && (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num]))) == r5hash) ) ||
+            ( (teahash == yurahash) && (yurahash == GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])))) ) ||
+            ( (r5hash == yurahash) && (yurahash == GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])))) ) ) {
+           reiserfs_warning("reiserfs: Unable to automatically detect hash"
+               "function for device %s\n"
+               "please mount with -o hash={tea,rupasov,r5}\n", kdevname (s->s_dev));
+           hash = UNSET_HASH;
            break;
        }
-       if (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])) ) ==
-           GET_HASH_VALUE (yura_hash (de.de_name, de.de_namelen)))
+       if (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])) ) == yurahash)
            hash = YURA_HASH;
-       else
+       else if (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])) ) == teahash)
            hash = TEA_HASH;
-       break;
-    }
+       else if (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])) ) == r5hash)
+           hash = R5_HASH;
+       else {
+           reiserfs_warning("reiserfs: Unrecognised hash function for "
+                            "device %s\n", kdevname (s->s_dev));
+           hash = UNSET_HASH;
+       }
+    } while (0);
 
     pathrelse (&path);
     return hash;
@@ -907,16 +919,16 @@ static int what_hash (struct super_block * s)
        ** mount options 
        */
        if (reiserfs_rupasov_hash(s) && code != YURA_HASH) {
-           printk("REISERFS: Error, tea hash detected, "
-                  "unable to force rupasov hash\n") ;
+           printk("REISERFS: Error, %s hash detected, "
+                  "unable to force rupasov hash\n", reiserfs_hashname(code)) ;
            code = UNSET_HASH ;
        } else if (reiserfs_tea_hash(s) && code != TEA_HASH) {
-           printk("REISERFS: Error, rupasov hash detected, "
-                  "unable to force tea hash\n") ;
+           printk("REISERFS: Error, %s hash detected, "
+                  "unable to force tea hash\n", reiserfs_hashname(code)) ;
            code = UNSET_HASH ;
        } else if (reiserfs_r5_hash(s) && code != R5_HASH) {
-           printk("REISERFS: Error, r5 hash detected, "
-                  "unable to force r5 hash\n") ;
+           printk("REISERFS: Error, %s hash detected, "
+                  "unable to force r5 hash\n", reiserfs_hashname(code)) ;
            code = UNSET_HASH ;
        } 
     } else { 
index 67e5b94937d6f756ff896369cb67400381bc7b82..02f8cb393d742543b27f96de34887be9a4b7c7d7 100644 (file)
@@ -1960,6 +1960,7 @@ void print_block_head (struct buffer_head * bh, char * mes);
 void check_leaf (struct buffer_head * bh);
 void check_internal (struct buffer_head * bh);
 void print_statistics (struct super_block * s);
+char * reiserfs_hashname(int code);
 
 /* lbalance.c */
 int leaf_move_items (int shift_mode, struct tree_balance * tb, int mov_num, int mov_bytes, struct buffer_head * Snew);