]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Monitor: skip array if error getting size
authorAnna Czarnowska <anna.czarnowska@intel.com>
Tue, 11 Jan 2011 10:36:37 +0000 (11:36 +0100)
committerNeilBrown <neilb@suse.de>
Wed, 12 Jan 2011 05:16:14 +0000 (16:16 +1100)
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>
Monitor.c

index 18462f2f597e0ba82789660105cbc6ca19dee480..db4e8ccb4764a0f16cbb9e67319850f53ceacc1a 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -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.