1 From 73337c4a1e35c3dedceb9e2d3af84da8614e6a45 Mon Sep 17 00:00:00 2001
2 From: Dmitry Monakhov <dmonakhov@openvz.org>
3 Date: Sun, 30 May 2010 22:49:55 -0400
4 Subject: ext4: init statistics after journal recovery
6 commit 84061e07c5fbbbf9dc8aef8fb750fc3a2dfc31f3 upstream (as of v2.6.34-git13)
8 Currently block/inode/dir counters initialized before journal was
9 recovered. In fact after journal recovery this info will probably
10 change. And freeblocks it critical for correct delalloc mode
13 https://bugzilla.kernel.org/show_bug.cgi?id=15768
15 Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
16 Acked-by: Jan Kara <jack@suse.cz>
17 Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
18 Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
20 fs/ext4/super.c | 41 ++++++++++++++++++-----------------------
21 1 file changed, 18 insertions(+), 23 deletions(-)
25 @@ -2695,24 +2695,6 @@ static int ext4_fill_super(struct super_
26 get_random_bytes(&sbi->s_next_generation, sizeof(u32));
27 spin_lock_init(&sbi->s_next_gen_lock);
29 - err = percpu_counter_init(&sbi->s_freeblocks_counter,
30 - ext4_count_free_blocks(sb));
32 - err = percpu_counter_init(&sbi->s_freeinodes_counter,
33 - ext4_count_free_inodes(sb));
36 - err = percpu_counter_init(&sbi->s_dirs_counter,
37 - ext4_count_dirs(sb));
40 - err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0);
43 - ext4_msg(sb, KERN_ERR, "insufficient memory");
47 sbi->s_stripe = ext4_get_stripe_size(sbi);
48 sbi->s_max_writeback_mb_bump = 128;
50 @@ -2832,7 +2814,20 @@ static int ext4_fill_super(struct super_
51 set_task_ioprio(sbi->s_journal->j_task, journal_ioprio);
55 + err = percpu_counter_init(&sbi->s_freeblocks_counter,
56 + ext4_count_free_blocks(sb));
58 + err = percpu_counter_init(&sbi->s_freeinodes_counter,
59 + ext4_count_free_inodes(sb));
61 + err = percpu_counter_init(&sbi->s_dirs_counter,
62 + ext4_count_dirs(sb));
64 + err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0);
66 + ext4_msg(sb, KERN_ERR, "insufficient memory");
67 + goto failed_mount_wq;
69 if (test_opt(sb, NOBH)) {
70 if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) {
71 ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - "
72 @@ -2965,6 +2960,10 @@ failed_mount_wq:
73 jbd2_journal_destroy(sbi->s_journal);
74 sbi->s_journal = NULL;
76 + percpu_counter_destroy(&sbi->s_freeblocks_counter);
77 + percpu_counter_destroy(&sbi->s_freeinodes_counter);
78 + percpu_counter_destroy(&sbi->s_dirs_counter);
79 + percpu_counter_destroy(&sbi->s_dirtyblocks_counter);
81 if (sbi->s_flex_groups) {
82 if (is_vmalloc_addr(sbi->s_flex_groups))
83 @@ -2972,10 +2971,6 @@ failed_mount3:
85 kfree(sbi->s_flex_groups);
87 - percpu_counter_destroy(&sbi->s_freeblocks_counter);
88 - percpu_counter_destroy(&sbi->s_freeinodes_counter);
89 - percpu_counter_destroy(&sbi->s_dirs_counter);
90 - percpu_counter_destroy(&sbi->s_dirtyblocks_counter);
92 for (i = 0; i < db_count; i++)
93 brelse(sbi->s_group_desc[i]);