imsm: FIX: Check maximum allowed degradation level in recover_backup_imsm()
Any degradation during backup recovery causes error and array assembly failure. Allow for degradation during backup recovery. This allows for degraded array assembly. Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
9a7172822a
commit
137debce82
|
@ -8389,7 +8389,6 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
|
||||||
unsigned long num_migr_units = __le32_to_cpu(migr_rec->num_migr_units);
|
unsigned long num_migr_units = __le32_to_cpu(migr_rec->num_migr_units);
|
||||||
char buffer[20];
|
char buffer[20];
|
||||||
int skipped_disks = 0;
|
int skipped_disks = 0;
|
||||||
int max_degradation;
|
|
||||||
|
|
||||||
err = sysfs_get_str(info, NULL, "array_state", (char *)buffer, 20);
|
err = sysfs_get_str(info, NULL, "array_state", (char *)buffer, 20);
|
||||||
if (err < 1)
|
if (err < 1)
|
||||||
|
@ -8413,7 +8412,6 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
|
||||||
|
|
||||||
map_dest = get_imsm_map(id->dev, 0);
|
map_dest = get_imsm_map(id->dev, 0);
|
||||||
new_disks = map_dest->num_members;
|
new_disks = map_dest->num_members;
|
||||||
max_degradation = new_disks - imsm_num_data_members(id->dev, 0);
|
|
||||||
|
|
||||||
read_offset = (unsigned long long)
|
read_offset = (unsigned long long)
|
||||||
__le32_to_cpu(migr_rec->ckpt_area_pba) * 512;
|
__le32_to_cpu(migr_rec->ckpt_area_pba) * 512;
|
||||||
|
@ -8444,29 +8442,36 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
Name ": Cannot seek to block: %s\n",
|
Name ": Cannot seek to block: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
goto abort;
|
skipped_disks++;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if ((unsigned)read(targets[i], buf, unit_len) != unit_len) {
|
if ((unsigned)read(targets[i], buf, unit_len) != unit_len) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
Name ": Cannot read copy area block: %s\n",
|
Name ": Cannot read copy area block: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
goto abort;
|
skipped_disks++;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (lseek64(targets[i], write_offset, SEEK_SET) < 0) {
|
if (lseek64(targets[i], write_offset, SEEK_SET) < 0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
Name ": Cannot seek to block: %s\n",
|
Name ": Cannot seek to block: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
goto abort;
|
skipped_disks++;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if ((unsigned)write(targets[i], buf, unit_len) != unit_len) {
|
if ((unsigned)write(targets[i], buf, unit_len) != unit_len) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
Name ": Cannot restore block: %s\n",
|
Name ": Cannot restore block: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
goto abort;
|
skipped_disks++;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skipped_disks > max_degradation) {
|
if (skipped_disks > imsm_get_allowed_degradation(info->new_level,
|
||||||
|
new_disks,
|
||||||
|
super,
|
||||||
|
id->dev)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
Name ": Cannot restore data from backup."
|
Name ": Cannot restore data from backup."
|
||||||
" Too many failed disks\n");
|
" Too many failed disks\n");
|
||||||
|
|
Loading…
Reference in New Issue