lkml.org 
[lkml]   [2011]   [Jan]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[34-longterm 015/260] ext4: init statistics after journal recovery
    Date
    From: Dmitry Monakhov <dmonakhov@openvz.org>

    commit 84061e07c5fbbbf9dc8aef8fb750fc3a2dfc31f3 upstream.

    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.

    https://bugzilla.kernel.org/show_bug.cgi?id=15768

    Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
    Acked-by: Jan Kara <jack@suse.cz>
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
    Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
    ---
    fs/ext4/super.c | 40 ++++++++++++++++++----------------------
    1 files changed, 18 insertions(+), 22 deletions(-)

    diff --git a/fs/ext4/super.c b/fs/ext4/super.c
    index 00d09f5..d83cdcb 100644
    --- a/fs/ext4/super.c
    +++ b/fs/ext4/super.c
    @@ -2794,24 +2794,6 @@ static int ext4_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,
    - ext4_count_free_blocks(sb));
    - if (!err) {
    - err = percpu_counter_init(&sbi->s_freeinodes_counter,
    - ext4_count_free_inodes(sb));
    - }
    - if (!err) {
    - err = percpu_counter_init(&sbi->s_dirs_counter,
    - ext4_count_dirs(sb));
    - }
    - if (!err) {
    - err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0);
    - }
    - if (err) {
    - ext4_msg(sb, KERN_ERR, "insufficient memory");
    - goto failed_mount3;
    - }
    -
    sbi->s_stripe = ext4_get_stripe_size(sbi);
    sbi->s_max_writeback_mb_bump = 128;

    @@ -2911,6 +2893,20 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
    set_task_ioprio(sbi->s_journal->j_task, journal_ioprio);

    no_journal:
    + err = percpu_counter_init(&sbi->s_freeblocks_counter,
    + ext4_count_free_blocks(sb));
    + if (!err)
    + err = percpu_counter_init(&sbi->s_freeinodes_counter,
    + ext4_count_free_inodes(sb));
    + if (!err)
    + err = percpu_counter_init(&sbi->s_dirs_counter,
    + ext4_count_dirs(sb));
    + if (!err)
    + err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0);
    + if (err) {
    + ext4_msg(sb, KERN_ERR, "insufficient memory");
    + goto failed_mount_wq;
    + }
    if (test_opt(sb, NOBH)) {
    if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) {
    ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - "
    @@ -3060,6 +3056,10 @@ failed_mount_wq:
    jbd2_journal_destroy(sbi->s_journal);
    sbi->s_journal = NULL;
    }
    + percpu_counter_destroy(&sbi->s_freeblocks_counter);
    + percpu_counter_destroy(&sbi->s_freeinodes_counter);
    + percpu_counter_destroy(&sbi->s_dirs_counter);
    + percpu_counter_destroy(&sbi->s_dirtyblocks_counter);
    failed_mount3:
    if (sbi->s_flex_groups) {
    if (is_vmalloc_addr(sbi->s_flex_groups))
    @@ -3067,10 +3067,6 @@ failed_mount3:
    else
    kfree(sbi->s_flex_groups);
    }
    - percpu_counter_destroy(&sbi->s_freeblocks_counter);
    - percpu_counter_destroy(&sbi->s_freeinodes_counter);
    - percpu_counter_destroy(&sbi->s_dirs_counter);
    - percpu_counter_destroy(&sbi->s_dirtyblocks_counter);
    failed_mount2:
    for (i = 0; i < db_count; i++)
    brelse(sbi->s_group_desc[i]);
    --
    1.7.3.3


    \
     
     \ /
      Last update: 2011-01-02 09:09    [W:0.023 / U:30.008 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site