Skip to content

Commit

Permalink
md/raid10: fix "enough" function for detecting if array is failed.
Browse files Browse the repository at this point in the history
The 'enough' function is written to work with 'near' arrays only
in that is implicitly assumes that the offset from one 'group' of
devices to the next is the same as the number of copies.
In reality it is the number of 'near' copies.

So change it to make this number explicit.

This bug makes it possible to run arrays without enough drives
present, which is dangerous.
It is appropriate for an -stable kernel, but will almost certainly
need to be modified for some of them.

Cc: stable@vger.kernel.org
Reported-by: Jakub Husák <jakub@gooseman.cz>
Signed-off-by: NeilBrown <neilb@suse.de>
  • Loading branch information
NeilBrown committed Sep 27, 2012
1 parent cb13ff6 commit 80b4812
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions drivers/md/raid10.c
Original file line number Diff line number Diff line change
Expand Up @@ -1512,14 +1512,16 @@ static int _enough(struct r10conf *conf, struct geom *geo, int ignore)
do {
int n = conf->copies;
int cnt = 0;
int this = first;
while (n--) {
if (conf->mirrors[first].rdev &&
first != ignore)
if (conf->mirrors[this].rdev &&
this != ignore)
cnt++;
first = (first+1) % geo->raid_disks;
this = (this+1) % geo->raid_disks;
}
if (cnt == 0)
return 0;
first = (first + geo->near_copies) % geo->raid_disks;
} while (first != 0);
return 1;
}
Expand Down

0 comments on commit 80b4812

Please sign in to comment.