Commit 48d9eb97 authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Theodore Ts'o

ext4: error out if verifying the block bitmap fails

The block bitmap verification code assumes that calling ext4_error()
either panics the system or makes the fs readonly.  However, this is
not always true: when 'errors=continue' is specified, an error is
printed but we don't return any indication of error to the caller,
which is (probably) the block allocator, which pretends that the crud
we read in off the disk is a usable bitmap.  Yuck.

A block bitmap that fails the check should at least return no bitmap
to the caller.  The block allocator should be told to go look in a
different group, but that's a separate issue.

The easiest way to reproduce this is to modify bg_block_bitmap (on a
^flex_bg fs) to point to a block outside the block group; or you can
create a metadata_csum filesystem and zero out the block bitmaps.
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 18a6ea1e
...@@ -445,7 +445,10 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group) ...@@ -445,7 +445,10 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group)
return bh; return bh;
verify: verify:
ext4_validate_block_bitmap(sb, desc, block_group, bh); ext4_validate_block_bitmap(sb, desc, block_group, bh);
return bh; if (buffer_verified(bh))
return bh;
put_bh(bh);
return NULL;
} }
/* Returns 0 on success, 1 on error */ /* Returns 0 on success, 1 on error */
...@@ -469,7 +472,8 @@ int ext4_wait_block_bitmap(struct super_block *sb, ext4_group_t block_group, ...@@ -469,7 +472,8 @@ int ext4_wait_block_bitmap(struct super_block *sb, ext4_group_t block_group,
clear_buffer_new(bh); clear_buffer_new(bh);
/* Panic or remount fs read-only if block bitmap is invalid */ /* Panic or remount fs read-only if block bitmap is invalid */
ext4_validate_block_bitmap(sb, desc, block_group, bh); ext4_validate_block_bitmap(sb, desc, block_group, bh);
return 0; /* ...but check for error just in case errors=continue. */
return !buffer_verified(bh);
} }
struct buffer_head * struct buffer_head *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment