Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1442577b authored by NeilBrown's avatar NeilBrown
Browse files

Revert "md: do not progress the resync process if the stripe was blocked"



This reverts commit df10cfbc.

This patch was based on a misunderstanding and risks introducing a busy-wait loop.
So revert it.

Acked-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 7ca263cd
Loading
Loading
Loading
Loading
+6 −13
Original line number Original line Diff line number Diff line
@@ -2896,7 +2896,7 @@ static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh,
 *
 *
 */
 */


static bool handle_stripe5(struct stripe_head *sh)
static void handle_stripe5(struct stripe_head *sh)
{
{
	raid5_conf_t *conf = sh->raid_conf;
	raid5_conf_t *conf = sh->raid_conf;
	int disks = sh->disks, i;
	int disks = sh->disks, i;
@@ -3167,11 +3167,9 @@ static bool handle_stripe5(struct stripe_head *sh)
	ops_run_io(sh, &s);
	ops_run_io(sh, &s);


	return_io(return_bi);
	return_io(return_bi);

	return blocked_rdev == NULL;
}
}


static bool handle_stripe6(struct stripe_head *sh)
static void handle_stripe6(struct stripe_head *sh)
{
{
	raid5_conf_t *conf = sh->raid_conf;
	raid5_conf_t *conf = sh->raid_conf;
	int disks = sh->disks;
	int disks = sh->disks;
@@ -3455,17 +3453,14 @@ static bool handle_stripe6(struct stripe_head *sh)
	ops_run_io(sh, &s);
	ops_run_io(sh, &s);


	return_io(return_bi);
	return_io(return_bi);

	return blocked_rdev == NULL;
}
}


/* returns true if the stripe was handled */
static void handle_stripe(struct stripe_head *sh)
static bool handle_stripe(struct stripe_head *sh)
{
{
	if (sh->raid_conf->level == 6)
	if (sh->raid_conf->level == 6)
		return handle_stripe6(sh);
		handle_stripe6(sh);
	else
	else
		return handle_stripe5(sh);
		handle_stripe5(sh);
}
}


static void raid5_activate_delayed(raid5_conf_t *conf)
static void raid5_activate_delayed(raid5_conf_t *conf)
@@ -4277,9 +4272,7 @@ static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *ski
	clear_bit(STRIPE_INSYNC, &sh->state);
	clear_bit(STRIPE_INSYNC, &sh->state);
	spin_unlock(&sh->lock);
	spin_unlock(&sh->lock);


	/* wait for any blocked device to be handled */
	handle_stripe(sh);
	while (unlikely(!handle_stripe(sh)))
		;
	release_stripe(sh);
	release_stripe(sh);


	return STRIPE_SECTORS;
	return STRIPE_SECTORS;