diff options
author | Anna Czarnowska <anna.czarnowska@intel.com> | 2011-01-11 11:36:37 +0100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-01-12 16:16:14 +1100 |
commit | de697acc4c8d0bc361cf5bd2edca33ade1274405 (patch) | |
tree | 0d6e42b5418bc26032543ab52fe351ed51eca833 /Monitor.c | |
parent | 2dd0d6971ca499b32ff9c0a4b2af6e66ad859723 (diff) |
Monitor: skip array if error getting size
load_super tries to load container first anyway but if it fails
eg. after physically removing a disk
then it tries to read metadata from container device.
This will always fail and print confusing errors.
So use load_container instead of load_super on container.
On failure to read metadata we should skip this array.
It will be dealt with the next time round.
Signed-off-by: Anna Czarnowska <anna.czarnowska@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Monitor.c')
-rw-r--r-- | Monitor.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -702,24 +702,28 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist, return new_found; } -unsigned long long min_spare_size_required(struct state *st) +static int get_min_spare_size_required(struct state *st, unsigned long long *sizep) { int fd; - unsigned long long rv = 0; if (!st->metadata || !st->metadata->ss->min_acceptable_spare_size) - return rv; + return 0; fd = open(st->devname, O_RDONLY); if (fd < 0) - return 0; - st->metadata->ss->load_super(st->metadata, fd, st->devname); + return 1; + if (st->metadata->ss->external) + st->metadata->ss->load_container(st->metadata, fd, st->devname); + else + st->metadata->ss->load_super(st->metadata, fd, st->devname); close(fd); - rv = st->metadata->ss->min_acceptable_spare_size(st->metadata); + if (!st->metadata->sb) + return 1; + *sizep = st->metadata->ss->min_acceptable_spare_size(st->metadata); st->metadata->ss->free_super(st->metadata); - return rv; + return 0; } static int check_donor(struct state *from, struct state *to) @@ -833,7 +837,8 @@ static void try_spare_migration(struct state *statelist, struct alert_info *info /* member of a container */ to = to->parent; - min_size = min_spare_size_required(to); + if (get_min_spare_size_required(to, &min_size)) + continue; if (to->metadata->ss->external) { /* We must make sure there is * no suitable spare in container already. |