From c5a6f9a61d166512f237fa88bd5867dfa4e81a70 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Thu, 14 Dec 2006 17:31:41 +1100 Subject: [PATCH] Change handling for "--assemble --force" when two drives disappeared at once. If two drives in a raid5 disappear at the same time, then "-Af" will add them both in rather than just one and forcing the array to 'clean'. This is slightly safer in some cases. --- Assemble.c | 22 +++++++++++++++++++++- ChangeLog | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Assemble.c b/Assemble.c index 2adf08d3..c731105d 100644 --- a/Assemble.c +++ b/Assemble.c @@ -630,6 +630,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, * and add it. */ int fd; + long long current_events; chosen_drive = -1; for (i=0; i= 0) fprintf(stderr, Name ": forcing event count in %s(%d) from %d upto %d\n", devices[chosen_drive].devname, devices[chosen_drive].raid_disk, @@ -680,6 +683,20 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, avail[chosen_drive] = 1; okcnt++; free(super); + + /* If there are any other drives of the same vintage, + * add them in as well. We can't lose and we might gain + */ + for (i=0; i= 0 && + !devices[j].uptodate && + devices[j].events > 0 && + devices[j].events == current_events) { + chosen_drive = j; + goto add_another; + } + } } /* Now we want to look at the superblock which the kernel will base things on @@ -760,7 +777,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, } #endif } - if (force && okcnt < info.array.raid_disks) { + if (force && !clean && + !enough(info.array.level, info.array.raid_disks, + info.array.layout, clean, + avail, okcnt)) { change += st->ss->update_super(&info, super, "force-array", devices[chosen_drive].devname, verbose, 0, NULL); diff --git a/ChangeLog b/ChangeLog index ebd83fbc..45efef2a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,9 @@ Changes Prior to this release - --wait or -W will wait for resync activity to finish on the given devices. - Fix some problems with --update=uuid and add a test. + - If two drives in a raid5 disappear at the same time, then "-Af" + will add them both in rather than just one and forcing the array + to 'clean'. This is slightly safer in some cases. Changes Prior to 2.5.6 release - Fix bug which meant "bitmap=xxx" in mdadm.conf was not handled -- 2.39.2