return super->dev_tbl[index];
}
-static __u32 get_imsm_disk_idx(struct imsm_map *map, int slot)
-{
- __u32 *ord_tbl = &map->disk_ord_tbl[slot];
-
- /* top byte identifies disk under rebuild
- * why not just use the USABLE bit... oh well.
- */
- return __le32_to_cpu(*ord_tbl & ~(0xff << 24));
-}
-
static __u32 get_imsm_ord_tbl_ent(struct imsm_dev *dev, int slot)
{
struct imsm_map *map;
else
map = get_imsm_map(dev, 0);
- return map->disk_ord_tbl[slot];
+ /* top byte identifies disk under rebuild */
+ return __le32_to_cpu(map->disk_ord_tbl[slot]);
+}
+
+#define ord_to_idx(ord) (((ord) << 8) >> 8)
+static __u32 get_imsm_disk_idx(struct imsm_dev *dev, int slot)
+{
+ __u32 ord = get_imsm_ord_tbl_ent(dev, slot);
+
+ return ord_to_idx(ord);
}
static int get_imsm_raid_level(struct imsm_map *map)
struct imsm_map *map = get_imsm_map(dev, 0);
for (j = 0; j < map->num_members; j++) {
- __u32 index = get_imsm_disk_idx(map, j);
+ __u32 index = get_imsm_disk_idx(dev, j);
if (index == dl->index)
memberships++;
struct imsm_map *map = get_imsm_map(dev, 0);
for (j = 0; j < map->num_members; j++) {
- __u32 index = get_imsm_disk_idx(map, j);
+ __u32 index = get_imsm_disk_idx(dev, j);
if (index == dl->index) {
e->start = __le32_to_cpu(map->pba_of_lba0);
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 (index == get_imsm_disk_idx(map, slot))
+ if (index == get_imsm_disk_idx(dev, slot))
break;
if (slot < map->num_members)
printf(" This Slot : %d\n", slot);
__u32 ord;
skip = 0;
- idx = get_imsm_disk_idx(map, slot);
+ idx = get_imsm_disk_idx(dev, slot);
ord = get_imsm_ord_tbl_ent(dev, slot);
for (d = super->disks; d ; d = d->next)
if (d->index == idx)
int i;
for (i = 0; i < map->num_members; i++) {
- int idx = get_imsm_disk_idx(map, i);
+ int idx = get_imsm_disk_idx(dev, i);
struct imsm_disk *disk = get_imsm_disk(super, idx);
if (!disk)
return map->map_state;
}
-static int imsm_count_failed(struct intel_super *super, struct imsm_map *map)
+static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev)
{
int i;
int failed = 0;
struct imsm_disk *disk;
+ struct imsm_map *map = get_imsm_map(dev, 0);
for (i = 0; i < map->num_members; i++) {
- int idx = get_imsm_disk_idx(map, i);
+ int idx = get_imsm_disk_idx(dev, i);
disk = get_imsm_disk(super, idx);
if (!disk)
int failed;
__u8 map_state;
- failed = imsm_count_failed(super, map);
+ failed = imsm_count_failed(super, dev);
map_state = imsm_check_degraded(super, inst, failed);
if (consistent && !dev->vol.dirty &&
dprintf("imsm: set_disk %d:%x\n", n, state);
- disk = get_imsm_disk(super, get_imsm_disk_idx(map, n));
+ disk = get_imsm_disk(super, get_imsm_disk_idx(dev, n));
/* check for new failures */
status = __le32_to_cpu(disk->status);
* degraded / failed status
*/
if (new_failure && map->map_state != IMSM_T_STATE_FAILED)
- failed = imsm_count_failed(super, map);
+ failed = imsm_count_failed(super, dev);
/* determine map_state based on failed or in_sync count */
if (failed)
static struct dl *imsm_readd(struct intel_super *super, int idx, struct active_array *a)
{
struct imsm_dev *dev = get_imsm_dev(super, a->info.container_member);
- struct imsm_map *map = get_imsm_map(dev, 0);
- int i = get_imsm_disk_idx(map, idx);
+ int i = get_imsm_disk_idx(dev, idx);
struct dl *dl;
for (dl = super->disks; dl; dl = dl->next)
return rv;
}
-static int disks_overlap(struct imsm_map *m1, struct imsm_map *m2)
+static int disks_overlap(struct imsm_dev *d1, struct imsm_dev *d2)
{
+ struct imsm_map *m1 = get_imsm_map(d1, 0);
+ struct imsm_map *m2 = get_imsm_map(d2, 0);
int i;
int j;
int idx;
for (i = 0; i < m1->num_members; i++) {
- idx = get_imsm_disk_idx(m1, i);
+ idx = get_imsm_disk_idx(d1, i);
for (j = 0; j < m2->num_members; j++)
- if (idx == get_imsm_disk_idx(m2, j))
+ if (idx == get_imsm_disk_idx(d2, j))
return 1;
}
dl->index = super->anchor->num_disks;
super->anchor->num_disks++;
}
- victim = get_imsm_disk_idx(map, u->slot);
+ victim = get_imsm_disk_idx(dev, u->slot);
map->disk_ord_tbl[u->slot] = __cpu_to_le32(dl->index);
disk = &dl->disk;
status = __le32_to_cpu(disk->status);
found = 0;
for (a = st->arrays; a ; a = a->next) {
dev = get_imsm_dev(super, a->info.container_member);
- map = get_imsm_map(dev, 0);
for (i = 0; i < map->num_members; i++)
- if (victim == get_imsm_disk_idx(map, i))
+ if (victim == get_imsm_disk_idx(dev, i))
found++;
}
if ((new_start >= start && new_start <= end) ||
(start >= new_start && start <= new_end))
overlap = 1;
- if (overlap && disks_overlap(map, new_map)) {
+ if (overlap && disks_overlap(dev, &u->dev)) {
dprintf("%s: arrays overlap\n", __func__);
return;
}
super->updates_pending++;
dev = update->space;
+ map = get_imsm_map(dev, 0);
update->space = NULL;
imsm_copy_dev(dev, &u->dev);
map = get_imsm_map(dev, 0);
struct imsm_disk *disk;
__u32 status;
- disk = get_imsm_disk(super, get_imsm_disk_idx(map, i));
+ disk = get_imsm_disk(super, get_imsm_disk_idx(dev, i));
status = __le32_to_cpu(disk->status);
status |= CONFIGURED_DISK;
status &= ~SPARE_DISK;
map = get_imsm_map(dev, 0);
for (j = 0; j < map->num_members; j++) {
- int idx = get_imsm_disk_idx(map, j);
+ int idx = get_imsm_disk_idx(dev, j);
if (idx > dl->index)
map->disk_ord_tbl[j] = __cpu_to_le32(idx - 1);