mdadm/mdadm-3.2.3-Remove-avail_disks-arg-from-enough.patch
Jes Sorensen 6148d71c1d Fix a large number of bzs:
- Fix Monitor mode sometimes crashes when a resync completes
- Fix missing symlink for mdadm container device when incremental creates
  the array
- Make sure when creating a second array in a container that the second
  array uses all available space since leaving space for a third array
  is invalid
- Validate the number of imsm volumes per controller
- Fix issues with imsm arrays and disks larger than 2TB
- Add support for expanding imsm arrays/containers
- The support for expanding imsm arrays/containers was accepted upstream,
  update to the official patches from there
- Fix for the issue of --add not being very smart
- Fix an issue causing rebuilds to fail to restart on reboot (data
  corrupter level problem)
- Reset the bad flag on map file updates
- Correctly fix failure when trying to add internal bitmap to 1.0 arrays
- Resolves: bz817023 (f17) bz817024 (f17) bz817026 (f17) bz817028 (f17)
- Resolves: bz817029 (f17) bz817032 (f17) bz817038 (f17) bz808774 (f17)
- Resolves: bz817039 (f17) bz817042 (f17)

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
2012-04-30 17:50:18 +02:00

172 lines
5.7 KiB
Diff

From de5a472ea32867d002558bac0d2d2b4faf45c7c4 Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Tue, 7 Feb 2012 14:04:47 +1100
Subject: [PATCH] Remove avail_disks arg from 'enough'.
It can easily be calculated from 'avail' and 'raid_disks', and we
will soon have a case where we don't have it easily available to pass
in.
Signed-off-by: NeilBrown <neilb@suse.de>
---
Assemble.c | 16 ++++++++--------
Detail.c | 4 ++--
Incremental.c | 2 +-
mdadm.h | 2 +-
util.c | 11 ++++++++---
5 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/Assemble.c b/Assemble.c
index fd94461..972398e 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -934,7 +934,7 @@ int Assemble(struct supertype *st, char *mddev,
}
continue;
}
- /* If this devices thinks that 'most_recent' has failed, then
+ /* If this device thinks that 'most_recent' has failed, then
* we must reject this device.
*/
if (j != most_recent &&
@@ -965,7 +965,7 @@ int Assemble(struct supertype *st, char *mddev,
free(devmap);
while (force && !enough(content->array.level, content->array.raid_disks,
content->array.layout, 1,
- avail, okcnt)) {
+ avail)) {
/* Choose the newest best drive which is
* not up-to-date, update the superblock
* and add it.
@@ -1132,7 +1132,7 @@ int Assemble(struct supertype *st, char *mddev,
if (force && !clean &&
!enough(content->array.level, content->array.raid_disks,
content->array.layout, clean,
- avail, okcnt)) {
+ avail)) {
change += st->ss->update_super(st, content, "force-array",
devices[chosen_drive].devname, verbose,
0, NULL);
@@ -1331,7 +1331,7 @@ int Assemble(struct supertype *st, char *mddev,
if (runstop == 1 ||
(runstop <= 0 &&
( enough(content->array.level, content->array.raid_disks,
- content->array.layout, clean, avail, okcnt) &&
+ content->array.layout, clean, avail) &&
(okcnt + rebuilding_cnt >= req_cnt || start_partial_ok)
))) {
/* This array is good-to-go.
@@ -1437,13 +1437,13 @@ int Assemble(struct supertype *st, char *mddev,
mddev, strerror(errno));
if (!enough(content->array.level, content->array.raid_disks,
- content->array.layout, 1, avail, okcnt))
+ content->array.layout, 1, avail))
fprintf(stderr, Name ": Not enough devices to "
"start the array.\n");
else if (!enough(content->array.level,
content->array.raid_disks,
content->array.layout, clean,
- avail, okcnt))
+ avail))
fprintf(stderr, Name ": Not enough devices to "
"start the array while not clean "
"- consider --force.\n");
@@ -1471,12 +1471,12 @@ int Assemble(struct supertype *st, char *mddev,
if (sparecnt)
fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s");
if (!enough(content->array.level, content->array.raid_disks,
- content->array.layout, 1, avail, okcnt))
+ content->array.layout, 1, avail))
fprintf(stderr, " - not enough to start the array.\n");
else if (!enough(content->array.level,
content->array.raid_disks,
content->array.layout, clean,
- avail, okcnt))
+ avail))
fprintf(stderr, " - not enough to start the "
"array while not clean - consider "
"--force.\n");
diff --git a/Detail.c b/Detail.c
index e7d1681..1d7e3a1 100644
--- a/Detail.c
+++ b/Detail.c
@@ -367,7 +367,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
if (avail_disks == array.raid_disks)
st = "";
else if (!enough(array.level, array.raid_disks,
- array.layout, 1, avail, avail_disks))
+ array.layout, 1, avail))
st = ", FAILED";
else
st = ", degraded";
@@ -580,7 +580,7 @@ This is pretty boring
if (brief) printf("\n");
if (test &&
!enough(array.level, array.raid_disks, array.layout,
- 1, avail, avail_disks))
+ 1, avail))
rv = 2;
free(disks);
diff --git a/Incremental.c b/Incremental.c
index 60175af..b457bf3 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -486,7 +486,7 @@ int Incremental(char *devname, int verbose, int runstop,
active_disks = count_active(st, sra, mdfd, &avail, &info);
if (enough(info.array.level, info.array.raid_disks,
info.array.layout, info.array.state & 1,
- avail, active_disks) == 0) {
+ avail) == 0) {
if (verbose >= 0)
fprintf(stderr, Name
": %s attached to %s, not enough to start (%d).\n",
diff --git a/mdadm.h b/mdadm.h
index d862b3e..45198bb 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1164,7 +1164,7 @@ extern char *fname_from_uuid(struct supertype *st,
struct mdinfo *info, char *buf, char sep);
extern unsigned long calc_csum(void *super, int bytes);
extern int enough(int level, int raid_disks, int layout, int clean,
- char *avail, int avail_disks);
+ char *avail);
extern int enough_fd(int fd);
extern int ask(char *mesg);
extern unsigned long long get_component_size(int fd);
diff --git a/util.c b/util.c
index 4ba44e6..e5f7a20 100644
--- a/util.c
+++ b/util.c
@@ -311,10 +311,15 @@ int test_partition_from_id(dev_t id)
return rv;
}
-int enough(int level, int raid_disks, int layout, int clean,
- char *avail, int avail_disks)
+int enough(int level, int raid_disks, int layout, int clean, char *avail)
{
int copies, first;
+ int i;
+ int avail_disks = 0;
+
+ for (i = 0; i < raid_disks; i++)
+ avail_disks += !!avail[i];
+
switch (level) {
case 10:
/* This is the tricky one - we need to check
@@ -389,7 +394,7 @@ int enough_fd(int fd)
}
/* This is used on an active array, so assume it is clean */
rv = enough(array.level, array.raid_disks, array.layout,
- 1, avail, avail_disks);
+ 1, avail);
free(avail);
return rv;
}
--
1.7.7.6