From: Anna Czarnowska Date: Sun, 28 Nov 2010 22:51:27 +0000 (+1100) Subject: Monitor: few bug fixes for spare migration X-Git-Tag: mdadm-3.2~228 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ff044d6ba707c22ab33c508640dd14ab537c1c16;p=thirdparty%2Fmdadm.git Monitor: few bug fixes for spare migration 1. If array not changed we should still report any degraded - another array may have a new spare that we can move. 2. Array with err=1 can't give a spare. 3. We look for spares in "from" not "st" which is supertype and has devname=NULL. Signed-off-by: Anna Czarnowska Signed-off-by: NeilBrown --- diff --git a/Monitor.c b/Monitor.c index 9ba49f25..9608fe7a 100644 --- a/Monitor.c +++ b/Monitor.c @@ -424,6 +424,10 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, int test, struct alert_info *ainfo, int increments) { + /* Update the state 'st' to reflect any changes shown in mdstat, + * or found by directly examining the array, and return + * '1' if the array is degraded, or '0' if it is optimal (or dead). + */ struct { int state, major, minor; } info[MaxDisks]; mdu_array_info_t array; struct mdstat_ent *mse = NULL, *mse2; @@ -497,7 +501,10 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, ))) { close(fd); st->err = 0; - return 0; + if ((st->active < st->raid) && st->spare == 0) + return 1; + else + return 0; } if (st->utime == 0 && /* new array */ mse->pattern && strchr(mse->pattern, '_') /* degraded */ @@ -751,6 +758,8 @@ static int check_donor(struct state *from, struct state *to, if (from->parent) /* Cannot move from a member */ return 0; + if (from->err) + return 0; for (sub = from->subarray; sub; sub = sub->subarray) /* If source array has degraded subarrays, don't * remove anything @@ -806,7 +815,7 @@ static int container_choose_spare(struct state *from, struct state *to, */ struct supertype *st = from->metadata; - int fd = open(st->devname, O_RDONLY); + int fd = open(from->devname, O_RDONLY); int err; struct mdinfo *disks, *d; unsigned long long min_size