summaryrefslogtreecommitdiffstats
path: root/super-intel.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2009-02-24 18:45:56 -0700
committerDan Williams <dan.j.williams@intel.com>2009-02-24 18:45:56 -0700
commit620b171338b26125e21c18cd121cf397ddb80e2a (patch)
tree0d1a69855e37dbdeb66b1f2ca6b9007d1f60551b /super-intel.c
parentdf4746577e79650f8549555a1bdd083ffb8415b6 (diff)
downloadmdadm-620b171338b26125e21c18cd121cf397ddb80e2a.tar.gz
mdadm-620b171338b26125e21c18cd121cf397ddb80e2a.tar.xz
mdadm-620b171338b26125e21c18cd121cf397ddb80e2a.zip
imsm: introduce get_imsm_disk_slot
Implement a common disk index to disk slot routine and replace open coded versions. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'super-intel.c')
-rw-r--r--super-intel.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/super-intel.c b/super-intel.c
index c514b44..2948166 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -450,6 +450,20 @@ static void set_imsm_ord_tbl_ent(struct imsm_map *map, int slot, __u32 ord)
map->disk_ord_tbl[slot] = __cpu_to_le32(ord);
}
+static int get_imsm_disk_slot(struct imsm_map *map, int idx)
+{
+ int slot;
+ __u32 ord;
+
+ for (slot = 0; slot < map->num_members; slot++) {
+ ord = __le32_to_cpu(map->disk_ord_tbl[slot]);
+ if (ord_to_idx(ord) == idx)
+ return slot;
+ }
+
+ return -1;
+}
+
static int get_imsm_raid_level(struct imsm_map *map)
{
if (map->raid_level == 1) {
@@ -476,18 +490,14 @@ static int cmp_extent(const void *av, const void *bv)
static int count_memberships(struct dl *dl, struct intel_super *super)
{
int memberships = 0;
- int i, j;
+ int i;
for (i = 0; i < super->anchor->num_raid_devs; i++) {
struct imsm_dev *dev = get_imsm_dev(super, i);
struct imsm_map *map = get_imsm_map(dev, 0);
- for (j = 0; j < map->num_members; j++) {
- __u32 index = get_imsm_disk_idx(dev, j);
-
- if (index == dl->index)
- memberships++;
- }
+ if (get_imsm_disk_slot(map, dl->index) >= 0)
+ memberships++;
}
return memberships;
@@ -497,7 +507,7 @@ static struct extent *get_extents(struct intel_super *super, struct dl *dl)
{
/* find a list of used extents on the given physical device */
struct extent *rv, *e;
- int i, j;
+ int i;
int memberships = count_memberships(dl, super);
__u32 reservation = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
@@ -510,14 +520,10 @@ static struct extent *get_extents(struct intel_super *super, struct dl *dl)
struct imsm_dev *dev = get_imsm_dev(super, i);
struct imsm_map *map = get_imsm_map(dev, 0);
- for (j = 0; j < map->num_members; j++) {
- __u32 index = get_imsm_disk_idx(dev, j);
-
- if (index == dl->index) {
- e->start = __le32_to_cpu(map->pba_of_lba0);
- e->size = __le32_to_cpu(map->blocks_per_member);
- e++;
- }
+ if (get_imsm_disk_slot(map, dl->index) >= 0) {
+ e->start = __le32_to_cpu(map->pba_of_lba0);
+ e->size = __le32_to_cpu(map->blocks_per_member);
+ e++;
}
}
qsort(rv, memberships, sizeof(*rv), cmp_extent);
@@ -592,10 +598,8 @@ static void print_imsm_dev(struct imsm_dev *dev, char *uuid, int disk_idx)
printf(" UUID : %s\n", uuid);
printf(" RAID Level : %d\n", get_imsm_raid_level(map));
printf(" Members : %d\n", map->num_members);
- for (slot = 0; slot < map->num_members; slot++)
- if (disk_idx== get_imsm_disk_idx(dev, slot))
- break;
- if (slot < map->num_members) {
+ slot = get_imsm_disk_slot(map, disk_idx);
+ if (slot >= 0) {
ord = get_imsm_ord_tbl_ent(dev, slot);
printf(" This Slot : %d%s\n", slot,
ord & IMSM_ORD_REBUILD ? " (out-of-sync)" : "");
@@ -3603,10 +3607,7 @@ static struct dl *imsm_add_spare(struct intel_super *super, int slot,
/* check if this disk is already a member of
* this array
*/
- for (j = 0; j < map->num_members; j++)
- if (get_imsm_disk_idx(dev, j) == dl->index)
- break;
- if (j < map->num_members)
+ if (get_imsm_disk_slot(map, dl->index) >= 0)
continue;
found = 0;
@@ -3909,9 +3910,10 @@ static void imsm_process_update(struct supertype *st,
found = 0;
for (a = st->arrays; a ; a = a->next) {
dev = get_imsm_dev(super, a->info.container_member);
- for (i = 0; i < map->num_members; i++)
- if (victim == get_imsm_disk_idx(dev, i))
- found++;
+ map = get_imsm_map(dev, 0);
+
+ if (get_imsm_disk_slot(map, victim) >= 0)
+ found++;
}
/* delete the victim if it is no longer being