--- 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 #include #include +#include #include #include #include @@ -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 ); .