diff options
author | Theodore Ts'o <tytso@mit.edu> | 2009-05-17 15:38:01 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-05-17 15:38:01 -0400 |
commit | 6fd058f7791087648c683eb8572edf3be3c4c23c (patch) | |
tree | 0d80791532d2d022c91f20013003716eaf0afb40 /fs/ext4/mballoc.c | |
parent | 2ac3b6e00acb46406c993d57921f86a594aafe08 (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.c | 11 |
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. |