aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/mballoc.c
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2009-05-17 15:38:01 -0400
committerTheodore Ts'o <tytso@mit.edu>2009-05-17 15:38:01 -0400
commit6fd058f7791087648c683eb8572edf3be3c4c23c (patch)
tree0d80791532d2d022c91f20013003716eaf0afb40 /fs/ext4/mballoc.c
parent2ac3b6e00acb46406c993d57921f86a594aafe08 (diff)
ext4: Add a comprehensive block validity check to ext4_get_blocks()
To catch filesystem bugs or corruption which could lead to the filesystem getting severly damaged, this patch adds a facility for tracking all of the filesystem metadata blocks by contiguous regions in a red-black tree. This allows quick searching of the tree to locate extents which might overlap with filesystem metadata blocks. This facility is also used by the multi-block allocator to assure that it is not allocating blocks out of the system zone, as well as by the routines used when reading indirect blocks and extents information from disk to make sure their contents are valid. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/mballoc.c')
-rw-r--r--fs/ext4/mballoc.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 541bd9adffa2..ed8482e22c0e 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -2961,15 +2961,10 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
2961 + le32_to_cpu(es->s_first_data_block); 2961 + le32_to_cpu(es->s_first_data_block);
2962 2962
2963 len = ac->ac_b_ex.fe_len; 2963 len = ac->ac_b_ex.fe_len;
2964 if (in_range(ext4_block_bitmap(sb, gdp), block, len) || 2964 if (!ext4_data_block_valid(sbi, block, len)) {
2965 in_range(ext4_inode_bitmap(sb, gdp), block, len) ||
2966 in_range(block, ext4_inode_table(sb, gdp),
2967 EXT4_SB(sb)->s_itb_per_group) ||
2968 in_range(block + len - 1, ext4_inode_table(sb, gdp),
2969 EXT4_SB(sb)->s_itb_per_group)) {
2970 ext4_error(sb, __func__, 2965 ext4_error(sb, __func__,
2971 "Allocating block %llu in system zone of %d group\n", 2966 "Allocating blocks %llu-%llu which overlap "
2972 block, ac->ac_b_ex.fe_group); 2967 "fs metadata\n", block, block+len);
2973 /* File system mounted not to panic on error 2968 /* File system mounted not to panic on error
2974 * Fix the bitmap and repeat the block allocation 2969 * Fix the bitmap and repeat the block allocation
2975 * We leak some of the blocks here. 2970 * We leak some of the blocks here.