|
@@ -3210,6 +3210,8 @@ int ext4_calculate_overhead(struct super_block *sb)
|
|
|
{
|
|
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
|
struct ext4_super_block *es = sbi->s_es;
|
|
|
+ struct inode *j_inode;
|
|
|
+ unsigned int j_blocks, j_inum = le32_to_cpu(es->s_journal_inum);
|
|
|
ext4_group_t i, ngroups = ext4_get_groups_count(sb);
|
|
|
ext4_fsblk_t overhead = 0;
|
|
|
char *buf = (char *) get_zeroed_page(GFP_NOFS);
|
|
@@ -3240,10 +3242,23 @@ int ext4_calculate_overhead(struct super_block *sb)
|
|
|
memset(buf, 0, PAGE_SIZE);
|
|
|
cond_resched();
|
|
|
}
|
|
|
- /* Add the internal journal blocks as well */
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Add the internal journal blocks whether the journal has been
|
|
|
+ * loaded or not
|
|
|
+ */
|
|
|
if (sbi->s_journal && !sbi->journal_bdev)
|
|
|
overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_maxlen);
|
|
|
-
|
|
|
+ else if (ext4_has_feature_journal(sb) && !sbi->s_journal) {
|
|
|
+ j_inode = ext4_get_journal_inode(sb, j_inum);
|
|
|
+ if (j_inode) {
|
|
|
+ j_blocks = j_inode->i_size >> sb->s_blocksize_bits;
|
|
|
+ overhead += EXT4_NUM_B2C(sbi, j_blocks);
|
|
|
+ iput(j_inode);
|
|
|
+ } else {
|
|
|
+ ext4_msg(sb, KERN_ERR, "can't get journal size");
|
|
|
+ }
|
|
|
+ }
|
|
|
sbi->s_overhead = overhead;
|
|
|
smp_wmb();
|
|
|
free_page((unsigned long) buf);
|