.. | .. |
---|
217 | 217 | struct ext4_system_blocks *system_blks; |
---|
218 | 218 | struct ext4_group_desc *gdp; |
---|
219 | 219 | ext4_group_t i; |
---|
220 | | - int flex_size = ext4_flex_bg_size(sbi); |
---|
221 | 220 | int ret; |
---|
222 | 221 | |
---|
223 | 222 | system_blks = kzalloc(sizeof(*system_blks), GFP_KERNEL); |
---|
.. | .. |
---|
225 | 224 | return -ENOMEM; |
---|
226 | 225 | |
---|
227 | 226 | for (i=0; i < ngroups; i++) { |
---|
| 227 | + unsigned int meta_blks = ext4_num_base_meta_blocks(sb, i); |
---|
| 228 | + |
---|
228 | 229 | cond_resched(); |
---|
229 | | - if (ext4_bg_has_super(sb, i) && |
---|
230 | | - ((i < 5) || ((i % flex_size) == 0))) { |
---|
| 230 | + if (meta_blks != 0) { |
---|
231 | 231 | ret = add_system_zone(system_blks, |
---|
232 | 232 | ext4_group_first_block_no(sb, i), |
---|
233 | | - ext4_bg_num_gdb(sb, i) + 1, 0); |
---|
| 233 | + meta_blks, 0); |
---|
234 | 234 | if (ret) |
---|
235 | 235 | goto err; |
---|
236 | 236 | } |
---|
.. | .. |
---|
294 | 294 | call_rcu(&system_blks->rcu, ext4_destroy_system_zone); |
---|
295 | 295 | } |
---|
296 | 296 | |
---|
297 | | -/* |
---|
298 | | - * Returns 1 if the passed-in block region (start_blk, |
---|
299 | | - * start_blk+count) is valid; 0 if some part of the block region |
---|
300 | | - * overlaps with some other filesystem metadata blocks. |
---|
301 | | - */ |
---|
302 | | -int ext4_inode_block_valid(struct inode *inode, ext4_fsblk_t start_blk, |
---|
303 | | - unsigned int count) |
---|
| 297 | +int ext4_sb_block_valid(struct super_block *sb, struct inode *inode, |
---|
| 298 | + ext4_fsblk_t start_blk, unsigned int count) |
---|
304 | 299 | { |
---|
305 | | - struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
---|
| 300 | + struct ext4_sb_info *sbi = EXT4_SB(sb); |
---|
306 | 301 | struct ext4_system_blocks *system_blks; |
---|
307 | 302 | struct ext4_system_zone *entry; |
---|
308 | 303 | struct rb_node *n; |
---|
.. | .. |
---|
331 | 326 | else if (start_blk >= (entry->start_blk + entry->count)) |
---|
332 | 327 | n = n->rb_right; |
---|
333 | 328 | else { |
---|
334 | | - ret = (entry->ino == inode->i_ino); |
---|
| 329 | + ret = 0; |
---|
| 330 | + if (inode) |
---|
| 331 | + ret = (entry->ino == inode->i_ino); |
---|
335 | 332 | break; |
---|
336 | 333 | } |
---|
337 | 334 | } |
---|
.. | .. |
---|
340 | 337 | return ret; |
---|
341 | 338 | } |
---|
342 | 339 | |
---|
| 340 | +/* |
---|
| 341 | + * Returns 1 if the passed-in block region (start_blk, |
---|
| 342 | + * start_blk+count) is valid; 0 if some part of the block region |
---|
| 343 | + * overlaps with some other filesystem metadata blocks. |
---|
| 344 | + */ |
---|
| 345 | +int ext4_inode_block_valid(struct inode *inode, ext4_fsblk_t start_blk, |
---|
| 346 | + unsigned int count) |
---|
| 347 | +{ |
---|
| 348 | + return ext4_sb_block_valid(inode->i_sb, inode, start_blk, count); |
---|
| 349 | +} |
---|
| 350 | + |
---|
343 | 351 | int ext4_check_blockref(const char *function, unsigned int line, |
---|
344 | 352 | struct inode *inode, __le32 *p, unsigned int max) |
---|
345 | 353 | { |
---|