dl->fd = keep_fd ? fd : -1;
dl->devname = devname ? strdup(devname) : NULL;
strncpy((char *) dl->serial, (char *) serial, MAX_RAID_SERIAL_LEN);
- dl->index = -3;
+ dl->index = -2;
} else if (keep_fd) {
close(dl->fd);
dl->fd = fd;
dl->index = -1;
else
dl->index = i;
+
break;
}
}
- if (dl->index == -3) {
- fprintf(stderr, Name ": device %x:%x with serial %s"
- " does not belong to this container\n",
- dl->major, dl->minor, (char *) serial);
- return 2;
- }
-
if (alloc)
super->disks = dl;
mpb->generation_num = __cpu_to_le32(1UL);
for (d = super->disks; d; d = d->next) {
- if (d->index >= 0)
+ if (d->index != -1)
continue;
mpb->disk[0] = d->disk;
__u32 generation;
__u32 sum;
int spares = 0;
- int raid_disks = 0;
int i;
__u32 mpb_size = sizeof(struct imsm_super) - sizeof(struct imsm_disk);
mpb->generation_num = __cpu_to_le32(generation);
for (d = super->disks; d; d = d->next) {
- if (d->index < 0)
+ if (d->index == -1)
spares++;
else {
- raid_disks++;
mpb->disk[d->index] = d->disk;
mpb_size += sizeof(struct imsm_disk);
}
}
- if (raid_disks != mpb->num_disks) {
- fprintf(stderr, "%s: expected %d disks only found %d\n",
- __func__, mpb->num_disks, raid_disks);
- return 1;
- }
for (i = 0; i < mpb->num_raid_devs; i++) {
struct imsm_dev *dev = __get_imsm_dev(mpb, i);
for (d = super->disks; d ; d = d->next) {
if (d->index < 0)
continue;
- if (store_imsm_mpb(d->fd, super)) {
+ if (store_imsm_mpb(d->fd, super))
fprintf(stderr, "%s: failed for device %d:%d %s\n",
__func__, d->major, d->minor, strerror(errno));
- return 1;
- }
if (doclose) {
close(d->fd);
d->fd = -1;
int device_per_mirror = 2; /* FIXME is this always the case?
* and are they always adjacent?
*/
- int failed = 0;
+ int r10fail = 0;
int i;
for (i = 0; i < map->num_members; i++) {
int idx = get_imsm_disk_idx(map, i);
struct imsm_disk *disk = get_imsm_disk(super, idx);
- if (__le32_to_cpu(disk->status) & FAILED_DISK)
- failed++;
+ if (!disk)
+ r10fail++;
+ else if (__le32_to_cpu(disk->status) & FAILED_DISK)
+ r10fail++;
- if (failed >= device_per_mirror)
+ if (r10fail >= device_per_mirror)
return IMSM_T_STATE_FAILED;
- /* reset 'failed' for next mirror set */
+ /* reset 'r10fail' for next mirror set */
if (!((i + 1) % device_per_mirror))
- failed = 0;
+ r10fail = 0;
}
return IMSM_T_STATE_DEGRADED;
int idx = get_imsm_disk_idx(map, i);
disk = get_imsm_disk(super, idx);
- if (__le32_to_cpu(disk->status) & FAILED_DISK)
+ if (!disk)
+ failed++;
+ else if (__le32_to_cpu(disk->status) & FAILED_DISK)
failed++;
else if (!(__le32_to_cpu(disk->status) & USABLE_DISK))
failed++;
if ((state & DS_FAULTY) && !(status & FAILED_DISK)) {
status |= FAILED_DISK;
disk->status = __cpu_to_le32(status);
+ disk->scsi_id = __cpu_to_le32(~0UL);
+ memmove(&disk->serial[0], &disk->serial[1], MAX_RAID_SERIAL_LEN - 1);
new_failure = 1;
super->updates_pending++;
}
if (dl->index == i)
break;
- if (__le32_to_cpu(dl->disk.status) & FAILED_DISK)
+ if (dl && __le32_to_cpu(dl->disk.status) & FAILED_DISK)
dl = NULL;
if (dl)