2009-05-10 Robert Millan * util/i386/pc/grub-setup.c (setup): Restructure code flow to make it easier to understand / work with. Index: util/i386/pc/grub-setup.c =================================================================== --- util/i386/pc/grub-setup.c (revision 2199) +++ util/i386/pc/grub-setup.c (working copy) @@ -310,17 +310,19 @@ dos_part, bsd_part); if (! dest_dev->disk->has_partitions) + { grub_util_warn ("Attempting to install GRUB to a partitionless disk. This is a BAD idea."); + goto unable_to_embed; + } if (dest_dev->disk->partition) + { grub_util_warn ("Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea."); + goto unable_to_embed; + } - /* If the destination device can have partitions and it is the MBR, - try to embed the core image into after the MBR. */ - if (dest_dev->disk->has_partitions && ! dest_dev->disk->partition) - { /* Unlike root_dev, with dest_dev we're interested in the partition map even - if dest_dev itself is a whole disk. */ + if dest_dev itself is a whole disk. */ auto int NESTED_FUNC_ATTR identify_partmap (grub_disk_t disk, const grub_partition_t p); int NESTED_FUNC_ATTR identify_partmap (grub_disk_t disk __attribute__ ((unused)), @@ -330,16 +332,22 @@ return 1; } grub_partition_iterate (dest_dev->disk, identify_partmap); - + grub_partition_iterate (dest_dev->disk, (strcmp (dest_partmap, "pc_partition_map") ? find_usable_region_gpt : find_usable_region_msdos)); - - if (embed_region.end != embed_region.start) - embedding_area_exists = 1; - - /* If there is enough space... */ - if ((unsigned long) core_sectors <= embed_region.end - embed_region.start) - { + if (embed_region.end == embed_region.start) + { + grub_util_warn ("Embedding area is not present at all!"); + goto unable_to_embed; + } + + if ((unsigned long) core_sectors > embed_region.end - embed_region.start) + { + grub_util_warn ("Embedding area is too small for core.img."); + goto unable_to_embed; + } + + grub_util_info ("will embed the core image at sector 0x%llx", embed_region.start); *install_dos_part = grub_cpu_to_le32 (dos_part); @@ -374,16 +382,9 @@ grub_util_error ("%s", grub_errmsg); goto finish; - } - } - /* If we reached this point, it means we were unable to embed. */ +unable_to_embed: - if (embedding_area_exists) - grub_util_warn ("Embedding area is too small for core.img."); - else - grub_util_warn ("Embedding area is not present at all!"); - if (must_embed) grub_util_error ("Embedding is not possible, but this is required when " "the root device is on a RAID array or LVM volume.");