md/raid5: need_this_block: start simplifying the last two conditions.
Both the last two cases are only relevant if something has failed and something needs to be written (but not over-written), and if it is OK to pre-read blocks at this point. So factor out those tests and explain them. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
@@ -2930,16 +2930,34 @@ static int need_this_block(struct stripe_head *sh, struct stripe_head_state *s,
|
|||||||
*/
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* Sometimes neither read-modify-write nor reconstruct-write
|
||||||
|
* cycles can work. In those cases we read every block we
|
||||||
|
* can. Then the parity-update is certain to have enough to
|
||||||
|
* work with.
|
||||||
|
* This can only be a problem when we need to write something,
|
||||||
|
* and some device has failed. If either of those tests
|
||||||
|
* fail we need look no further.
|
||||||
|
*/
|
||||||
|
if (!s->failed || !s->to_write)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (test_bit(R5_Insync, &dev->flags) &&
|
||||||
|
!test_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
|
||||||
|
/* Pre-reads at not permitted until after short delay
|
||||||
|
* to gather multiple requests. However if this
|
||||||
|
* device is no Insync, the block could only be be computed
|
||||||
|
* and there is no need to delay that.
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
if (
|
if (
|
||||||
(sh->raid_conf->level <= 5 && s->failed && fdev[0]->towrite &&
|
(sh->raid_conf->level <= 5 && fdev[0]->towrite &&
|
||||||
(!test_bit(R5_Insync, &dev->flags) || test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) &&
|
|
||||||
!test_bit(R5_OVERWRITE, &fdev[0]->flags)) ||
|
!test_bit(R5_OVERWRITE, &fdev[0]->flags)) ||
|
||||||
((sh->raid_conf->level == 6 ||
|
((sh->raid_conf->level == 6 ||
|
||||||
sh->sector >= sh->raid_conf->mddev->recovery_cp)
|
sh->sector >= sh->raid_conf->mddev->recovery_cp)
|
||||||
&& s->failed && s->to_write &&
|
&&
|
||||||
(s->to_write - s->non_overwrite <
|
(s->to_write - s->non_overwrite <
|
||||||
sh->raid_conf->raid_disks - sh->raid_conf->max_degraded) &&
|
sh->raid_conf->raid_disks - sh->raid_conf->max_degraded)
|
||||||
(!test_bit(R5_Insync, &dev->flags) || test_bit(STRIPE_PREREAD_ACTIVE, &sh->state))))
|
))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user