提交 0b832a4b 编写于 作者: L 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: NLinus Torvalds <torvalds@linux-foundation.org>
上级 325d22df
......@@ -69,14 +69,6 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
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
* slot in the superblock's bitmap cache.
......@@ -86,51 +78,20 @@ block_in_use(unsigned long block, struct super_block *sb, unsigned char *map)
static struct buffer_head *
read_block_bitmap(struct super_block *sb, unsigned int block_group)
{
int i;
struct ext2_group_desc * desc;
struct buffer_head * bh = NULL;
unsigned int bitmap_blk;
desc = ext2_get_group_desc (sb, block_group, NULL);
if (!desc)
return NULL;
bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
bh = sb_bread(sb, bitmap_blk);
goto error_out;
bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap));
if (!bh)
ext2_error (sb, __FUNCTION__,
ext2_error (sb, "read_block_bitmap",
"Cannot read block bitmap - "
"block_group = %d, block_bitmap = %u",
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:
brelse(bh);
ext2_error(sb, __FUNCTION__,
"Invalid block bitmap - "
"block_group = %d, block = %u",
block_group, bitmap_blk);
return NULL;
return bh;
}
static void release_blocks(struct super_block *sb, int count)
......@@ -1461,7 +1422,6 @@ unsigned long ext2_count_free_blocks (struct super_block * sb)
#endif
}
static inline int test_root(int a, int b)
{
int num = b;
......
......@@ -80,14 +80,6 @@ struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
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()
* @sb: super block
......@@ -101,51 +93,20 @@ block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map)
static struct buffer_head *
read_block_bitmap(struct super_block *sb, unsigned int block_group)
{
int i;
struct ext3_group_desc * desc;
struct buffer_head * bh = NULL;
ext3_fsblk_t bitmap_blk;
desc = ext3_get_group_desc (sb, block_group, NULL);
if (!desc)
return NULL;
bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
bh = sb_bread(sb, bitmap_blk);
goto error_out;
bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap));
if (!bh)
ext3_error (sb, __FUNCTION__,
ext3_error (sb, "read_block_bitmap",
"Cannot read block bitmap - "
"block_group = %d, block_bitmap = %u",
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:
brelse(bh);
ext3_error(sb, __FUNCTION__,
"Invalid block bitmap - "
"block_group = %d, block = %lu",
block_group, bitmap_blk);
return NULL;
return bh;
}
/*
* The reservation window structure operations
......@@ -1772,7 +1733,6 @@ ext3_fsblk_t ext3_count_free_blocks(struct super_block *sb)
#endif
}
static inline int test_root(int a, int b)
{
int num = b;
......
......@@ -189,15 +189,6 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
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()
* @sb: super block
......@@ -211,7 +202,6 @@ block_in_use(ext4_fsblk_t block, struct super_block *sb, unsigned char *map)
struct buffer_head *
read_block_bitmap(struct super_block *sb, unsigned int block_group)
{
int i;
struct ext4_group_desc * desc;
struct buffer_head * bh = NULL;
ext4_fsblk_t bitmap_blk;
......@@ -239,38 +229,7 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group)
"Cannot read block bitmap - "
"block_group = %d, block_bitmap = %llu",
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;
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册