diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-13 11:07:31 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-13 11:09:11 -0500 |
commit | 0b832a4b93932103d73c0c3f35ef1153e288327b (patch) | |
tree | 77ca1ff445287685dbebf448fdf172d3f951ed89 /fs/ext3/balloc.c | |
parent | 325d22df7b19e0116aff3391d3a03f73d0634ded (diff) |
Revert "ext2/ext3/ext4: add block bitmap validation"
This reverts commit 7c9e69faa28027913ee059c285a5ea8382e24b5d, 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: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/ext3/balloc.c')
-rw-r--r-- | fs/ext3/balloc.c | 48 |
1 files changed, 4 insertions, 44 deletions
diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index 7a87d15523be..a8ba7e831278 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c | |||
@@ -80,14 +80,6 @@ struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, | |||
80 | return desc + offset; | 80 | return desc + offset; |
81 | } | 81 | } |
82 | 82 | ||
83 | static inline int | ||
84 | block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map) | ||
85 | { | ||
86 | return ext3_test_bit ((block - | ||
87 | le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) % | ||
88 | EXT3_BLOCKS_PER_GROUP(sb), map); | ||
89 | } | ||
90 | |||
91 | /** | 83 | /** |
92 | * read_block_bitmap() | 84 | * read_block_bitmap() |
93 | * @sb: super block | 85 | * @sb: super block |
@@ -101,51 +93,20 @@ block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map) | |||
101 | static struct buffer_head * | 93 | static struct buffer_head * |
102 | read_block_bitmap(struct super_block *sb, unsigned int block_group) | 94 | read_block_bitmap(struct super_block *sb, unsigned int block_group) |
103 | { | 95 | { |
104 | int i; | ||
105 | struct ext3_group_desc * desc; | 96 | struct ext3_group_desc * desc; |
106 | struct buffer_head * bh = NULL; | 97 | struct buffer_head * bh = NULL; |
107 | ext3_fsblk_t bitmap_blk; | ||
108 | 98 | ||
109 | desc = ext3_get_group_desc (sb, block_group, NULL); | 99 | desc = ext3_get_group_desc (sb, block_group, NULL); |
110 | if (!desc) | 100 | if (!desc) |
111 | return NULL; | 101 | goto error_out; |
112 | bitmap_blk = le32_to_cpu(desc->bg_block_bitmap); | 102 | bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap)); |
113 | bh = sb_bread(sb, bitmap_blk); | ||
114 | if (!bh) | 103 | if (!bh) |
115 | ext3_error (sb, __FUNCTION__, | 104 | ext3_error (sb, "read_block_bitmap", |
116 | "Cannot read block bitmap - " | 105 | "Cannot read block bitmap - " |
117 | "block_group = %d, block_bitmap = %u", | 106 | "block_group = %d, block_bitmap = %u", |
118 | block_group, le32_to_cpu(desc->bg_block_bitmap)); | 107 | block_group, le32_to_cpu(desc->bg_block_bitmap)); |
119 | |||
120 | /* check whether block bitmap block number is set */ | ||
121 | if (!block_in_use(bitmap_blk, sb, bh->b_data)) { | ||
122 | /* bad block bitmap */ | ||
123 | goto error_out; | ||
124 | } | ||
125 | /* check whether the inode bitmap block number is set */ | ||
126 | bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap); | ||
127 | if (!block_in_use(bitmap_blk, sb, bh->b_data)) { | ||
128 | /* bad block bitmap */ | ||
129 | goto error_out; | ||
130 | } | ||
131 | /* check whether the inode table block number is set */ | ||
132 | bitmap_blk = le32_to_cpu(desc->bg_inode_table); | ||
133 | for (i = 0; i < EXT3_SB(sb)->s_itb_per_group; i++, bitmap_blk++) { | ||
134 | if (!block_in_use(bitmap_blk, sb, bh->b_data)) { | ||
135 | /* bad block bitmap */ | ||
136 | goto error_out; | ||
137 | } | ||
138 | } | ||
139 | |||
140 | return bh; | ||
141 | |||
142 | error_out: | 108 | error_out: |
143 | brelse(bh); | 109 | return bh; |
144 | ext3_error(sb, __FUNCTION__, | ||
145 | "Invalid block bitmap - " | ||
146 | "block_group = %d, block = %lu", | ||
147 | block_group, bitmap_blk); | ||
148 | return NULL; | ||
149 | } | 110 | } |
150 | /* | 111 | /* |
151 | * The reservation window structure operations | 112 | * The reservation window structure operations |
@@ -1772,7 +1733,6 @@ ext3_fsblk_t ext3_count_free_blocks(struct super_block *sb) | |||
1772 | #endif | 1733 | #endif |
1773 | } | 1734 | } |
1774 | 1735 | ||
1775 | |||
1776 | static inline int test_root(int a, int b) | 1736 | static inline int test_root(int a, int b) |
1777 | { | 1737 | { |
1778 | int num = b; | 1738 | int num = b; |