Skip to content

Commit 8d5a803

Browse files
committed
ext4: check for allocation block validity with block group locked
With commit 044e6e3: "ext4: don't update checksum of new initialized bitmaps" the buffer valid bit will get set without actually setting up the checksum for the allocation bitmap, since the checksum will get calculated once we actually allocate an inode or block. If we are doing this, then we need to (re-)check the verified bit after we take the block group lock. Otherwise, we could race with another process reading and verifying the bitmap, which would then complain about the checksum being invalid. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1780137 Signed-off-by: Theodore Ts'o <[email protected]> Cc: [email protected]
1 parent 362eca7 commit 8d5a803

File tree

2 files changed

+6
-0
lines changed

2 files changed

+6
-0
lines changed

fs/ext4/balloc.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,8 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
368368
return -EFSCORRUPTED;
369369

370370
ext4_lock_group(sb, block_group);
371+
if (buffer_verified(bh))
372+
goto verified;
371373
if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group,
372374
desc, bh))) {
373375
ext4_unlock_group(sb, block_group);
@@ -386,6 +388,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
386388
return -EFSCORRUPTED;
387389
}
388390
set_buffer_verified(bh);
391+
verified:
389392
ext4_unlock_group(sb, block_group);
390393
return 0;
391394
}

fs/ext4/ialloc.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,
9090
return -EFSCORRUPTED;
9191

9292
ext4_lock_group(sb, block_group);
93+
if (buffer_verified(bh))
94+
goto verified;
9395
blk = ext4_inode_bitmap(sb, desc);
9496
if (!ext4_inode_bitmap_csum_verify(sb, block_group, desc, bh,
9597
EXT4_INODES_PER_GROUP(sb) / 8)) {
@@ -101,6 +103,7 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,
101103
return -EFSBADCRC;
102104
}
103105
set_buffer_verified(bh);
106+
verified:
104107
ext4_unlock_group(sb, block_group);
105108
return 0;
106109
}

0 commit comments

Comments
 (0)