Commit 0b832a4b authored by Linus Torvalds's avatar Linus Torvalds

Revert "ext2/ext3/ext4: add block bitmap validation"

This reverts commit 7c9e69fa, fixing up
conflicts in fs/ext4/balloc.c manually.

The cost of doing the bitmap validation on each lookup - even when the
bitmap is cached - is absolutely prohibitive.  We could, and probably
should, do it only when adding the bitmap to the buffer cache.  However,
right now we are better off just reverting it.

Peter Zijlstra measured the cost of this extra validation as a 85%
decrease in cached iozone, and while I had a patch that took it down to
just 17% by not being _quite_ so stupid in the validation, it was still
a big slowdown that could have been avoided by just doing it right.

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Aneesh Kumar <aneesh.kumar@linux.vnet.ibm.com>
Cc: Andreas Dilger <adilger@clusterfs.com>
Cc: Mingming Cao <cmm@us.ibm.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 325d22df
...@@ -69,14 +69,6 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, ...@@ -69,14 +69,6 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
return desc + offset; return desc + offset;
} }
static inline int
block_in_use(unsigned long block, struct super_block *sb, unsigned char *map)
{
return ext2_test_bit ((block -
le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block)) %
EXT2_BLOCKS_PER_GROUP(sb), map);
}
/* /*
* Read the bitmap for a given block_group, reading into the specified * Read the bitmap for a given block_group, reading into the specified
* slot in the superblock's bitmap cache. * slot in the superblock's bitmap cache.
...@@ -86,51 +78,20 @@ block_in_use(unsigned long block, struct super_block *sb, unsigned char *map) ...@@ -86,51 +78,20 @@ block_in_use(unsigned long block, struct super_block *sb, unsigned char *map)
static struct buffer_head * static struct buffer_head *
read_block_bitmap(struct super_block *sb, unsigned int block_group) read_block_bitmap(struct super_block *sb, unsigned int block_group)
{ {
int i;
struct ext2_group_desc * desc; struct ext2_group_desc * desc;
struct buffer_head * bh = NULL; struct buffer_head * bh = NULL;
unsigned int bitmap_blk;
desc = ext2_get_group_desc (sb, block_group, NULL); desc = ext2_get_group_desc (sb, block_group, NULL);
if (!desc) if (!desc)
return NULL; goto error_out;
bitmap_blk = le32_to_cpu(desc->bg_block_bitmap); bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap));
bh = sb_bread(sb, bitmap_blk);
if (!bh) if (!bh)
ext2_error (sb, __FUNCTION__, ext2_error (sb, "read_block_bitmap",
"Cannot read block bitmap - " "Cannot read block bitmap - "
"block_group = %d, block_bitmap = %u", "block_group = %d, block_bitmap = %u",
block_group, le32_to_cpu(desc->bg_block_bitmap)); block_group, le32_to_cpu(desc->bg_block_bitmap));
/* check whether block bitmap block number is set */
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
/* check whether the inode bitmap block number is set */
bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
/* check whether the inode table block number is set */
bitmap_blk = le32_to_cpu(desc->bg_inode_table);
for (i = 0; i < EXT2_SB(sb)->s_itb_per_group; i++, bitmap_blk++) {
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
}
return bh;
error_out: error_out:
brelse(bh); return bh;
ext2_error(sb, __FUNCTION__,
"Invalid block bitmap - "
"block_group = %d, block = %u",
block_group, bitmap_blk);
return NULL;
} }
static void release_blocks(struct super_block *sb, int count) static void release_blocks(struct super_block *sb, int count)
...@@ -1461,7 +1422,6 @@ unsigned long ext2_count_free_blocks (struct super_block * sb) ...@@ -1461,7 +1422,6 @@ unsigned long ext2_count_free_blocks (struct super_block * sb)
#endif #endif
} }
static inline int test_root(int a, int b) static inline int test_root(int a, int b)
{ {
int num = b; int num = b;
......
...@@ -80,14 +80,6 @@ struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, ...@@ -80,14 +80,6 @@ struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
return desc + offset; return desc + offset;
} }
static inline int
block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map)
{
return ext3_test_bit ((block -
le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) %
EXT3_BLOCKS_PER_GROUP(sb), map);
}
/** /**
* read_block_bitmap() * read_block_bitmap()
* @sb: super block * @sb: super block
...@@ -101,51 +93,20 @@ block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map) ...@@ -101,51 +93,20 @@ block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map)
static struct buffer_head * static struct buffer_head *
read_block_bitmap(struct super_block *sb, unsigned int block_group) read_block_bitmap(struct super_block *sb, unsigned int block_group)
{ {
int i;
struct ext3_group_desc * desc; struct ext3_group_desc * desc;
struct buffer_head * bh = NULL; struct buffer_head * bh = NULL;
ext3_fsblk_t bitmap_blk;
desc = ext3_get_group_desc (sb, block_group, NULL); desc = ext3_get_group_desc (sb, block_group, NULL);
if (!desc) if (!desc)
return NULL; goto error_out;
bitmap_blk = le32_to_cpu(desc->bg_block_bitmap); bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap));
bh = sb_bread(sb, bitmap_blk);
if (!bh) if (!bh)
ext3_error (sb, __FUNCTION__, ext3_error (sb, "read_block_bitmap",
"Cannot read block bitmap - " "Cannot read block bitmap - "
"block_group = %d, block_bitmap = %u", "block_group = %d, block_bitmap = %u",
block_group, le32_to_cpu(desc->bg_block_bitmap)); block_group, le32_to_cpu(desc->bg_block_bitmap));
/* check whether block bitmap block number is set */
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
/* check whether the inode bitmap block number is set */
bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
/* check whether the inode table block number is set */
bitmap_blk = le32_to_cpu(desc->bg_inode_table);
for (i = 0; i < EXT3_SB(sb)->s_itb_per_group; i++, bitmap_blk++) {
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
}
return bh;
error_out: error_out:
brelse(bh); return bh;
ext3_error(sb, __FUNCTION__,
"Invalid block bitmap - "
"block_group = %d, block = %lu",
block_group, bitmap_blk);
return NULL;
} }
/* /*
* The reservation window structure operations * The reservation window structure operations
...@@ -1772,7 +1733,6 @@ ext3_fsblk_t ext3_count_free_blocks(struct super_block *sb) ...@@ -1772,7 +1733,6 @@ ext3_fsblk_t ext3_count_free_blocks(struct super_block *sb)
#endif #endif
} }
static inline int test_root(int a, int b) static inline int test_root(int a, int b)
{ {
int num = b; int num = b;
......
...@@ -189,15 +189,6 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb, ...@@ -189,15 +189,6 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
return desc; return desc;
} }
static inline int
block_in_use(ext4_fsblk_t block, struct super_block *sb, unsigned char *map)
{
ext4_grpblk_t offset;
ext4_get_group_no_and_offset(sb, block, NULL, &offset);
return ext4_test_bit (offset, map);
}
/** /**
* read_block_bitmap() * read_block_bitmap()
* @sb: super block * @sb: super block
...@@ -211,7 +202,6 @@ block_in_use(ext4_fsblk_t block, struct super_block *sb, unsigned char *map) ...@@ -211,7 +202,6 @@ block_in_use(ext4_fsblk_t block, struct super_block *sb, unsigned char *map)
struct buffer_head * struct buffer_head *
read_block_bitmap(struct super_block *sb, unsigned int block_group) read_block_bitmap(struct super_block *sb, unsigned int block_group)
{ {
int i;
struct ext4_group_desc * desc; struct ext4_group_desc * desc;
struct buffer_head * bh = NULL; struct buffer_head * bh = NULL;
ext4_fsblk_t bitmap_blk; ext4_fsblk_t bitmap_blk;
...@@ -239,38 +229,7 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group) ...@@ -239,38 +229,7 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group)
"Cannot read block bitmap - " "Cannot read block bitmap - "
"block_group = %d, block_bitmap = %llu", "block_group = %d, block_bitmap = %llu",
block_group, bitmap_blk); block_group, bitmap_blk);
/* check whether block bitmap block number is set */
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
/* check whether the inode bitmap block number is set */
bitmap_blk = ext4_inode_bitmap(sb, desc);
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
/* check whether the inode table block number is set */
bitmap_blk = ext4_inode_table(sb, desc);
for (i = 0; i < EXT4_SB(sb)->s_itb_per_group; i++, bitmap_blk++) {
if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
/* bad block bitmap */
goto error_out;
}
}
return bh; return bh;
error_out:
brelse(bh);
ext4_error(sb, __FUNCTION__,
"Invalid block bitmap - "
"block_group = %d, block = %llu",
block_group, bitmap_blk);
return NULL;
} }
/* /*
* The reservation window structure operations * The reservation window structure operations
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment