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