All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sanity checks for RAID
@ 2008-02-06 23:43 Robert Millan
  2008-02-09 10:53 ` Robert Millan
  0 siblings, 1 reply; 2+ messages in thread
From: Robert Millan @ 2008-02-06 23:43 UTC (permalink / raw)
  To: grub-devel; +Cc: Jeroen Dekkers

[-- Attachment #1: Type: text/plain, Size: 578 bytes --]


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 /.)

[-- Attachment #2: sanity_checks.diff --]
[-- Type: text/x-diff, Size: 1431 bytes --]

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)

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] sanity checks for RAID
  2008-02-06 23:43 [PATCH] sanity checks for RAID Robert Millan
@ 2008-02-09 10:53 ` Robert Millan
  0 siblings, 0 replies; 2+ messages in thread
From: Robert Millan @ 2008-02-09 10:53 UTC (permalink / raw)
  To: grub-devel; +Cc: Jeroen Dekkers

On Thu, Feb 07, 2008 at 12:43:08AM +0100, Robert Millan wrote:
> 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;
> +	}
> +    }
> +

Committed.

-- 
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 /.)



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2008-02-09 10:55 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-06 23:43 [PATCH] sanity checks for RAID Robert Millan
2008-02-09 10:53 ` Robert Millan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.