Grow: be extra careful about races when freezing an array

If any subarray has any spare devices, then something raced,
and we should abort the reshape.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2010-12-16 09:07:51 +11:00
parent d7ca196cbd
commit 885f984583
1 changed files with 12 additions and 1 deletions

13
msg.c
View File

@ -348,8 +348,19 @@ int block_monitor(char *container, const int freeze)
sysfs_get_str(sra, NULL, "sync_action", buf, 20) > 0 &&
strcmp(buf, "frozen\n") == 0))
/* pass */;
else
else {
unblock_subarray(sra, 0);
break;
}
/* Double check against races - there should be no spares
* or part-spares
*/
sysfs_free(sra);
sra = sysfs_read(-1, e->devnum, GET_DEVS | GET_STATE);
if (sra && sra->array.spare_disks > 0) {
unblock_subarray(sra, freeze);
break;
}
}
if (e) {