On Mon 12-04-10 23:12:55, Dmitry Monakhov wrote: > Currently block/inode/dir counters initialized before journal was > recovered. In fact after journal recovery this info will probably > change. And freeblocks it critical for correct delalloc mode > accounting. > BUG:#15768 Thanks for the patch. Could you please also rename failed_mount4 to failed_mount3 so that the label numbering is continguous? Otherwise the patch is fine. Honza > Signed-off-by: Dmitry Monakhov <dmonakhov@xxxxxxxxxx> > --- > fs/ext3/super.c | 38 ++++++++++++++++++-------------------- > 1 files changed, 18 insertions(+), 20 deletions(-) > > diff --git a/fs/ext3/super.c b/fs/ext3/super.c > index e844acc..613b5ed 100644 > --- a/fs/ext3/super.c > +++ b/fs/ext3/super.c > @@ -1890,21 +1890,6 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) > get_random_bytes(&sbi->s_next_generation, sizeof(u32)); > spin_lock_init(&sbi->s_next_gen_lock); > > - err = percpu_counter_init(&sbi->s_freeblocks_counter, > - ext3_count_free_blocks(sb)); > - if (!err) { > - err = percpu_counter_init(&sbi->s_freeinodes_counter, > - ext3_count_free_inodes(sb)); > - } > - if (!err) { > - err = percpu_counter_init(&sbi->s_dirs_counter, > - ext3_count_dirs(sb)); > - } > - if (err) { > - ext3_msg(sb, KERN_ERR, "error: insufficient memory"); > - goto failed_mount3; > - } > - > /* per fileystem reservation list head & lock */ > spin_lock_init(&sbi->s_rsv_window_lock); > sbi->s_rsv_window_root = RB_ROOT; > @@ -1945,16 +1930,30 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) > if (!test_opt(sb, NOLOAD) && > EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL)) { > if (ext3_load_journal(sb, es, journal_devnum)) > - goto failed_mount3; > + goto failed_mount2; > } else if (journal_inum) { > if (ext3_create_journal(sb, es, journal_inum)) > - goto failed_mount3; > + goto failed_mount2; > } else { > if (!silent) > ext3_msg(sb, KERN_ERR, > "error: no journal found. " > "mounting ext3 over ext2?"); > - goto failed_mount3; > + goto failed_mount2; > + } > + err = percpu_counter_init(&sbi->s_freeblocks_counter, > + ext3_count_free_blocks(sb)); > + if (!err) { > + err = percpu_counter_init(&sbi->s_freeinodes_counter, > + ext3_count_free_inodes(sb)); > + } > + if (!err) { > + err = percpu_counter_init(&sbi->s_dirs_counter, > + ext3_count_dirs(sb)); > + } > + if (err) { > + ext3_msg(sb, KERN_ERR, "error: insufficient memory"); > + goto failed_mount4; > } > > /* We have now updated the journal if required, so we can > @@ -2040,11 +2039,10 @@ cantfind_ext3: > goto failed_mount; > > failed_mount4: > - journal_destroy(sbi->s_journal); > -failed_mount3: > percpu_counter_destroy(&sbi->s_freeblocks_counter); > percpu_counter_destroy(&sbi->s_freeinodes_counter); > percpu_counter_destroy(&sbi->s_dirs_counter); > + journal_destroy(sbi->s_journal); > failed_mount2: > for (i = 0; i < db_count; i++) > brelse(sbi->s_group_desc[i]); > -- > 1.6.6.1 > -- Jan Kara <jack@xxxxxxx> SUSE Labs, CR -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html