grub2/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch
Dirk Mueller 5ccf9d5533 Accepting request 258927 from home:michael-chang:branches:Base:System
- fix errors when boot is btrfs with Windows partition scheme. The
  first partition is created on cylinder boundary that can't offer
  enough room for core.img and also the installation has to be in 
  logical paritition which made MBR the only location to install.
  (bnc#841247)
  * add grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch

OBS-URL: https://build.opensuse.org/request/show/258927
OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=123
2014-10-31 10:03:23 +00:00

61 lines
1.9 KiB
Diff

Index: grub-2.02~beta2/util/setup.c
===================================================================
--- grub-2.02~beta2.orig/util/setup.c
+++ grub-2.02~beta2/util/setup.c
@@ -501,8 +501,44 @@ SETUP (const char *dir,
err = grub_util_ldm_embed (dest_dev->disk, &nsec, maxsec,
GRUB_EMBED_PCBIOS, &sectors);
else if (ctx.dest_partmap)
- err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
- GRUB_EMBED_PCBIOS, &sectors);
+ {
+ err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
+ GRUB_EMBED_PCBIOS, &sectors);
+#ifdef GRUB_SETUP_BIOS
+ if (err == GRUB_ERR_OUT_OF_RANGE
+ && strcmp (ctx.dest_partmap->name, "msdos") == 0
+ && dest_dev->disk->id == root_dev->disk->id
+ && dest_dev->disk->dev->id == root_dev->disk->dev->id)
+ {
+ grub_fs_t root_fs;
+
+ root_fs = grub_fs_probe (root_dev);
+ if (root_fs && root_fs->embed)
+ {
+ grub_disk_addr_t *fs_sectors;
+ unsigned int fs_nsec;
+
+ fs_sectors = NULL;
+ fs_nsec = core_sectors;
+ err = root_fs->embed (root_dev, &fs_nsec, maxsec,
+ GRUB_EMBED_PCBIOS, &fs_sectors);
+ if (!err && fs_nsec >= core_sectors)
+ {
+ grub_util_info ("Your msdos embedding area is too small, will use file system embedding area instead");
+ sectors = fs_sectors;
+ nsec = fs_nsec;
+ ctx.container = root_dev->disk->partition;
+ core_dev = root_dev;
+ }
+ else
+ {
+ if (fs_sectors)
+ grub_free (fs_sectors);
+ }
+ }
+ }
+#endif
+ }
else
err = fs->embed (dest_dev, &nsec, maxsec,
GRUB_EMBED_PCBIOS, &sectors);
@@ -584,7 +620,7 @@ SETUP (const char *dir,
/* Write the core image onto the disk. */
for (i = 0; i < nsec; i++)
- grub_disk_write (dest_dev->disk, sectors[i], 0,
+ grub_disk_write (core_dev->disk, sectors[i], 0,
GRUB_DISK_SECTOR_SIZE,
core_img + i * GRUB_DISK_SECTOR_SIZE);