Patch "ext4: fix scheduling in atomic on group checksum failure" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ext4: fix scheduling in atomic on group checksum failure
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ext4-fix-scheduling-in-atomic-on-group-checksum-failure.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
05145bd799e498ce4e3b5145894174ee881f02b0Mon Sep 17 00:00:00 2001
From: Jan Kara <[email protected]>
Date: Thu, 11 Feb 2016 23:15:12 -0500
Subject: ext4: fix scheduling in atomic on group checksum failure
From: Jan Kara <[email protected]>
commit 05145bd799e498ce4e3b5145894174ee881f02b0 upstream.
When block group checksum is wrong, we call ext4_error() while holding group spinlock from ext4_init_block_bitmap() or ext4_init_inode_bitmap() which results in scheduling while in atomic. Fix the issue by calling ext4_error() later after dropping the spinlock.
--- fs/ext4/balloc.c | 7 ++++--- fs/ext4/ialloc.c | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-)
fs/ext4/balloc.c +4 -3
@@ -191,7 +191,6 @@ static int ext4_init_block_bitmap(struct/* If checksum is bad mark all blocks used to prevent allocation * essentially implementing a per-group read-only flag. */ if (!ext4_group_desc_csum_verify (sb, block_group, gdp)) { -ext4_error (sb,"Checksum bad for group %u" , block_group); grp =ext4_get_group_info (sb, block_group);if (!EXT4_MB_GRP_BBITMAP_CORRUPT (grp)) percpu_counter_sub(&sbi->s_freeclusters_counter,
@@ -442,14 +441,16 @@ ext4_read_block_bitmap_nowait(struct sup }ext4_lock_group (sb, block_group);if (desc->bg_flags &cpu_to_le16 (EXT4_BG_BLOCK_UNINIT )) { - err =ext4_init_block_bitmap (sb, bh, block_group, desc);set_bitmap_uptodate (bh);set_buffer_uptodate (bh);ext4_unlock_group (sb, block_group);unlock_buffer (bh); -if (err) +if (err) { +ext4_error (sb,"Failed to init block bitmap for group " +"%u: %d" , block_group, err); goto out; + } goto verify; }ext4_unlock_group (sb, block_group);
fs/ext4/ialloc.c +4 -2
@@ -76,7 +76,6 @@ static int ext4_init_inode_bitmap(struct/* If checksum is bad mark all blocks and inodes use to prevent * allocation, essentially implementing a per-group read-only flag. */ if (!ext4_group_desc_csum_verify (sb, block_group, gdp)) { -ext4_error (sb,"Checksum bad for group %u" , block_group); grp =ext4_get_group_info (sb, block_group);if (!EXT4_MB_GRP_BBITMAP_CORRUPT (grp)) percpu_counter_sub(&sbi->s_freeclusters_counter,
@@ -191,8 +190,11 @@ ext4_read_inode_bitmap(struct super_blocset_buffer_verified (bh);ext4_unlock_group (sb, block_group);unlock_buffer (bh); -if (err) +if (err) { +ext4_error (sb,"Failed to init inode bitmap for group " +"%u: %d" , block_group, err); goto out; + }return bh; }ext4_unlock_group (sb, block_group);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/udf-check-output-buffer-length-when-converting-name-to-cs0.patch queue-4.4/udf-limit-the-maximum-number-of-indirect-extents-in-a-row.patch queue-4.4/ext4-fix-scheduling-in-atomic-on-group-checksum-failure.patch queue-4.4/udf-prevent-buffer-overrun-with-multi-byte-characters.patch