On Tue, Mar 22, 2022 at 8:24 AM Mariusz Tkaczyk <mariusz.tkaczyk@xxxxxxxxxxxxxxx> wrote: > > Raid456 module had allowed to achieve failed state. It was fixed by > fb73b357fb9 ("raid5: block failing device if raid will be failed"). > This fix introduces a bug, now if raid5 fails during IO, it may result > with a hung task without completion. Faulty flag on the device is > necessary to process all requests and is checked many times, mainly in > analyze_stripe(). [...] > Cc: stable@xxxxxxxxxxxxxxx > Fixes: fb73b357fb9 ("raid5: block failing device if raid will be failed") > Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@xxxxxxxxxxxxxxx> > --- > drivers/md/raid5.c | 48 +++++++++++++++++++++++----------------------- > 1 file changed, 24 insertions(+), 24 deletions(-) > > diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c > index 7c119208a214..4d76e3a89aa5 100644 > --- a/drivers/md/raid5.c > +++ b/drivers/md/raid5.c > @@ -686,17 +686,20 @@ int raid5_calc_degraded(struct r5conf *conf) > return degraded; > } > > -static int has_failed(struct r5conf *conf) > +static bool has_failed(struct r5conf *conf) > { > - int degraded; > + int degraded = conf->mddev->degraded; > > - if (conf->mddev->reshape_position == MaxSector) > - return conf->mddev->degraded > conf->max_degraded; > + if (test_bit(MD_BROKEN, &conf->mddev->flags)) > + return true; > + > + if (conf->mddev->reshape_position != MaxSector) > + degraded = raid5_calc_degraded(conf); > > - degraded = raid5_calc_degraded(conf); > if (degraded > conf->max_degraded) nit: we can just do return degraded > conf->max_degraded; [...]