]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Merge trunk
authorFelix Zielcke <fzielcke@z-51.de>
Tue, 29 Dec 2009 15:58:30 +0000 (16:58 +0100)
committerFelix Zielcke <fzielcke@z-51.de>
Tue, 29 Dec 2009 15:58:30 +0000 (16:58 +0100)
1  2 
disk/dmraid_nvidia.c
disk/mdraid_linux.c
disk/raid.c

index ed89854b3aa470ff28f4a69052ccfc9ac3449ae2,46eac6ac5db354580029fb8a6caeb5bbac0a807c..3e4ae33be6543a2f5f3178d2c70ee0b49b7aa2e1
@@@ -129,10 -129,9 +129,10 @@@ grub_dmraid_nv_detect (grub_disk_t disk
  
      default:
        return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
-                          "Unsupported RAID level: %d", sb.array.raid_level);
+                          "unsupported RAID level: %d", sb.array.raid_level);
      }
  
 +  array->name = NULL;
    array->number = 0;
    array->total_devs = sb.array.total_volumes;
    array->chunk_size = sb.array.stripe_block_size;
index 79363d143f1150fc16c90eec94b677b172540b00,306c66a8bc550f4570ec4e7fb75305e35dae4bfb..d29803719fd2129480007996eac44ae01b8d4b74
@@@ -245,60 -174,17 +245,60 @@@ grub_mdraid_detect (grub_disk_t disk, s
    if (grub_disk_read (disk, sector, 0, SB_BYTES, &sb))
      return grub_errno;
  
 -  /* Look whether there is a RAID superblock. */
 -  if (sb.md_magic != SB_MAGIC)
 +  /* Look whether there is a mdraid 0.90 superblock.  */
 +  if (sb.md_magic == SB_MAGIC)
 +    goto superblock_0_90;
 +
 +  /* Check for an 1.x superblock.
 +   * It's always aligned to a 4K boundary
 +   * and depending on the minor version it can be:
 +   * 0: At least 8K, but less than 12K, from end of device
 +   * 1: At start of device
 +   * 2: 4K from start of device.
 +   */
 +
 +  sb_1x = grub_malloc (sizeof (struct grub_raid_super_1x));
 +  if (!sb_1x)
 +    return grub_errno;
 +
 +  for (minor_version = 0; minor_version < 3; ++minor_version)
 +    {
 +      switch (minor_version)
 +      {
 +      case 0:
 +        sector = (size - 8 * 2) & ~(4 * 2 - 1);
 +        break;
 +      case 1:
 +        sector = 0;
 +        break;
 +      case 2:
 +        sector = 4 * 2;
 +        break;
 +      }
 +
 +      if (grub_disk_read
 +        (disk, sector, 0, sizeof (struct grub_raid_super_1x), sb_1x))
 +      {
 +        grub_free (sb_1x);
 +        return grub_errno;
 +      }
 +
 +      if (sb_1x->magic == SB_MAGIC)
 +      goto superblock_1_x;
 +    }
 +
 +  /* Neither 0.90 nor 1.x.  */
 +  if (grub_le_to_cpu32 (sb_1x->magic) != SB_MAGIC)
      return grub_error (GRUB_ERR_OUT_OF_RANGE, "not raid");
  
 -  /* FIXME: Also support version 1.0. */
 +superblock_0_90:
 +
    if (sb.major_version != 0 || sb.minor_version != 90)
      return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
-                      "Unsupported RAID version: %d.%d",
+                      "unsupported RAID version: %d.%d",
                       sb.major_version, sb.minor_version);
  
 -  /* FIXME: Check the checksum. */
 +  /* FIXME: Check the checksum.  */
  
    /* Multipath.  */
    if ((int) sb.level == -4)
    if (sb.level != 0 && sb.level != 1 && sb.level != 4 &&
        sb.level != 5 && sb.level != 6 && sb.level != 10)
      return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
-                      "Unsupported RAID level: %d", sb.level);
+                      "unsupported RAID level: %d", sb.level);
  
 +  array->name = NULL;
    array->number = sb.md_minor;
    array->level = sb.level;
    array->layout = sb.layout;
diff --cc disk/raid.c
Simple merge