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

Commit c5e19d90 authored by NeilBrown's avatar NeilBrown
Browse files

md: be careful when testing resync_max against curr_resync_completed.



While it generally shouldn't happen, it is not impossible for
curr_resync_completed to exceed resync_max.
This can particularly happen when reshaping RAID5 - the current
status isn't copied to curr_resync_completed promptly, so when it
is, it can exceed resync_max.
This happens when the reshape is 'frozen', resync_max is set low,
and reshape is re-enabled.

Taking a difference between two unsigned numbers is always dangerous
anyway, so add a test to behave correctly if
   curr_resync_completed > resync_max

Signed-off-by: default avatarNeilBrown <neilb@suse.com>
parent a4a3d26d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -7834,7 +7834,8 @@ void md_do_sync(struct md_thread *thread)
		      > (max_sectors >> 4)) ||
		     time_after_eq(jiffies, update_time + UPDATE_FREQUENCY) ||
		     (j - mddev->curr_resync_completed)*2
		     >= mddev->resync_max - mddev->curr_resync_completed
		     >= mddev->resync_max - mddev->curr_resync_completed ||
		     mddev->curr_resync_completed > mddev->resync_max
			    )) {
			/* time to update curr_resync_completed */
			wait_event(mddev->recovery_wait,
+2 −1
Original line number Diff line number Diff line
@@ -5542,7 +5542,8 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
	sector_nr += reshape_sectors;
	retn = reshape_sectors;
finish:
	if ((sector_nr - mddev->curr_resync_completed) * 2
	if (mddev->curr_resync_completed > mddev->resync_max ||
	    (sector_nr - mddev->curr_resync_completed) * 2
	    >= mddev->resync_max - mddev->curr_resync_completed) {
		/* Cannot proceed until we've updated the superblock... */
		wait_event(conf->wait_for_overlap,