aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2014-05-12 10:17:55 -0400
committerTheodore Ts'o <tytso@mit.edu>2014-05-12 10:17:55 -0400
commite674e5cbd0942b42a12106ac0be8330f4301bef4 (patch)
tree6ffbdb5efe9394a855716435562495c3b6065011 /fs/ext4
parent1beeef1b5643a16a07a465632a2cf984a4ef2119 (diff)
ext4: fix block bitmap validation when bigalloc, ^flex_bg
On a bigalloc,^flex_bg filesystem, the ext4_valid_block_bitmap function fails to convert from blocks to clusters when spot-checking the validity of the bitmap block that we've just read from disk. This causes ext4 to think that the bitmap is garbage, which results in the block group being taken offline when it's not necessary. Add in the necessary EXT4_B2C() calls to perform the conversions. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/balloc.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
index a4950e91f61c..59c3ba8bb8ea 100644
--- a/fs/ext4/balloc.c
+++ b/fs/ext4/balloc.c
@@ -307,6 +307,7 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb,
307 ext4_group_t block_group, 307 ext4_group_t block_group,
308 struct buffer_head *bh) 308 struct buffer_head *bh)
309{ 309{
310 struct ext4_sb_info *sbi = EXT4_SB(sb);
310 ext4_grpblk_t offset; 311 ext4_grpblk_t offset;
311 ext4_grpblk_t next_zero_bit; 312 ext4_grpblk_t next_zero_bit;
312 ext4_fsblk_t blk; 313 ext4_fsblk_t blk;
@@ -326,14 +327,14 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb,
326 /* check whether block bitmap block number is set */ 327 /* check whether block bitmap block number is set */
327 blk = ext4_block_bitmap(sb, desc); 328 blk = ext4_block_bitmap(sb, desc);
328 offset = blk - group_first_block; 329 offset = blk - group_first_block;
329 if (!ext4_test_bit(offset, bh->b_data)) 330 if (!ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data))
330 /* bad block bitmap */ 331 /* bad block bitmap */
331 return blk; 332 return blk;
332 333
333 /* check whether the inode bitmap block number is set */ 334 /* check whether the inode bitmap block number is set */
334 blk = ext4_inode_bitmap(sb, desc); 335 blk = ext4_inode_bitmap(sb, desc);
335 offset = blk - group_first_block; 336 offset = blk - group_first_block;
336 if (!ext4_test_bit(offset, bh->b_data)) 337 if (!ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data))
337 /* bad block bitmap */ 338 /* bad block bitmap */
338 return blk; 339 return blk;
339 340
@@ -341,9 +342,10 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb,
341 blk = ext4_inode_table(sb, desc); 342 blk = ext4_inode_table(sb, desc);
342 offset = blk - group_first_block; 343 offset = blk - group_first_block;
343 next_zero_bit = ext4_find_next_zero_bit(bh->b_data, 344 next_zero_bit = ext4_find_next_zero_bit(bh->b_data,
344 offset + EXT4_SB(sb)->s_itb_per_group, 345 EXT4_B2C(sbi, offset + EXT4_SB(sb)->s_itb_per_group),
345 offset); 346 EXT4_B2C(sbi, offset));
346 if (next_zero_bit < offset + EXT4_SB(sb)->s_itb_per_group) 347 if (next_zero_bit <
348 EXT4_B2C(sbi, offset + EXT4_SB(sb)->s_itb_per_group))
347 /* bad bitmap for inode tables */ 349 /* bad bitmap for inode tables */
348 return blk; 350 return blk;
349 return 0; 351 return 0;