forked from pool/grub2
Dirk Mueller
5ccf9d5533
- 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
61 lines
1.9 KiB
Diff
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, §ors);
|
|
else if (ctx.dest_partmap)
|
|
- err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
|
|
- GRUB_EMBED_PCBIOS, §ors);
|
|
+ {
|
|
+ err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
|
|
+ GRUB_EMBED_PCBIOS, §ors);
|
|
+#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, §ors);
|
|
@@ -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);
|
|
|