ext4: init statistics after journal recovery
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>
This commit is contained in:
parent
d17413c08c
commit
84061e07c5
@ -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));
|
get_random_bytes(&sbi->s_next_generation, sizeof(u32));
|
||||||
spin_lock_init(&sbi->s_next_gen_lock);
|
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_stripe = ext4_get_stripe_size(sbi);
|
||||||
sbi->s_max_writeback_mb_bump = 128;
|
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);
|
set_task_ioprio(sbi->s_journal->j_task, journal_ioprio);
|
||||||
|
|
||||||
no_journal:
|
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, NOBH)) {
|
||||||
if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) {
|
if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) {
|
||||||
ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - "
|
ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - "
|
||||||
@ -3060,6 +3056,10 @@ failed_mount_wq:
|
|||||||
jbd2_journal_destroy(sbi->s_journal);
|
jbd2_journal_destroy(sbi->s_journal);
|
||||||
sbi->s_journal = NULL;
|
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:
|
failed_mount3:
|
||||||
if (sbi->s_flex_groups) {
|
if (sbi->s_flex_groups) {
|
||||||
if (is_vmalloc_addr(sbi->s_flex_groups))
|
if (is_vmalloc_addr(sbi->s_flex_groups))
|
||||||
@ -3067,10 +3067,6 @@ failed_mount3:
|
|||||||
else
|
else
|
||||||
kfree(sbi->s_flex_groups);
|
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:
|
failed_mount2:
|
||||||
for (i = 0; i < db_count; i++)
|
for (i = 0; i < db_count; i++)
|
||||||
brelse(sbi->s_group_desc[i]);
|
brelse(sbi->s_group_desc[i]);
|
||||||
|
Loading…
Reference in New Issue
Block a user