From: NeilBrown Date: Wed, 15 Dec 2010 22:07:51 +0000 (+1100) Subject: Grow: be extra careful about races when freezing an array X-Git-Tag: mdadm-3.2~178 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=885f984583a08bd64ea0e3e04abc0712828a1276;p=thirdparty%2Fmdadm.git 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 --- diff --git a/msg.c b/msg.c index 5511ecdb..7bd85f81 100644 --- a/msg.c +++ b/msg.c @@ -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) {