summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Huddleston <eradicator@gentoo.org>2006-05-02 08:14:30 +0000
committerJeremy Huddleston <eradicator@gentoo.org>2006-05-02 08:14:30 +0000
commit637030fd6553270bffeb8162313fe90e33629021 (patch)
tree54f94e1d89d736b7f44dffca1b557ef96fcd4c19 /sys-fs/evms/files/2.5.5
parentinitial commit - ebuild submitted by Cristiano Chiucchiolo via bug #131564 (diff)
downloadhistorical-637030fd6553270bffeb8162313fe90e33629021.tar.gz
historical-637030fd6553270bffeb8162313fe90e33629021.tar.bz2
historical-637030fd6553270bffeb8162313fe90e33629021.zip
Added maintenance patches to handle degraded raid5 arrays. Closes bug #131193.
Package-Manager: portage-2.1_pre9-r4
Diffstat (limited to 'sys-fs/evms/files/2.5.5')
-rw-r--r--sys-fs/evms/files/2.5.5/md_super_fix.patch96
-rw-r--r--sys-fs/evms/files/2.5.5/raid5_degrade_fix.patch38
2 files changed, 134 insertions, 0 deletions
diff --git a/sys-fs/evms/files/2.5.5/md_super_fix.patch b/sys-fs/evms/files/2.5.5/md_super_fix.patch
new file mode 100644
index 000000000000..8ff1b4a22997
--- /dev/null
+++ b/sys-fs/evms/files/2.5.5/md_super_fix.patch
@@ -0,0 +1,96 @@
+--- evms-2.5.5/plugins/md/md_super.c 2006-02-22 14:34:53.000000000 -0600
++++ evms-2.5.5.fix/plugins/md/md_super.c 2006-04-20 11:00:40.733364216 -0500
+@@ -1312,13 +1312,13 @@
+
+ static int sb0_zero_superblock(md_member_t *member, boolean now)
+ {
+- mdp_super_t sb;
++ char buf[MD_SB_BYTES];
+
+ LOG_ENTRY();
+
+ if (now == TRUE) {
+- memset(&sb, 0, MD_SB_BYTES);
+- if ( WRITE(member->obj, member->super_offset, MD_SB_SECTORS, (char*)&sb)) {
++ memset(buf, 0, MD_SB_BYTES);
++ if ( WRITE(member->obj, member->super_offset, MD_SB_SECTORS, buf)) {
+ LOG_EXIT_INT(EIO);
+ return EIO;
+ }
+@@ -1332,7 +1332,7 @@
+
+ static int sb0_zero_saved_info(md_member_t *member, boolean now)
+ {
+- md_saved_info_t info;
++ char buf[MD_SAVED_INFO_BYTES];
+ u_int64_t location;
+
+ LOG_ENTRY();
+@@ -1341,8 +1341,8 @@
+ location += MD_SB0_SAVED_INFO_SECTOR_OFFSET;
+
+ if (now == TRUE) {
+- memset(&info, 0, sizeof(md_saved_info_t));
+- if ( WRITE(member->obj, location, MD_SAVED_INFO_SECTS, (char*)&info)) {
++ memset(buf, 0, MD_SAVED_INFO_BYTES);
++ if ( WRITE(member->obj, location, MD_SAVED_INFO_SECTS, buf)) {
+ LOG_EXIT_INT(EIO);
+ return EIO;
+ }
+@@ -2451,6 +2451,7 @@
+ {
+ int rc = 0;
+ mdp_sb_1_t *duplicate = NULL;
++ mdp_sb_1_t *master;
+ md_volume_t *vol;
+
+ LOG_ENTRY();
+@@ -2462,9 +2463,16 @@
+ }
+
+ vol = member->vol;
++ master = (mdp_sb_1_t *)vol->sb;
++
++ if (vol->flags & (MD_NEW_REGION | MD_DEGRADED)) {
++ LOG_WARNING("%s: Creating new array with missing disk,"
++ " set resync_offset to -1.\n", vol->name);
++ master->resync_offset = -1;
++ }
+
+ /* Copy from master superblock */
+- rc = sb1_duplicate_sb(&member->sb, vol->sb);
++ rc = sb1_duplicate_sb(&member->sb, master);
+ if (rc) {
+ goto out;
+ }
+@@ -2602,8 +2610,8 @@
+ member->obj->name, member->super_offset);
+
+ if (now == TRUE) {
+- memset(&sb, 0, MD_SB_1_BYTES);
+- if ( WRITE(member->obj, member->super_offset, MD_SB_1_SECTORS, (char*)&sb)) {
++ memset(sb, 0, MD_SB_1_BYTES);
++ if ( WRITE(member->obj, member->super_offset, MD_SB_1_SECTORS, sb)) {
+ LOG_EXIT_INT(EIO);
+ return EIO;
+ }
+@@ -2616,7 +2624,7 @@
+
+ static int sb1_zero_saved_info(md_member_t *member, boolean now)
+ {
+- md_saved_info_t info;
++ char buf[MD_SAVED_INFO_BYTES];
+ u_int64_t location;
+
+ LOG_ENTRY();
+@@ -2627,8 +2635,8 @@
+ member->obj->name, location);
+
+ if (now == TRUE) {
+- memset(&info, 0, sizeof(md_saved_info_t));
+- if ( WRITE(member->obj, location, MD_SAVED_INFO_SECTS, (char*)&info)) {
++ memset(buf, 0, MD_SAVED_INFO_BYTES);
++ if ( WRITE(member->obj, location, MD_SAVED_INFO_SECTS, buf) ) {
+ LOG_EXIT_INT(EIO);
+ return EIO;
+ }
diff --git a/sys-fs/evms/files/2.5.5/raid5_degrade_fix.patch b/sys-fs/evms/files/2.5.5/raid5_degrade_fix.patch
new file mode 100644
index 000000000000..973f65011958
--- /dev/null
+++ b/sys-fs/evms/files/2.5.5/raid5_degrade_fix.patch
@@ -0,0 +1,38 @@
+--- 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;