Grow: notice when --stop is synchronising a reshape and don't mess it up.
--stop now tries to wait for a reshape to be at just the right spot. However for a reducing reshape, mdadm will be running in the background watching, and might adjust sync_max and mess things up. So teach "progress_reshape" to notice when "sync_max" is modified, and leave it alone. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
737f8574cd
commit
a6b2d86c62
15
Grow.c
15
Grow.c
|
@ -3526,7 +3526,7 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
|
||||||
unsigned long long backup_point,
|
unsigned long long backup_point,
|
||||||
unsigned long long wait_point,
|
unsigned long long wait_point,
|
||||||
unsigned long long *suspend_point,
|
unsigned long long *suspend_point,
|
||||||
unsigned long long *reshape_completed)
|
unsigned long long *reshape_completed, int *frozen)
|
||||||
{
|
{
|
||||||
/* This function is called repeatedly by the reshape manager.
|
/* This function is called repeatedly by the reshape manager.
|
||||||
* It determines how much progress can safely be made and allows
|
* It determines how much progress can safely be made and allows
|
||||||
|
@ -3743,7 +3743,8 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
|
||||||
wait_point = info->component_size - wait_point;
|
wait_point = info->component_size - wait_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
sysfs_set_num(info, NULL, "sync_max", max_progress);
|
if (!*frozen)
|
||||||
|
sysfs_set_num(info, NULL, "sync_max", max_progress);
|
||||||
|
|
||||||
/* Now wait. If we have already reached the point that we were
|
/* Now wait. If we have already reached the point that we were
|
||||||
* asked to wait to, don't wait at all, else wait for any change.
|
* asked to wait to, don't wait at all, else wait for any change.
|
||||||
|
@ -3825,6 +3826,7 @@ check_progress:
|
||||||
*/
|
*/
|
||||||
int wait = 10000;
|
int wait = 10000;
|
||||||
int rv = -2;
|
int rv = -2;
|
||||||
|
unsigned long long new_sync_max;
|
||||||
while (fd >= 0 && rv < 0 && wait > 0) {
|
while (fd >= 0 && rv < 0 && wait > 0) {
|
||||||
if (sysfs_wait(fd, &wait) != 1)
|
if (sysfs_wait(fd, &wait) != 1)
|
||||||
break;
|
break;
|
||||||
|
@ -3832,6 +3834,11 @@ check_progress:
|
||||||
case 0:
|
case 0:
|
||||||
/* all good again */
|
/* all good again */
|
||||||
rv = 1;
|
rv = 1;
|
||||||
|
/* If "sync_max" is no longer max_progress
|
||||||
|
* we need to freeze things
|
||||||
|
*/
|
||||||
|
sysfs_get_ll(info, NULL, "sync_max", &new_sync_max);
|
||||||
|
*frozen = (new_sync_max != max_progress);
|
||||||
break;
|
break;
|
||||||
case -2: /* read error - abort */
|
case -2: /* read error - abort */
|
||||||
wait = 0;
|
wait = 0;
|
||||||
|
@ -4126,6 +4133,7 @@ int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
|
||||||
struct mdinfo *sd;
|
struct mdinfo *sd;
|
||||||
unsigned long stripes;
|
unsigned long stripes;
|
||||||
int uuid[4];
|
int uuid[4];
|
||||||
|
int frozen = 0;
|
||||||
|
|
||||||
/* set up the backup-super-block. This requires the
|
/* set up the backup-super-block. This requires the
|
||||||
* uuid from the array.
|
* uuid from the array.
|
||||||
|
@ -4206,7 +4214,8 @@ int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
|
||||||
reshape_completed = sra->reshape_progress;
|
reshape_completed = sra->reshape_progress;
|
||||||
rv = progress_reshape(sra, reshape,
|
rv = progress_reshape(sra, reshape,
|
||||||
backup_point, wait_point,
|
backup_point, wait_point,
|
||||||
&suspend_point, &reshape_completed);
|
&suspend_point, &reshape_completed,
|
||||||
|
&frozen);
|
||||||
/* external metadata would need to ping_monitor here */
|
/* external metadata would need to ping_monitor here */
|
||||||
sra->reshape_progress = reshape_completed;
|
sra->reshape_progress = reshape_completed;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue