A pair of sanity checks for RAID. Jeroen, I'd appreciate if you could have a
quick look.
The second case I haven't run into, but the first I have (in a single-disk
RAID0 I setup for testing).
I wonder if I'm fixing the symptoms of a bug rather than the bug, but I
really don't see what could be wrong in our superblock read routine, plus
even if there's a bug somewhere else this check makes sense to me as a general
safeguard.
--
Robert Millan
<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call… if you are unable to speak?
(as seen on /.)
diff -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/disk/raid.c ./disk/raid.c
--- ../grub2/disk/raid.c 2007-12-30 09:52:03.000000000 +0100
+++ ./disk/raid.c 2008-02-06 23:22:46.000000000 +0100
@@ -493,6 +493,28 @@ grub_raid_scan_device (const char *name)
/* Add the device to the array. */
array->device[sb.this_disk.number].name = grub_strdup (name);
array->device[sb.this_disk.number].disk = 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].name
|| ! array->device[sb.this_disk.number].disk)
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel