]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/2.6.32.17/0041-ext4-init-statistics-after-journal-recovery.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 2.6.32.17 / 0041-ext4-init-statistics-after-journal-recovery.patch
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
5
6 commit 84061e07c5fbbbf9dc8aef8fb750fc3a2dfc31f3 upstream (as of v2.6.34-git13)
7
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
11 accounting.
12
13 https://bugzilla.kernel.org/show_bug.cgi?id=15768
14
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>
19 ---
20 fs/ext4/super.c | 41 ++++++++++++++++++-----------------------
21 1 file changed, 18 insertions(+), 23 deletions(-)
22
23 --- a/fs/ext4/super.c
24 +++ b/fs/ext4/super.c
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);
28
29 - err = percpu_counter_init(&sbi->s_freeblocks_counter,
30 - ext4_count_free_blocks(sb));
31 - if (!err) {
32 - err = percpu_counter_init(&sbi->s_freeinodes_counter,
33 - ext4_count_free_inodes(sb));
34 - }
35 - if (!err) {
36 - err = percpu_counter_init(&sbi->s_dirs_counter,
37 - ext4_count_dirs(sb));
38 - }
39 - if (!err) {
40 - err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0);
41 - }
42 - if (err) {
43 - ext4_msg(sb, KERN_ERR, "insufficient memory");
44 - goto failed_mount3;
45 - }
46 -
47 sbi->s_stripe = ext4_get_stripe_size(sbi);
48 sbi->s_max_writeback_mb_bump = 128;
49
50 @@ -2832,7 +2814,20 @@ static int ext4_fill_super(struct super_
51 set_task_ioprio(sbi->s_journal->j_task, journal_ioprio);
52
53 no_journal:
54 -
55 + err = percpu_counter_init(&sbi->s_freeblocks_counter,
56 + ext4_count_free_blocks(sb));
57 + if (!err)
58 + err = percpu_counter_init(&sbi->s_freeinodes_counter,
59 + ext4_count_free_inodes(sb));
60 + if (!err)
61 + err = percpu_counter_init(&sbi->s_dirs_counter,
62 + ext4_count_dirs(sb));
63 + if (!err)
64 + err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0);
65 + if (err) {
66 + ext4_msg(sb, KERN_ERR, "insufficient memory");
67 + goto failed_mount_wq;
68 + }
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;
75 }
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);
80 failed_mount3:
81 if (sbi->s_flex_groups) {
82 if (is_vmalloc_addr(sbi->s_flex_groups))
83 @@ -2972,10 +2971,6 @@ failed_mount3:
84 else
85 kfree(sbi->s_flex_groups);
86 }
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);
91 failed_mount2:
92 for (i = 0; i < db_count; i++)
93 brelse(sbi->s_group_desc[i]);