diff --git a/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch new file mode 100644 index 0000000..7ab0b77 --- /dev/null +++ b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch @@ -0,0 +1,60 @@ +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); + diff --git a/grub2.changes b/grub2.changes index b96dc4b..d94ab3c 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,13 @@ +------------------------------------------------------------------- +Thu Oct 30 07:36:15 UTC 2014 - mchang@suse.com + +- 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 + ------------------------------------------------------------------- Tue Sep 30 03:45:04 UTC 2014 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index f25b274..2ee34c8 100644 --- a/grub2.spec +++ b/grub2.spec @@ -158,6 +158,7 @@ Patch45: grub2-efinet-reopen-SNP-protocol-for-exclusive-use-by-grub.patch Patch46: grub2-xen-legacy-config-device-name.patch Patch47: grub2-Initialized-initrd_ctx-so-we-don-t-free-a-random-poi.patch Patch48: grub2-btrfs-fix-get_root-key-comparison-failures-due-to-en.patch +Patch49: grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch # Btrfs snapshot booting related patches Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch Patch102: grub2-btrfs-02-export-subvolume-envvars.patch @@ -364,6 +365,7 @@ mv po/grub.pot po/%{name}.pot %patch46 -p1 %patch47 -p1 %patch48 -p1 +%patch49 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1