On Tue, 11 Jan 2011 13:09:55 +0000 "Czarnowska, Anna" <anna.czarnowska@xxxxxxxxx> wrote: > >From 10d178721c3870ea5802a30ea3f008f9f379551a Mon Sep 17 00:00:00 2001 > From: Anna Czarnowska <anna.czarnowska@xxxxxxxxx> > Date: Tue, 11 Jan 2011 12:36:37 +0100 > Subject: [PATCH] Monitor: skip array if error getting size > Cc: linux-raid@xxxxxxxxxxxxxxx, Williams, Dan J <dan.j.williams@xxxxxxxxx>, Ciechanowski, Ed <ed.ciechanowski@xxxxxxxxx> > > 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@xxxxxxxxx> Applied, thanks. BTW, load_super should try load_container any longer, so I have removed that - thanks for the reminder. NeilBrown > --- > Monitor.c | 21 +++++++++++++-------- > 1 files changed, 13 insertions(+), 8 deletions(-) > > diff --git a/Monitor.c b/Monitor.c > index 18462f2..db4e8cc 100644 > --- 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. -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html