summaryrefslogtreecommitdiff
path: root/Monitor.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-11-22 20:58:07 +1100
committerNeilBrown <neilb@suse.de>2010-11-22 20:58:07 +1100
commit2feb22efbc216e53486cc20c05df13f8340a9d49 (patch)
treee0fb7e4952bd0381ffa8b05031d61573a4019eb4 /Monitor.c
parent6d3d44d98c20ea7cb03af34e4962d324335cca2b (diff)
downloadmdadm-2feb22efbc216e53486cc20c05df13f8340a9d49.tar.gz
Monitor: split out check_donor
Checking compatibility between arrays for spare migration is going to become a little more complicated, so split it out into a separate function. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Monitor.c')
-rw-r--r--Monitor.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/Monitor.c b/Monitor.c
index c6a1a06..38dad64 100644
--- a/Monitor.c
+++ b/Monitor.c
@@ -733,6 +733,19 @@ static int move_spare(struct state *st2, struct state *st,
return 0;
}
+static int check_donor(struct state *from, struct state *to)
+{
+ if (from == to)
+ return 0;
+ if (from->active < from->raid)
+ return 0;
+ if (from->spare <= 0)
+ return 0;
+ if (!from->spare_group || !to->spare_group)
+ return 0;
+ return (strcmp(from->spare_group, to->spare_group) == 0);
+}
+
static void try_spare_migration(struct state *statelist, struct alert_info *info)
{
struct state *st;
@@ -740,16 +753,11 @@ static void try_spare_migration(struct state *statelist, struct alert_info *info
link_containers_with_subarrays(statelist);
for (st = statelist; st; st=st->next)
if (st->active < st->raid &&
- st->spare == 0 &&
- st->spare_group != NULL) {
+ st->spare == 0) {
struct state *st2;
for (st2=statelist ; st2 ; st2=st2->next)
- if (st2 != st &&
- st2->spare > 0 &&
- st2->active == st2->raid &&
- st2->spare_group != NULL &&
- strcmp(st->spare_group, st2->spare_group) == 0)
- if (move_spare(st2, st, info))
+ if (check_donor(st2, st)
+ && move_spare(st2, st, info))
break;
}
}