From 7a634e08cb47e96a4f6259873b1ceaf7f0417e31 Mon Sep 17 00:00:00 2001 From: robertmh Date: Sat, 9 Feb 2008 10:54:44 +0000 Subject: [PATCH] 2008-02-09 Robert Millan * disk/raid.c (grub_raid_scan_device): Add a pair of sanity checks for situations in which we can deduce the RAID size and the superblock doesn't match it. --- ChangeLog | 6 ++++++ disk/raid.c | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/ChangeLog b/ChangeLog index a68720fc7..17b41d46c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-02-09 Robert Millan + + * disk/raid.c (grub_raid_scan_device): Add a pair of sanity checks for + situations in which we can deduce the RAID size and the superblock + doesn't match it. + 2008-02-09 Robert Millan * disk/lvm.c [GRUB_UTIL] (grub_lvm_memberlist): New function. Construct diff --git a/disk/raid.c b/disk/raid.c index 0d3177fd1..3c4290a51 100644 --- a/disk/raid.c +++ b/disk/raid.c @@ -523,6 +523,27 @@ grub_raid_scan_device (const char *name) /* Add the device to the array. */ array->device[sb.this_disk.number] = grub_disk_open (name); + + if (array->disk_size != array->device[sb.this_disk.number]->total_sectors) + { + if (array->total_devs == 1) + { + grub_dprintf ("raid", "Array contains only one disk, but its size (0x%llx) " + "doesn't match with size indicated by superblock (0x%llx). " + "Assuming superblock is wrong.\n", + array->device[sb.this_disk.number]->total_sectors, array->disk_size); + array->disk_size = array->device[sb.this_disk.number]->total_sectors; + } + else if (array->level == 1) + { + grub_dprintf ("raid", "Array is RAID level 1, but the size of disk %d (0x%llx) " + "doesn't match with size indicated by superblock (0x%llx). " + "Assuming superblock is wrong.\n", + sb.this_disk.number, + array->device[sb.this_disk.number]->total_sectors, array->disk_size); + array->disk_size = array->device[sb.this_disk.number]->total_sectors; + } + } if (! array->device[sb.this_disk.number]) {