Edward Shishkin wrote: > Jeff Mahoney wrote: > >> This patch contains the basic implementation for reiserfs 3.7. >> >> Specifically, it extends reiserfs 3.6 to allow feature compatibility bits. >> Since it extends v3.6, it assumes allowing a nonstandard journal, so some >> paths have been adjusted to test for a nonstandard journal instead of >> just having the JR superblock magic. >> >> I don't have any large plans to extend beyond some very basic features, >> although extended attributes would be much more efficiently implemented >> if they were first class items instead of hidden files. >> >> The next patch in the series adds support to allow v2 stat data items >> to describe the number of blocks in fs-blocksize blocks instead of >> 512 byte blocks. >> >> Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx> >> --- >> fs/reiserfs/journal.c | 2 >> fs/reiserfs/prints.c | 6 + >> fs/reiserfs/procfs.c | 4 - >> fs/reiserfs/super.c | 140 ++++++++++++++++++++++++++++++++++++++++- >> include/linux/magic.h | 1 >> include/linux/reiserfs_fs.h | 11 ++- >> include/linux/reiserfs_fs_sb.h | 39 +++++++++++ >> 7 files changed, 196 insertions(+), 7 deletions(-) >> >> --- a/fs/reiserfs/journal.c >> +++ b/fs/reiserfs/journal.c >> @@ -2850,7 +2850,7 @@ int journal_init(struct super_block *sb, >> jh = (struct reiserfs_journal_header *)(bhjh->b_data); >> >> /* make sure that journal matches to the super block */ >> - if (is_reiserfs_jr(rs) >> + if (has_nonstandard_journal(rs) >> >> > > Nup. > Should be: > if ((is_reiserfs_jr(rs) || is_reiserfs_3_7) > I was wrong here: this should be untouched > >> && (le32_to_cpu(jh->jh_journal.jp_journal_magic) != >> sb_jp_journal_magic(rs))) { >> reiserfs_warning(sb, "sh-460", >> --- a/fs/reiserfs/prints.c >> +++ b/fs/reiserfs/prints.c >> @@ -532,6 +532,8 @@ static int print_super_block(struct buff >> } else if (is_reiserfs_jr(rs)) { >> version = ((sb_version(rs) == REISERFS_VERSION_2) ? >> "3.6" : "3.5"); >> + } else if (is_reiserfs_3_7(rs)) { >> + version = "3.7"; >> } else { >> return 1; >> } >> @@ -547,12 +549,12 @@ static int print_super_block(struct buff >> // skipped = (bh->b_blocknr * bh->b_size) / sb_blocksize(rs); >> skipped = bh->b_blocknr; >> data_blocks = sb_block_count(rs) - skipped - 1 - sb_bmap_nr(rs) - >> - (!is_reiserfs_jr(rs) ? sb_jp_journal_size(rs) + >> + (!has_nonstandard_journal(rs) ? sb_jp_journal_size(rs) + >> >> > ditto > > >> 1 : sb_reserved_for_journal(rs)) - sb_free_blocks(rs); >> printk >> ("Busy blocks (skipped %d, bitmaps - %d, journal (or reserved) blocks - %d\n" >> "1 super block, %d data blocks\n", skipped, sb_bmap_nr(rs), >> - (!is_reiserfs_jr(rs) ? (sb_jp_journal_size(rs) + 1) : >> + (!has_nonstandard_journal(rs) ? (sb_jp_journal_size(rs) + 1) : >> >> > ditto > >> sb_reserved_for_journal(rs)), data_blocks); >> printk("Root block %u\n", sb_root_block(rs)); >> printk("Journal block (first) %d\n", sb_jp_journal_1st_block(rs)); >> --- a/fs/reiserfs/procfs.c >> +++ b/fs/reiserfs/procfs.c >> @@ -28,7 +28,9 @@ static int show_version(struct seq_file >> { >> char *format; >> >> - if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_6)) { >> + if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_7)) { >> + format = "3.7"; >> + } else if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_6)) { >> format = "3.6"; >> } else if (REISERFS_SB(sb)->s_properties & (1 << REISERFS_3_5)) { >> format = "3.5"; >> --- a/fs/reiserfs/super.c >> +++ b/fs/reiserfs/super.c >> @@ -35,6 +35,7 @@ struct file_system_type reiserfs_fs_type >> static const char reiserfs_3_5_magic_string[] = REISERFS_SUPER_MAGIC_STRING; >> static const char reiserfs_3_6_magic_string[] = REISER2FS_SUPER_MAGIC_STRING; >> static const char reiserfs_jr_magic_string[] = REISER2FS_JR_SUPER_MAGIC_STRING; >> +static const char reiserfs_3_7_magic_string[] = REISERFS_37_SUPER_MAGIC_STRING; >> >> int is_reiserfs_3_5(struct reiserfs_super_block *rs) >> { >> @@ -48,6 +49,12 @@ int is_reiserfs_3_6(struct reiserfs_supe >> strlen(reiserfs_3_6_magic_string)); >> } >> >> +int is_reiserfs_3_7(struct reiserfs_super_block *rs) >> +{ >> + return !strncmp(rs->s_v1.s_magic, reiserfs_3_7_magic_string, >> + strlen(reiserfs_3_7_magic_string)); >> +} >> + >> int is_reiserfs_jr(struct reiserfs_super_block *rs) >> { >> return !strncmp(rs->s_v1.s_magic, reiserfs_jr_magic_string, >> @@ -57,7 +64,13 @@ int is_reiserfs_jr(struct reiserfs_super >> static int is_any_reiserfs_magic_string(struct reiserfs_super_block *rs) >> { >> return (is_reiserfs_3_5(rs) || is_reiserfs_3_6(rs) || >> - is_reiserfs_jr(rs)); >> + is_reiserfs_3_7(rs) || is_reiserfs_jr(rs)); >> +} >> + >> +int has_nonstandard_journal(struct reiserfs_super_block *rs) >> +{ >> + return is_reiserfs_jr(rs) || >> + (is_reiserfs_3_7(rs) && rs->s_v1.s_journal.jp_journal_dev); >> } >> >> >> > > Actualy this is the same as is_reiserfs_jr(rs), just because (is_reiserfs_3_7(rs) && rs->s_v1.s_journal.jp_journal_dev) is always false, so let's better avoid this stuff.. > Actually the function above is brain damaged. > Journal is non-standard _iff_ it is "relocated" or has length (excluding > journal > header) different from 8192. So it can happen that a partition is "jr" (with > REISER2FS_JR_SUPER_MAGIC_STRING), but has _standard_ journal. > > > >> static int reiserfs_remount(struct super_block *s, int *flags, char *data); >> @@ -1397,6 +1410,10 @@ static int read_super_block(struct super >> "non-standard magic", sb_version(rs)); >> return 1; >> } >> + } else if (is_reiserfs_3_7(rs)) { >> + reiserfs_info(s, "found reiserfs format \"3.7\" " >> + "with %sstandard journal\n", >> + sb_jp_journal_dev(rs) ? "non-" : ""); >> } else >> /* s_version of standard format may contain incorrect information, >> so we just look at the magic string */ >> @@ -1404,6 +1421,7 @@ static int read_super_block(struct super >> "found reiserfs format \"%s\" with standard journal\n", >> is_reiserfs_3_5(rs) ? "3.5" : "3.6"); >> >> >> > > -- To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html