Files
sablink-distro/sys-fs/evms/files/2.5.5/raid5_degrade_fix.patch
T
2009-05-19 19:43:18 +02:00

39 lines
1.5 KiB
Diff

--- evms-2.5.5/plugins/md/raid5_mgr.c 2006-02-22 10:05:17.000000000 -0600
+++ evms-2.5.5.miket/plugins/md/raid5_mgr.c 2006-04-07 15:01:00.837225392 -0500
@@ -102,6 +102,7 @@
md_super_info_t info;
mdu_disk_info_t d;
int i, count, length = 0;
+ int conf_disks;
int rc = 0;
LOG_ENTRY();
@@ -117,9 +118,24 @@
conf->failed_disk_index = -1;
LOG_DEBUG("%s: info.raid_disks: %d, info.nr_disks: %d.\n", vol->name, info.raid_disks, info.nr_disks);
- conf->stripe.nr_disks = (info.raid_disks > info.nr_disks) ? info.raid_disks : info.nr_disks;
- conf->disks = EngFncs->engine_alloc(sizeof(disk_info_t) * conf->stripe.nr_disks);
- conf->stripe.chunks = EngFncs->engine_alloc(sizeof(chunk_t) * conf->stripe.nr_disks);
+ conf_disks = (info.raid_disks > info.nr_disks) ? info.raid_disks : info.nr_disks;
+
+ /*
+ * If a spare is added to fix a degrade array,
+ * its index will be out nr_disks range.
+ * Check disk index of each member and adjust conf_disks if necessary.
+ */
+ LIST_FOR_EACH(vol->members, iter, member) {
+ if (member->dev_number >= conf_disks) {
+ LOG_WARNING("%s: Changing number of disk entries:"
+ " current value %d, new value %d.\n",
+ vol->name, conf_disks, member->dev_number+1);
+ conf_disks = member->dev_number + 1;
+ }
+ }
+
+ conf->disks = EngFncs->engine_alloc(sizeof(disk_info_t) * conf_disks);
+ conf->stripe.chunks = EngFncs->engine_alloc(sizeof(chunk_t) * conf_disks);
/* Set the volume to which the stripe belongs. */
conf->stripe.volume = vol;