Commit 0b832a4b93932103d73c0c3f35ef1153e288327b

Authored by Linus Torvalds
1 parent 325d22df7b

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>

Showing 3 changed files with 9 additions and 130 deletions Side-by-side Diff

... ... @@ -69,14 +69,6 @@
69 69 return desc + offset;
70 70 }
71 71  
72   -static inline int
73   -block_in_use(unsigned long block, struct super_block *sb, unsigned char *map)
74   -{
75   - return ext2_test_bit ((block -
76   - le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block)) %
77   - EXT2_BLOCKS_PER_GROUP(sb), map);
78   -}
79   -
80 72 /*
81 73 * Read the bitmap for a given block_group, reading into the specified
82 74 * slot in the superblock's bitmap cache.
83 75  
84 76  
85 77  
86 78  
87 79  
... ... @@ -86,51 +78,20 @@
86 78 static struct buffer_head *
87 79 read_block_bitmap(struct super_block *sb, unsigned int block_group)
88 80 {
89   - int i;
90 81 struct ext2_group_desc * desc;
91 82 struct buffer_head * bh = NULL;
92   - unsigned int bitmap_blk;
93   -
  83 +
94 84 desc = ext2_get_group_desc (sb, block_group, NULL);
95 85 if (!desc)
96   - return NULL;
97   - bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
98   - bh = sb_bread(sb, bitmap_blk);
  86 + goto error_out;
  87 + bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap));
99 88 if (!bh)
100   - ext2_error (sb, __FUNCTION__,
  89 + ext2_error (sb, "read_block_bitmap",
101 90 "Cannot read block bitmap - "
102 91 "block_group = %d, block_bitmap = %u",
103 92 block_group, le32_to_cpu(desc->bg_block_bitmap));
104   -
105   - /* check whether block bitmap block number is set */
106   - if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
107   - /* bad block bitmap */
108   - goto error_out;
109   - }
110   - /* check whether the inode bitmap block number is set */
111   - bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
112   - if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
113   - /* bad block bitmap */
114   - goto error_out;
115   - }
116   - /* check whether the inode table block number is set */
117   - bitmap_blk = le32_to_cpu(desc->bg_inode_table);
118   - for (i = 0; i < EXT2_SB(sb)->s_itb_per_group; i++, bitmap_blk++) {
119   - if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
120   - /* bad block bitmap */
121   - goto error_out;
122   - }
123   - }
124   -
125   - return bh;
126   -
127 93 error_out:
128   - brelse(bh);
129   - ext2_error(sb, __FUNCTION__,
130   - "Invalid block bitmap - "
131   - "block_group = %d, block = %u",
132   - block_group, bitmap_blk);
133   - return NULL;
  94 + return bh;
134 95 }
135 96  
136 97 static void release_blocks(struct super_block *sb, int count)
... ... @@ -1460,7 +1421,6 @@
1460 1421 return desc_count;
1461 1422 #endif
1462 1423 }
1463   -
1464 1424  
1465 1425 static inline int test_root(int a, int b)
1466 1426 {
... ... @@ -80,14 +80,6 @@
80 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 84 * read_block_bitmap()
93 85 * @sb: super block
94 86  
95 87  
96 88  
97 89  
98 90  
... ... @@ -101,51 +93,20 @@
101 93 static struct buffer_head *
102 94 read_block_bitmap(struct super_block *sb, unsigned int block_group)
103 95 {
104   - int i;
105 96 struct ext3_group_desc * desc;
106 97 struct buffer_head * bh = NULL;
107   - ext3_fsblk_t bitmap_blk;
108 98  
109 99 desc = ext3_get_group_desc (sb, block_group, NULL);
110 100 if (!desc)
111   - return NULL;
112   - bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
113   - bh = sb_bread(sb, bitmap_blk);
  101 + goto error_out;
  102 + bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap));
114 103 if (!bh)
115   - ext3_error (sb, __FUNCTION__,
  104 + ext3_error (sb, "read_block_bitmap",
116 105 "Cannot read block bitmap - "
117 106 "block_group = %d, block_bitmap = %u",
118 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 108 error_out:
143   - brelse(bh);
144   - ext3_error(sb, __FUNCTION__,
145   - "Invalid block bitmap - "
146   - "block_group = %d, block = %lu",
147   - block_group, bitmap_blk);
148   - return NULL;
  109 + return bh;
149 110 }
150 111 /*
151 112 * The reservation window structure operations
... ... @@ -1771,7 +1732,6 @@
1771 1732 return desc_count;
1772 1733 #endif
1773 1734 }
1774   -
1775 1735  
1776 1736 static inline int test_root(int a, int b)
1777 1737 {
... ... @@ -189,15 +189,6 @@
189 189 return desc;
190 190 }
191 191  
192   -static inline int
193   -block_in_use(ext4_fsblk_t block, struct super_block *sb, unsigned char *map)
194   -{
195   - ext4_grpblk_t offset;
196   -
197   - ext4_get_group_no_and_offset(sb, block, NULL, &offset);
198   - return ext4_test_bit (offset, map);
199   -}
200   -
201 192 /**
202 193 * read_block_bitmap()
203 194 * @sb: super block
... ... @@ -211,7 +202,6 @@
211 202 struct buffer_head *
212 203 read_block_bitmap(struct super_block *sb, unsigned int block_group)
213 204 {
214   - int i;
215 205 struct ext4_group_desc * desc;
216 206 struct buffer_head * bh = NULL;
217 207 ext4_fsblk_t bitmap_blk;
218 208  
... ... @@ -239,38 +229,7 @@
239 229 "Cannot read block bitmap - "
240 230 "block_group = %d, block_bitmap = %llu",
241 231 block_group, bitmap_blk);
242   -
243   - /* check whether block bitmap block number is set */
244   - if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
245   - /* bad block bitmap */
246   - goto error_out;
247   - }
248   -
249   - /* check whether the inode bitmap block number is set */
250   - bitmap_blk = ext4_inode_bitmap(sb, desc);
251   - if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
252   - /* bad block bitmap */
253   - goto error_out;
254   - }
255   - /* check whether the inode table block number is set */
256   - bitmap_blk = ext4_inode_table(sb, desc);
257   - for (i = 0; i < EXT4_SB(sb)->s_itb_per_group; i++, bitmap_blk++) {
258   - if (!block_in_use(bitmap_blk, sb, bh->b_data)) {
259   - /* bad block bitmap */
260   - goto error_out;
261   - }
262   - }
263   -
264 232 return bh;
265   -
266   -error_out:
267   - brelse(bh);
268   - ext4_error(sb, __FUNCTION__,
269   - "Invalid block bitmap - "
270   - "block_group = %d, block = %llu",
271   - block_group, bitmap_blk);
272   - return NULL;
273   -
274 233 }
275 234 /*
276 235 * The reservation window structure operations