--- linux-2.5.3-pre4.o/include/linux/reiserfs_fs_sb.h   Thu Jan 24 12:21:23 2002
+++ linux-2.5.3-pre4/include/linux/reiserfs_fs_sb.h     Thu Jan 24 12:53:45 2002
@@ -347,6 +347,8 @@
                               /* To be obsoleted soon by per buffer seals.. -Hans */
    atomic_t s_generation_counter; // increased by one every time the
    // tree gets re-balanced
+    unsigned long s_properties;    /* File system properties. Currently holds
+                                    on-disk FS format */

    /* session statistics */
    int s_kmallocs;
@@ -368,7 +370,11 @@
    struct proc_dir_entry *procdir;
};

+/* Definitions of reiserfs on-disk properties: */
+#define REISERFS_3_5 0
+#define REISERFS_3_6 1

+/* Mount options */
#define NOTAIL 0  /* -o notail: no tails will be created in a session */
#define REPLAYONLY 3 /* replay journal and return 0. Use by fsck */
#define REISERFS_NOLOG 4      /* -o nolog: turn journalling off */
@@ -418,8 +424,8 @@
#define dont_have_tails(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << NOTAIL))
#define replay_only(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REPLAYONLY))
#define reiserfs_dont_log(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_NOLOG))
-#define old_format_only(s) ((SB_VERSION(s) != REISERFS_VERSION_2) \
-         && !((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_CONVERT)))
+#define old_format_only(s) ((s)->u.reiserfs_sb.s_properties & (1 << REISERFS_3_5))
+#define convert_reiserfs(s) ((s)->u.reiserfs_sb.s_mount_opt & (1 << REISERFS_CONVERT))


void reiserfs_file_buffer (struct buffer_head * bh, int list);
--- linux-2.5.3-pre4.o/fs/reiserfs/procfs.c     Thu Jan 24 12:21:23 2002
+++ linux-2.5.3-pre4/fs/reiserfs/procfs.c       Thu Jan 24 12:53:45 2002
@@ -15,6 +15,7 @@
#include <linux/sched.h>
#include <asm/uaccess.h>
#include <linux/reiserfs_fs.h>
+#include <linux/reiserfs_fs_sb.h>
#include <linux/smp_lock.h>
#include <linux/locks.h>
#include <linux/init.h>
@@ -76,12 +77,21 @@
{
       int len = 0;
       struct super_block *sb;
+       char *format;

       sb = procinfo_prologue( to_kdev_t((int)data) );
       if( sb == NULL )
               return -ENOENT;
+       if ( sb->u.reiserfs_sb.s_properties & (1 << REISERFS_3_6) ) {
+               format = "3.6";
+       } else if ( sb->u.reiserfs_sb.s_properties & (1 << REISERFS_3_5) ) {
+               format = "3.5";
+       } else {
+               format = "unknown";
+       }
+
       len += sprintf( &buffer[ len ], "%s format\twith checks %s\n",
-                       old_format_only( sb ) ? "old" : "new",
+                       format,
#if defined( CONFIG_REISERFS_CHECK )
                       "on"
#else
@@ -172,7 +182,7 @@
                       dont_have_tails( sb ) ? "NO_TAILS " : "TAILS ",
                       replay_only( sb ) ? "REPLAY_ONLY " : "",
                       reiserfs_dont_log( sb ) ? "DONT_LOG " : "LOG ",
-                       old_format_only( sb ) ? "CONV " : "",
+                       convert_reiserfs( sb ) ? "CONV " : "",

                       atomic_read( &r -> s_generation_counter ),
                       SF( s_kmallocs ),
--- linux-2.5.3-pre4.o/fs/reiserfs/super.c      Thu Jan 24 12:25:16 2002
+++ linux-2.5.3-pre4/fs/reiserfs/super.c        Thu Jan 24 12:53:45 2002
@@ -968,6 +968,7 @@
    unsigned long blocks;
    int jinit_done = 0 ;
    struct reiserfs_iget4_args args ;
+    struct reiserfs_super_block * rs;
    char *jdev_name;

    memset (&s->u.reiserfs_sb, 0, sizeof (struct reiserfs_sb_info));
@@ -1045,8 +1046,13 @@
      goto error ;
    }

+    rs = SB_DISK_SUPER_BLOCK (s);
+    if (is_reiserfs_3_5 (rs) || (is_reiserfs_jr (rs) && SB_VERSION (s) == REISERFS_VERSION_1))
+       set_bit(REISERFS_3_5, &(s->u.reiserfs_sb.s_properties));
+    else
+       set_bit(REISERFS_3_6, &(s->u.reiserfs_sb.s_properties));
+
    if (!(s->s_flags & MS_RDONLY)) {
-       struct reiserfs_super_block * rs = SB_DISK_SUPER_BLOCK (s);

       journal_begin(&th, s, 1) ;
       reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
@@ -1054,14 +1060,13 @@
        set_sb_umount_state( rs, REISERFS_ERROR_FS );
       set_sb_fs_state (rs, 0);

-       if (is_reiserfs_3_5 (rs) || (is_reiserfs_jr (rs) && SB_VERSION (s) == REISERFS_VERSION_1)) {
+       if (old_format_only(s)) {
         /* filesystem of format 3.5 either with standard or non-standard
            journal */
-         if (!old_format_only (s)) {
+         if (convert_reiserfs (s)) {
           /* and -o conv is given */
           reiserfs_warning ("reiserfs: converting 3.5 filesystem to the 3.6 format\n") ;

-           if (is_reiserfs_3_5 (rs))
             /* put magic string of 3.6 format. 2.2 will not be able to
                mount this filesystem anymore */
             memcpy (rs->s_v1.s_magic, reiserfs_3_6_magic_string,
@@ -1069,17 +1074,13 @@

           set_sb_version(rs,REISERFS_VERSION_2);
           reiserfs_convert_objectid_map_v1(s) ;
+           set_bit(REISERFS_3_6, &(s->u.reiserfs_sb.s_properties));
+           clear_bit(REISERFS_3_5, &(s->u.reiserfs_sb.s_properties));
         } else {
           reiserfs_warning("reiserfs: using 3.5.x disk format\n") ;
-           }
-       } else {
-           // new format found
-           set_bit (REISERFS_CONVERT, &(s->u.reiserfs_sb.s_mount_opt));
+         }
       }

-       // mark hash in super block: it could be unset. overwrite should be ok
-        set_sb_hash_function_code( rs, function2code(s->u.reiserfs_sb.s_hash_function ) );
-
       journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
       journal_end(&th, s, 1) ;

@@ -1087,7 +1088,13 @@
       finish_unfinished (s);

       s->s_dirt = 0;
+    } else {
+       if ( old_format_only(s) ) {
+           reiserfs_warning("reiserfs: using 3.5.x disk format\n") ;
+       }
    }
+    // mark hash in super block: it could be unset. overwrite should be ok
+    set_sb_hash_function_code( rs, function2code(s->u.reiserfs_sb.s_hash_function ) );

    reiserfs_proc_info_init( s );
    reiserfs_proc_register( s, "version", reiserfs_version_in_proc );