--- grub-updates/grub2-1.98+20100726/disk/mdraid_linux.c 2010-07-26 11:53:14.000000000 -0400 +++ grub2-1.98+20100726.working/disk/mdraid_linux.c 2010-07-26 17:03:31.127206219 -0400 @@ -290,7 +290,7 @@ grub_uint32_t disk_csum; grub_uint32_t csum; grub_uint64_t newcsum; - int size = 256 + sb->max_dev*2; + int size = 256 + grub_le_to_cpu32(sb->max_dev)*2; grub_uint32_t *isuper = (grub_uint32_t*)sb; int i; @@ -309,6 +309,12 @@ return csum; } +static grub_uint32_t grub_mdraid_csum_fold(grub_uint32_t csum) +{ + csum = (csum & 0xffff) + (csum >> 16); + return (csum & 0xffff) + (csum >> 16); +} + static grub_err_t grub_mdraid_detect_1x (grub_disk_t disk, grub_disk_addr_t sector, struct grub_raid_super_1x *sb, @@ -318,31 +324,31 @@ grub_uint64_t sb_size; struct grub_raid_super_1x *real_sb; - if (sb->major_version != 1) + if (grub_le_to_cpu32(sb->major_version) != 1) return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "Unsupported RAID version: %d", - sb->major_version); + grub_le_to_cpu32(sb->major_version)); - if (sb->super_offset != sector) + if (grub_le_to_cpu64(sb->super_offset) != sector) /* We're not where we're supposed to be. Usually caused by a 1.0 superblock at the end of a disk with a single large partition. */ return grub_error (GRUB_ERR_OUT_OF_RANGE, "wrong superblock location"); - if (sb->feature_map & MD_FEATURE_RECOVERY_OFFSET) + if (grub_le_to_cpu32(sb->feature_map) & MD_FEATURE_RECOVERY_OFFSET) /* Disk is currently being recovered. Silently ignore it. */ return grub_error (GRUB_ERR_OUT_OF_RANGE, "recovery in progress"); - if (sb->feature_map & MD_FEATURE_RESHAPE_ACTIVE) + if (grub_le_to_cpu32(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE) return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "reshape active"); /* Multipath. */ - if ((int) sb->level == -4) + if ((int) grub_le_to_cpu32(sb->level) == -4) sb->level = 1; - if (sb->level != 0 && sb->level != 1 && sb->level != 4 && - sb->level != 5 && sb->level != 6 && sb->level != 10) + if (grub_le_to_cpu32(sb->level) != 0 && grub_le_to_cpu32(sb->level) != 1 && grub_le_to_cpu32(sb->level) != 4 && + grub_le_to_cpu32(sb->level) != 5 && grub_le_to_cpu32(sb->level) != 6 && grub_le_to_cpu32(sb->level) != 10) return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, - "Unsupported RAID level: %d", sb->level); + "Unsupported RAID level: %d", grub_le_to_cpu32(sb->level)); /* 1.x superblocks don't have a fixed size on disk. So we have to read it again now that we now the max device count. */ @@ -357,7 +363,7 @@ return grub_errno; } - if (grub_mdraid_calc_csum(real_sb) != real_sb->sb_csum) + if (grub_mdraid_csum_fold(grub_mdraid_calc_csum(real_sb)) != grub_mdraid_csum_fold(real_sb->sb_csum)) { grub_free (real_sb); return grub_error (GRUB_ERR_OUT_OF_RANGE, "csum invalid"); @@ -403,7 +409,7 @@ grub_memcpy (array->uuid, real_sb->set_uuid, 16); - *start_sector = real_sb->data_offset; + *start_sector = grub_le_to_cpu64(real_sb->data_offset); grub_free (real_sb); return 0; @@ -457,9 +463,10 @@ &sb_1x)) return grub_errno; - if (sb_1x.magic == SB_MAGIC) + if (grub_le_to_cpu32(sb_1x.magic) == SB_MAGIC) { return grub_mdraid_detect_1x (disk, sector, &sb_1x, array, start_sector); + } } /* Neither 0.90 nor 1.x. */