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

97 lines
2.6 KiB
Diff

--- 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;
}