ext4: avoid allocating blocks from corrupted group in ext4_mb_try_best_found()
Sasha Levin
maintainerPATCH 1/3 ext4: avoid allocating blocks from corrupted group in ext4_mb_try_best_found()
From: Baokun Li <[email protected]>
[ Upstream commit 4530b3660d396a646aad91a787b6ab37cf604b53 ]
Determine if the group block bitmap is corrupted before using ac_b_ex in ext4_mb_try_best_found() to avoid allocating blocks from a group with a corrupted block bitmap in the following concurrency and making the situation worse.
ext4_mb_regular_allocator
ext4_lock_group(sb, group)
ext4_mb_good_group
// check if the group bbitmap is corrupted
ext4_mb_complex_scan_group
// Scan group gets ac_b_ex but doesn't use it
ext4_unlock_group(sb, group)
ext4_mark_group_bitmap_corrupted(group)
// The block bitmap was corrupted during
// the group unlock gap.
ext4_mb_try_best_found
ext4_lock_group(ac->ac_sb, group)
ext4_mb_use_best_found
mb_mark_used
// Allocating blocks in block bitmap corrupted group--- fs/ext4/mballoc.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/ext4/mballoc.c +4 -0
@@ -1802,6 +1802,9 @@ int ext4_mb_try_best_found(struct ext4_allocation_context *ac,return err;ext4_lock_group (ac->ac_sb, group); +if (unlikely (EXT4_MB_GRP_BBITMAP_CORRUPT (e4b->bd_info))) + goto out; + max =mb_find_extent (e4b, ex.fe_start, ex.fe_len, &ex);if (max >0 ) {
@@ -1809,6 +1812,7 @@ int ext4_mb_try_best_found(struct ext4_allocation_context *ac,ext4_mb_use_best_found (ac, e4b); } +out:ext4_unlock_group (ac->ac_sb, group);ext4_mb_unload_buddy (e4b);
Signature · 1 line
2.43.0
Sasha Levin
maintainerPATCH 2/3 ext4: avoid allocating blocks from corrupted group in ext4_mb_find_by_goal()
From: Baokun Li <[email protected]>
[ Upstream commit 832698373a25950942c04a512daa652c18a9b513 ]
Places the logic for checking if the group's block bitmap is corrupt under the protection of the group lock to avoid allocating blocks from the group with a corrupted block bitmap.
--- fs/ext4/mballoc.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
fs/ext4/mballoc.c +4 -5
@@ -1839,12 +1839,10 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac,if (err)return err; -if (unlikely (EXT4_MB_GRP_BBITMAP_CORRUPT (e4b->bd_info))) { -ext4_mb_unload_buddy (e4b); -return 0 ; - } -ext4_lock_group (ac->ac_sb, group); +if (unlikely (EXT4_MB_GRP_BBITMAP_CORRUPT (e4b->bd_info))) + goto out; + max =mb_find_extent (e4b, ac->ac_g_ex.fe_start, ac->ac_g_ex.fe_len, &ex); ex.fe_logical =0xDEADFA11 ;/* debug value */
@@ -1877,6 +1875,7 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac, ac->ac_b_ex = ex;ext4_mb_use_best_found (ac, e4b); } +out:ext4_unlock_group (ac->ac_sb, group);ext4_mb_unload_buddy (e4b);
Signature · 1 line
2.43.0
Sasha Levin
maintainerPATCH 3/3 regulator: pwm-regulator: Add validity checks in continuous .get_voltage
In reply to Sasha LevinFrom: Martin Blumenstingl <[email protected]>
[ Upstream commit c92688cac239794e4a1d976afa5203a4d3a2ac0e ]
Continuous regulators can be configured to operate only in a certain duty cycle range (for example from 0..91%). Add a check to error out if the duty cycle translates to an unsupported (or out of range) voltage.
--- drivers/regulator/pwm-regulator.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/regulator/pwm-regulator.c +3 -0
@@ -164,6 +164,9 @@ static int pwm_regulator_get_voltage(struct regulator_dev *rdev)pwm_get_state (drvdata->pwm, &pstate); voltage =pwm_get_relative_duty_cycle (&pstate, duty_unit); +if (voltage <min (max_uV_duty, min_uV_duty) || + voltage >max (max_uV_duty, min_uV_duty)) +return -ENOTRECOVERABLE ;/* * The dutycycle for min_uV might be greater than the one for max_uV.
Signature · 1 line
2.43.0