Assemble: improve efficacy of -Af in assembling degraded dirty arrays.

If a degraded dirty array has some superblocks which are clean and
others that are dirty, and the dirty ones are newer by precisely '1'
in the event count, then the current code to force the array to be
clean will not work.
We need to make sure to find a superblock with most recent event count
and force that one to be 'clean'.

Reported-by: A J Wyborny <ajwyborny@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2011-03-23 11:07:27 +11:00
parent 666bba9b50
commit 89ced23b58
1 changed files with 5 additions and 0 deletions

View File

@ -905,6 +905,8 @@ int Assemble(struct supertype *st, char *mddev,
continue;
if (!devices[j].uptodate)
continue;
if (devices[j].i.events < devices[most_recent].i.events)
continue;
chosen_drive = j;
if ((fd=dev_open(devices[j].devname, O_RDONLY|O_EXCL))< 0) {
fprintf(stderr, Name ": Cannot open %s: %s\n",
@ -996,6 +998,9 @@ int Assemble(struct supertype *st, char *mddev,
close(mdfd);
return 1;
}
if (verbose >= 0)
fprintf(stderr, Name ": Marking array %s as 'clean'\n",
mddev);
close(fd);
}