__u64 sz;
int slot;
struct imsm_map *map = get_imsm_map(dev, 0);
+ __u32 ord;
printf("\n");
printf("[%s]:\n", dev->volume);
for (slot = 0; slot < map->num_members; slot++)
if (index == get_imsm_disk_idx(dev, slot))
break;
- if (slot < map->num_members)
- printf(" This Slot : %d\n", slot);
- else
+ if (slot < map->num_members) {
+ ord = get_imsm_ord_tbl_ent(dev, slot);
+ printf(" This Slot : %d%s\n", slot,
+ ord & IMSM_ORD_REBUILD ? " (out-of-sync)" : "");
+ } else
printf(" This Slot : ?\n");
sz = __le32_to_cpu(dev->size_high);
sz <<= 32;
printf(" Map State : %s", map_state_str[map->map_state]);
if (dev->vol.migr_state) {
struct imsm_map *map = get_imsm_map(dev, 1);
- printf(", %s", map_state_str[map->map_state]);
+ printf(" <-- %s", map_state_str[map->map_state]);
}
printf("\n");
printf(" Dirty State : %s\n", dev->vol.dirty ? "dirty" : "clean");
struct imsm_map *map = get_imsm_map(dev, 0);
for (i = 0; i < map->num_members; i++) {
- int idx = get_imsm_disk_idx(dev, i);
+ __u32 ord = get_imsm_ord_tbl_ent(dev, i);
+ int idx = ord_to_idx(ord);
disk = get_imsm_disk(super, idx);
- if (!disk)
- failed++;
- else if (__le32_to_cpu(disk->status) & FAILED_DISK)
- failed++;
- else if (!(__le32_to_cpu(disk->status) & USABLE_DISK))
+ if (!disk ||
+ __le32_to_cpu(disk->status) & FAILED_DISK ||
+ ord & IMSM_ORD_REBUILD)
failed++;
}
__u32 status;
int failed = 0;
int new_failure = 0;
+ __u32 ord;
if (n > map->num_members)
fprintf(stderr, "imsm: set_disk %d out of range 0..%d\n",
dprintf("imsm: set_disk %d:%x\n", n, state);
- disk = get_imsm_disk(super, get_imsm_disk_idx(dev, n));
+ ord = get_imsm_ord_tbl_ent(dev, n);
+ disk = get_imsm_disk(super, ord_to_idx(ord));
/* check for new failures */
status = __le32_to_cpu(disk->status);
super->updates_pending++;
}
/* check if in_sync */
- if ((state & DS_INSYNC) && !(status & USABLE_DISK)) {
- status |= USABLE_DISK;
- disk->status = __cpu_to_le32(status);
+ if (state & DS_INSYNC && ord & IMSM_ORD_REBUILD) {
+ struct imsm_map *migr_map = get_imsm_map(dev, 1);
+
+ set_imsm_ord_tbl_ent(migr_map, n, ord_to_idx(ord));
super->updates_pending++;
}
disk = &dl->disk;
status = __le32_to_cpu(disk->status);
status |= CONFIGURED_DISK;
- status &= ~(SPARE_DISK | USABLE_DISK);
+ status &= ~SPARE_DISK;
disk->status = __cpu_to_le32(status);
/* count arrays using the victim in the metadata */
break;
disk = &(*dlp)->disk;
status = __le32_to_cpu(disk->status);
- status &= ~(CONFIGURED_DISK | USABLE_DISK);
+ status &= ~CONFIGURED_DISK;
disk->status = __cpu_to_le32(status);
/* We know that 'manager' isn't touching anything,
* so it is safe to: