external: get number of failed disks for container

Container degradation here is defined as the number of failed disks in
mostly degraded sub-array. This number is used as value for
array.failed_disks and used in comparison to find best match.

Signed-off-by: Przemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Przemyslaw Czarnowski 2010-12-26 22:31:25 +11:00 committed by NeilBrown
parent cbeeb0e5f0
commit 5be68a0762
1 changed files with 32 additions and 1 deletions

View File

@ -820,6 +820,32 @@ static int count_active(struct supertype *st, struct mdinfo *sra,
return cnt;
}
/* test if container has degraded member(s) */
static int container_members_max_degradation(struct map_ent *map, struct map_ent *me)
{
mdu_array_info_t array;
int afd;
int max_degraded = 0;
for(; map; map = map->next) {
if (!is_subarray(map->metadata) ||
devname2devnum(map->metadata+1) != me->devnum)
continue;
afd = open_dev(map->devnum);
if (afd < 0)
continue;
/* most accurate information regarding array degradation */
if (ioctl(afd, GET_ARRAY_INFO, &array) >= 0) {
int degraded = array.raid_disks - array.active_disks -
array.spare_disks;
if (degraded > max_degraded)
max_degraded = degraded;
}
close(afd);
}
return (max_degraded);
}
static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
struct map_ent *target, int bare,
struct supertype *st, int verbose)
@ -887,7 +913,7 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE|
GET_COMPONENT|GET_VERSION);
if (sra)
sra->array.failed_disks = 0;
sra->array.failed_disks = -1;
}
if (!sra)
continue;
@ -914,6 +940,11 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
goto next;
} else
st2 = st;
/* update number of failed disks for mostly degraded
* container member */
if (sra->array.failed_disks == -1)
sra->array.failed_disks = container_members_max_degradation(map, mp);
get_dev_size(dfd, NULL, &devsize);
if (st2->ss->avail_size(st2, devsize) < sra->component_size) {
if (verbose > 1)