All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] Warn if MBR gap is small and user uses advanced modules
@ 2020-04-27 15:51 Vladimir 'phcoder' Serbinenko
  2020-05-12 11:48 ` Daniel Kiper
  0 siblings, 1 reply; 4+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2020-04-27 15:51 UTC (permalink / raw)
  To: The development of GRUB 2

We don't want to support small MBR gap in pair with anything but
the simplest config of biosdisk+part_msdos+simple filesystem. In this
path "simple filesystems" are all current filesystems except zfs and
btrfs.
---
 grub-core/partmap/gpt.c     |  9 ++++++++-
 grub-core/partmap/msdos.c   |  7 ++++++-
 include/grub/partition.h    |  4 +++-
 include/grub/util/install.h |  7 +++++--
 util/grub-install-common.c  | 24 ++++++++++++++++++++++++
 util/grub-install.c         | 10 +++++++---
 util/grub-setup.c           |  2 +-
 util/setup.c                |  5 +++--
 8 files changed, 57 insertions(+), 11 deletions(-)

diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
index 103f6796f..6b979f7c3 100644
--- a/grub-core/partmap/gpt.c
+++ b/grub-core/partmap/gpt.c
@@ -25,6 +25,9 @@
 #include <grub/msdos_partition.h>
 #include <grub/gpt_partition.h>
 #include <grub/i18n.h>
+#ifdef GRUB_UTIL
+#include <grub/emu/misc.h>
+#endif

 GRUB_MOD_LICENSE ("GPLv3+");

@@ -169,7 +172,8 @@ static grub_err_t
 gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
  unsigned int max_nsectors,
  grub_embed_type_t embed_type,
- grub_disk_addr_t **sectors)
+ grub_disk_addr_t **sectors,
+ int warn_short)
 {
   struct gpt_partition_map_embed_ctx ctx = {
     .start = 0,
@@ -191,6 +195,9 @@ gpt_partition_map_embed (struct grub_disk *disk,
unsigned int *nsectors,
         N_("this GPT partition label contains no BIOS Boot Partition;"
    " embedding won't be possible"));

+  if (ctx.len < GRUB_MIN_RECOMMENDED_MBRGAP) {
+    grub_util_warn("Your BIOS Boot Partition is under 1 MiB, please
increase its size.");
+  }
   if (ctx.len < *nsectors)
     return grub_error (GRUB_ERR_OUT_OF_RANGE,
         N_("your BIOS Boot Partition is too small;"
diff --git a/grub-core/partmap/msdos.c b/grub-core/partmap/msdos.c
index 7b8e45076..400d7521d 100644
--- a/grub-core/partmap/msdos.c
+++ b/grub-core/partmap/msdos.c
@@ -236,7 +236,8 @@ static grub_err_t
 pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
  unsigned int max_nsectors,
  grub_embed_type_t embed_type,
- grub_disk_addr_t **sectors)
+ grub_disk_addr_t **sectors,
+ int warn_short)
 {
   grub_disk_addr_t end = ~0ULL;
   struct grub_msdos_partition_mbr mbr;
@@ -390,6 +391,10 @@ pc_partition_map_embed (struct grub_disk *disk,
unsigned int *nsectors,
       return GRUB_ERR_NONE;
     }

+  if (end < GRUB_MIN_RECOMMENDED_MBRGAP && warn_short) {
+    grub_util_warn("You have a short MBR gap and use advanced config.
Please increase post-MBR gap");
+  }
+
   if (end <= 1)
     return grub_error (GRUB_ERR_FILE_NOT_FOUND,
         N_("this msdos-style partition label has no "
diff --git a/include/grub/partition.h b/include/grub/partition.h
index 7adb7ec6e..adc50d680 100644
--- a/include/grub/partition.h
+++ b/include/grub/partition.h
@@ -52,10 +52,12 @@ struct grub_partition_map
  grub_partition_iterate_hook_t hook, void *hook_data);
 #ifdef GRUB_UTIL
   /* Determine sectors available for embedding.  */
+#define GRUB_MIN_RECOMMENDED_MBRGAP 1900
   grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
         unsigned int max_nsectors,
         grub_embed_type_t embed_type,
-        grub_disk_addr_t **sectors);
+        grub_disk_addr_t **sectors,
+        int warn_short);
 #endif
 };
 typedef struct grub_partition_map *grub_partition_map_t;
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
index 2631b1074..640c71d28 100644
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -193,13 +193,13 @@ grub_util_bios_setup (const char *dir,
        const char *boot_file, const char *core_file,
        const char *dest, int force,
        int fs_probe, int allow_floppy,
-       int add_rs_codes);
+       int add_rs_codes, int warn_short_mbr_gap);
 void
 grub_util_sparc_setup (const char *dir,
         const char *boot_file, const char *core_file,
         const char *dest, int force,
         int fs_probe, int allow_floppy,
-        int add_rs_codes);
+        int add_rs_codes, int warn_short_mbr_gap);

 char *
 grub_install_get_image_targets_string (void);
@@ -265,4 +265,7 @@ grub_util_get_target_name (const struct
grub_install_image_target_desc *t);
 extern char *grub_install_copy_buffer;
 #define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576

+int
+grub_install_is_short_mbrgap_supported(void);
+
 #endif
diff --git a/util/grub-install-common.c b/util/grub-install-common.c
index ca0ac612a..b3100b54a 100644
--- a/util/grub-install-common.c
+++ b/util/grub-install-common.c
@@ -234,6 +234,30 @@ char *grub_install_source_directory = NULL;
 char *grub_install_locale_directory = NULL;
 char *grub_install_themes_directory = NULL;

+int
+grub_install_is_short_mbrgap_supported()
+{
+  int i, j;
+  static const char *whitelist[] =
+    {
+     "part_msdos", "biosdisk", "affs", "afs", "bfs", "archelp",
+     "cpio", "cpio_be", "newc", "odc", "ext2", "fat", "exfat",
+     "f2fs", "fshelp", "hfs", "hfsplus", "hfspluscomp",
+     "iso9660", "jfs", "minix", "minix2", "minix3", "minix_be",
+     "minix2_be", "minix2_be", "nilfs2", "ntfs", "ntfscomp",
+     "reiserfs", "romfs", "sfs", "squash4", "tar", "udf",
+     "ufs1", "ufs1_be", "ufs2", "xfs"
+    };
+  for (i = 0; i < modules.n_entries; i++) {
+    for (j = 0; j < ARRAY_SIZE (whitelist); j++)
+      if (strcmp(modules.entries[i], whitelist[j]) == 0)
+ break;
+    if (j == ARRAY_SIZE (whitelist))
+      return 0;
+  }
+  return 1;
+}
+
 void
 grub_install_push_module (const char *val)
 {
diff --git a/util/grub-install.c b/util/grub-install.c
index 8970b73aa..6db06c99b 100644
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -1718,10 +1718,14 @@ main (int argc, char *argv[])
  install_device);

  /*  Now perform the installation.  */
- if (install_bootsector)
+ if (install_bootsector) {
+   int warn_short_mbr_gap = grub_install_is_short_mbrgap_supported();
+
    grub_util_bios_setup (platdir, "boot.img", "core.img",
  install_drive, force,
- fs_probe, allow_floppy, add_rs_codes);
+ fs_probe, allow_floppy, add_rs_codes,
+ warn_short_mbr_gap);
+ }
  break;
       }
     case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
@@ -1748,7 +1752,7 @@ main (int argc, char *argv[])
    grub_util_sparc_setup (platdir, "boot.img", "core.img",
  install_drive, force,
  fs_probe, allow_floppy,
- 0 /* unused */ );
+ 0 /* unused */, 0 /* unused */ );
  break;
       }

diff --git a/util/grub-setup.c b/util/grub-setup.c
index 42b98ad3c..1783224dd 100644
--- a/util/grub-setup.c
+++ b/util/grub-setup.c
@@ -315,7 +315,7 @@ main (int argc, char *argv[])
     arguments.core_file ? : DEFAULT_CORE_FILE,
     dest_dev, arguments.force,
     arguments.fs_probe, arguments.allow_floppy,
-    arguments.add_rs_codes);
+    arguments.add_rs_codes, 0);

   /* Free resources.  */
   grub_fini_all ();
diff --git a/util/setup.c b/util/setup.c
index 3be88aae1..da5f2c07f 100644
--- a/util/setup.c
+++ b/util/setup.c
@@ -254,7 +254,8 @@ SETUP (const char *dir,
        const char *boot_file, const char *core_file,
        const char *dest, int force,
        int fs_probe, int allow_floppy,
-       int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
+       int add_rs_codes __attribute__ ((unused)), /* unused on sparc64 */
+       int warn_small)
 {
   char *core_path;
   char *boot_img, *core_img, *boot_path;
@@ -530,7 +531,7 @@ SETUP (const char *dir,
  GRUB_EMBED_PCBIOS, &sectors);
     else if (ctx.dest_partmap)
       err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
-      GRUB_EMBED_PCBIOS, &sectors);
+      GRUB_EMBED_PCBIOS, &sectors, warn_small);
     else
       err = fs->fs_embed (dest_dev, &nsec, maxsec,
    GRUB_EMBED_PCBIOS, &sectors);
-- 
2.20.1


-- 
Regards
Vladimir 'phcoder' Serbinenko


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] Warn if MBR gap is small and user uses advanced modules
  2020-04-27 15:51 [PATCH v2] Warn if MBR gap is small and user uses advanced modules Vladimir 'phcoder' Serbinenko
@ 2020-05-12 11:48 ` Daniel Kiper
  2020-05-29 13:09   ` Vladimir 'phcoder' Serbinenko
  0 siblings, 1 reply; 4+ messages in thread
From: Daniel Kiper @ 2020-05-12 11:48 UTC (permalink / raw)
  To: Vladimir 'phcoder' Serbinenko
  Cc: The development of GRUB 2, ionic, javierm, mchang, pjones

On Mon, Apr 27, 2020 at 05:51:34PM +0200, Vladimir 'phcoder' Serbinenko wrote:
> We don't want to support small MBR gap in pair with anything but
> the simplest config of biosdisk+part_msdos+simple filesystem. In this
> path "simple filesystems" are all current filesystems except zfs and
> btrfs.

The patch LGTM. If there are no objections I will take it in a week or so.

Additionally, I hope that Vladimir will be able to prepare a doc patch
describing the issue and why we introduced these warnings.

Daniel

> ---
>  grub-core/partmap/gpt.c     |  9 ++++++++-
>  grub-core/partmap/msdos.c   |  7 ++++++-
>  include/grub/partition.h    |  4 +++-
>  include/grub/util/install.h |  7 +++++--
>  util/grub-install-common.c  | 24 ++++++++++++++++++++++++
>  util/grub-install.c         | 10 +++++++---
>  util/grub-setup.c           |  2 +-
>  util/setup.c                |  5 +++--
>  8 files changed, 57 insertions(+), 11 deletions(-)
>
> diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
> index 103f6796f..6b979f7c3 100644
> --- a/grub-core/partmap/gpt.c
> +++ b/grub-core/partmap/gpt.c
> @@ -25,6 +25,9 @@
>  #include <grub/msdos_partition.h>
>  #include <grub/gpt_partition.h>
>  #include <grub/i18n.h>
> +#ifdef GRUB_UTIL
> +#include <grub/emu/misc.h>
> +#endif
>
>  GRUB_MOD_LICENSE ("GPLv3+");
>
> @@ -169,7 +172,8 @@ static grub_err_t
>  gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
>   unsigned int max_nsectors,
>   grub_embed_type_t embed_type,
> - grub_disk_addr_t **sectors)
> + grub_disk_addr_t **sectors,
> + int warn_short)
>  {
>    struct gpt_partition_map_embed_ctx ctx = {
>      .start = 0,
> @@ -191,6 +195,9 @@ gpt_partition_map_embed (struct grub_disk *disk,
> unsigned int *nsectors,
>          N_("this GPT partition label contains no BIOS Boot Partition;"
>     " embedding won't be possible"));
>
> +  if (ctx.len < GRUB_MIN_RECOMMENDED_MBRGAP) {
> +    grub_util_warn("Your BIOS Boot Partition is under 1 MiB, please
> increase its size.");
> +  }
>    if (ctx.len < *nsectors)
>      return grub_error (GRUB_ERR_OUT_OF_RANGE,
>          N_("your BIOS Boot Partition is too small;"
> diff --git a/grub-core/partmap/msdos.c b/grub-core/partmap/msdos.c
> index 7b8e45076..400d7521d 100644
> --- a/grub-core/partmap/msdos.c
> +++ b/grub-core/partmap/msdos.c
> @@ -236,7 +236,8 @@ static grub_err_t
>  pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
>   unsigned int max_nsectors,
>   grub_embed_type_t embed_type,
> - grub_disk_addr_t **sectors)
> + grub_disk_addr_t **sectors,
> + int warn_short)
>  {
>    grub_disk_addr_t end = ~0ULL;
>    struct grub_msdos_partition_mbr mbr;
> @@ -390,6 +391,10 @@ pc_partition_map_embed (struct grub_disk *disk,
> unsigned int *nsectors,
>        return GRUB_ERR_NONE;
>      }
>
> +  if (end < GRUB_MIN_RECOMMENDED_MBRGAP && warn_short) {
> +    grub_util_warn("You have a short MBR gap and use advanced config.
> Please increase post-MBR gap");
> +  }
> +
>    if (end <= 1)
>      return grub_error (GRUB_ERR_FILE_NOT_FOUND,
>          N_("this msdos-style partition label has no "
> diff --git a/include/grub/partition.h b/include/grub/partition.h
> index 7adb7ec6e..adc50d680 100644
> --- a/include/grub/partition.h
> +++ b/include/grub/partition.h
> @@ -52,10 +52,12 @@ struct grub_partition_map
>   grub_partition_iterate_hook_t hook, void *hook_data);
>  #ifdef GRUB_UTIL
>    /* Determine sectors available for embedding.  */
> +#define GRUB_MIN_RECOMMENDED_MBRGAP 1900
>    grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
>          unsigned int max_nsectors,
>          grub_embed_type_t embed_type,
> -        grub_disk_addr_t **sectors);
> +        grub_disk_addr_t **sectors,
> +        int warn_short);
>  #endif
>  };
>  typedef struct grub_partition_map *grub_partition_map_t;
> diff --git a/include/grub/util/install.h b/include/grub/util/install.h
> index 2631b1074..640c71d28 100644
> --- a/include/grub/util/install.h
> +++ b/include/grub/util/install.h
> @@ -193,13 +193,13 @@ grub_util_bios_setup (const char *dir,
>         const char *boot_file, const char *core_file,
>         const char *dest, int force,
>         int fs_probe, int allow_floppy,
> -       int add_rs_codes);
> +       int add_rs_codes, int warn_short_mbr_gap);
>  void
>  grub_util_sparc_setup (const char *dir,
>          const char *boot_file, const char *core_file,
>          const char *dest, int force,
>          int fs_probe, int allow_floppy,
> -        int add_rs_codes);
> +        int add_rs_codes, int warn_short_mbr_gap);
>
>  char *
>  grub_install_get_image_targets_string (void);
> @@ -265,4 +265,7 @@ grub_util_get_target_name (const struct
> grub_install_image_target_desc *t);
>  extern char *grub_install_copy_buffer;
>  #define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
>
> +int
> +grub_install_is_short_mbrgap_supported(void);
> +
>  #endif
> diff --git a/util/grub-install-common.c b/util/grub-install-common.c
> index ca0ac612a..b3100b54a 100644
> --- a/util/grub-install-common.c
> +++ b/util/grub-install-common.c
> @@ -234,6 +234,30 @@ char *grub_install_source_directory = NULL;
>  char *grub_install_locale_directory = NULL;
>  char *grub_install_themes_directory = NULL;
>
> +int
> +grub_install_is_short_mbrgap_supported()
> +{
> +  int i, j;
> +  static const char *whitelist[] =
> +    {
> +     "part_msdos", "biosdisk", "affs", "afs", "bfs", "archelp",
> +     "cpio", "cpio_be", "newc", "odc", "ext2", "fat", "exfat",
> +     "f2fs", "fshelp", "hfs", "hfsplus", "hfspluscomp",
> +     "iso9660", "jfs", "minix", "minix2", "minix3", "minix_be",
> +     "minix2_be", "minix2_be", "nilfs2", "ntfs", "ntfscomp",
> +     "reiserfs", "romfs", "sfs", "squash4", "tar", "udf",
> +     "ufs1", "ufs1_be", "ufs2", "xfs"
> +    };
> +  for (i = 0; i < modules.n_entries; i++) {
> +    for (j = 0; j < ARRAY_SIZE (whitelist); j++)
> +      if (strcmp(modules.entries[i], whitelist[j]) == 0)
> + break;
> +    if (j == ARRAY_SIZE (whitelist))
> +      return 0;
> +  }
> +  return 1;
> +}
> +
>  void
>  grub_install_push_module (const char *val)
>  {
> diff --git a/util/grub-install.c b/util/grub-install.c
> index 8970b73aa..6db06c99b 100644
> --- a/util/grub-install.c
> +++ b/util/grub-install.c
> @@ -1718,10 +1718,14 @@ main (int argc, char *argv[])
>   install_device);
>
>   /*  Now perform the installation.  */
> - if (install_bootsector)
> + if (install_bootsector) {
> +   int warn_short_mbr_gap = grub_install_is_short_mbrgap_supported();
> +
>     grub_util_bios_setup (platdir, "boot.img", "core.img",
>   install_drive, force,
> - fs_probe, allow_floppy, add_rs_codes);
> + fs_probe, allow_floppy, add_rs_codes,
> + warn_short_mbr_gap);
> + }
>   break;
>        }
>      case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
> @@ -1748,7 +1752,7 @@ main (int argc, char *argv[])
>     grub_util_sparc_setup (platdir, "boot.img", "core.img",
>   install_drive, force,
>   fs_probe, allow_floppy,
> - 0 /* unused */ );
> + 0 /* unused */, 0 /* unused */ );
>   break;
>        }
>
> diff --git a/util/grub-setup.c b/util/grub-setup.c
> index 42b98ad3c..1783224dd 100644
> --- a/util/grub-setup.c
> +++ b/util/grub-setup.c
> @@ -315,7 +315,7 @@ main (int argc, char *argv[])
>      arguments.core_file ? : DEFAULT_CORE_FILE,
>      dest_dev, arguments.force,
>      arguments.fs_probe, arguments.allow_floppy,
> -    arguments.add_rs_codes);
> +    arguments.add_rs_codes, 0);
>
>    /* Free resources.  */
>    grub_fini_all ();
> diff --git a/util/setup.c b/util/setup.c
> index 3be88aae1..da5f2c07f 100644
> --- a/util/setup.c
> +++ b/util/setup.c
> @@ -254,7 +254,8 @@ SETUP (const char *dir,
>         const char *boot_file, const char *core_file,
>         const char *dest, int force,
>         int fs_probe, int allow_floppy,
> -       int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
> +       int add_rs_codes __attribute__ ((unused)), /* unused on sparc64 */
> +       int warn_small)
>  {
>    char *core_path;
>    char *boot_img, *core_img, *boot_path;
> @@ -530,7 +531,7 @@ SETUP (const char *dir,
>   GRUB_EMBED_PCBIOS, &sectors);
>      else if (ctx.dest_partmap)
>        err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
> -      GRUB_EMBED_PCBIOS, &sectors);
> +      GRUB_EMBED_PCBIOS, &sectors, warn_small);
>      else
>        err = fs->fs_embed (dest_dev, &nsec, maxsec,
>     GRUB_EMBED_PCBIOS, &sectors);
> --
> 2.20.1
>
>
> --
> Regards
> Vladimir 'phcoder' Serbinenko
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] Warn if MBR gap is small and user uses advanced modules
  2020-05-12 11:48 ` Daniel Kiper
@ 2020-05-29 13:09   ` Vladimir 'phcoder' Serbinenko
  2020-05-29 13:10     ` Vladimir 'phcoder' Serbinenko
  0 siblings, 1 reply; 4+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2020-05-29 13:09 UTC (permalink / raw)
  To: Daniel Kiper
  Cc: The development of GRUB 2, Mihai Moldovan,
	Javier Martinez Canillas, Michael Chang, Peter Jones

[-- Attachment #1: Type: text/plain, Size: 9265 bytes --]

On Tue, May 12, 2020 at 1:48 PM Daniel Kiper <dkiper@net-space.pl> wrote:
>
> On Mon, Apr 27, 2020 at 05:51:34PM +0200, Vladimir 'phcoder' Serbinenko wrote:
> > We don't want to support small MBR gap in pair with anything but
> > the simplest config of biosdisk+part_msdos+simple filesystem. In this
> > path "simple filesystems" are all current filesystems except zfs and
> > btrfs.
>
> The patch LGTM. If there are no objections I will take it in a week or so.
>
> Additionally, I hope that Vladimir will be able to prepare a doc patch
> describing the issue and why we introduced these warnings.
>
> Daniel
>
> > ---
> >  grub-core/partmap/gpt.c     |  9 ++++++++-
> >  grub-core/partmap/msdos.c   |  7 ++++++-
> >  include/grub/partition.h    |  4 +++-
> >  include/grub/util/install.h |  7 +++++--
> >  util/grub-install-common.c  | 24 ++++++++++++++++++++++++
> >  util/grub-install.c         | 10 +++++++---
> >  util/grub-setup.c           |  2 +-
> >  util/setup.c                |  5 +++--
> >  8 files changed, 57 insertions(+), 11 deletions(-)
> >
> > diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
> > index 103f6796f..6b979f7c3 100644
> > --- a/grub-core/partmap/gpt.c
> > +++ b/grub-core/partmap/gpt.c
> > @@ -25,6 +25,9 @@
> >  #include <grub/msdos_partition.h>
> >  #include <grub/gpt_partition.h>
> >  #include <grub/i18n.h>
> > +#ifdef GRUB_UTIL
> > +#include <grub/emu/misc.h>
> > +#endif
> >
> >  GRUB_MOD_LICENSE ("GPLv3+");
> >
> > @@ -169,7 +172,8 @@ static grub_err_t
> >  gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
> >   unsigned int max_nsectors,
> >   grub_embed_type_t embed_type,
> > - grub_disk_addr_t **sectors)
> > + grub_disk_addr_t **sectors,
> > + int warn_short)
> >  {
> >    struct gpt_partition_map_embed_ctx ctx = {
> >      .start = 0,
> > @@ -191,6 +195,9 @@ gpt_partition_map_embed (struct grub_disk *disk,
> > unsigned int *nsectors,
> >          N_("this GPT partition label contains no BIOS Boot Partition;"
> >     " embedding won't be possible"));
> >
> > +  if (ctx.len < GRUB_MIN_RECOMMENDED_MBRGAP) {
> > +    grub_util_warn("Your BIOS Boot Partition is under 1 MiB, please
> > increase its size.");
> > +  }
> >    if (ctx.len < *nsectors)
> >      return grub_error (GRUB_ERR_OUT_OF_RANGE,
> >          N_("your BIOS Boot Partition is too small;"
> > diff --git a/grub-core/partmap/msdos.c b/grub-core/partmap/msdos.c
> > index 7b8e45076..400d7521d 100644
> > --- a/grub-core/partmap/msdos.c
> > +++ b/grub-core/partmap/msdos.c
> > @@ -236,7 +236,8 @@ static grub_err_t
> >  pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
> >   unsigned int max_nsectors,
> >   grub_embed_type_t embed_type,
> > - grub_disk_addr_t **sectors)
> > + grub_disk_addr_t **sectors,
> > + int warn_short)
> >  {
> >    grub_disk_addr_t end = ~0ULL;
> >    struct grub_msdos_partition_mbr mbr;
> > @@ -390,6 +391,10 @@ pc_partition_map_embed (struct grub_disk *disk,
> > unsigned int *nsectors,
> >        return GRUB_ERR_NONE;
> >      }
> >
> > +  if (end < GRUB_MIN_RECOMMENDED_MBRGAP && warn_short) {
> > +    grub_util_warn("You have a short MBR gap and use advanced config.
> > Please increase post-MBR gap");
> > +  }
> > +
> >    if (end <= 1)
> >      return grub_error (GRUB_ERR_FILE_NOT_FOUND,
> >          N_("this msdos-style partition label has no "
> > diff --git a/include/grub/partition.h b/include/grub/partition.h
> > index 7adb7ec6e..adc50d680 100644
> > --- a/include/grub/partition.h
> > +++ b/include/grub/partition.h
> > @@ -52,10 +52,12 @@ struct grub_partition_map
> >   grub_partition_iterate_hook_t hook, void *hook_data);
> >  #ifdef GRUB_UTIL
> >    /* Determine sectors available for embedding.  */
> > +#define GRUB_MIN_RECOMMENDED_MBRGAP 1900
> >    grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
> >          unsigned int max_nsectors,
> >          grub_embed_type_t embed_type,
> > -        grub_disk_addr_t **sectors);
> > +        grub_disk_addr_t **sectors,
> > +        int warn_short);
> >  #endif
> >  };
> >  typedef struct grub_partition_map *grub_partition_map_t;
> > diff --git a/include/grub/util/install.h b/include/grub/util/install.h
> > index 2631b1074..640c71d28 100644
> > --- a/include/grub/util/install.h
> > +++ b/include/grub/util/install.h
> > @@ -193,13 +193,13 @@ grub_util_bios_setup (const char *dir,
> >         const char *boot_file, const char *core_file,
> >         const char *dest, int force,
> >         int fs_probe, int allow_floppy,
> > -       int add_rs_codes);
> > +       int add_rs_codes, int warn_short_mbr_gap);
> >  void
> >  grub_util_sparc_setup (const char *dir,
> >          const char *boot_file, const char *core_file,
> >          const char *dest, int force,
> >          int fs_probe, int allow_floppy,
> > -        int add_rs_codes);
> > +        int add_rs_codes, int warn_short_mbr_gap);
> >
> >  char *
> >  grub_install_get_image_targets_string (void);
> > @@ -265,4 +265,7 @@ grub_util_get_target_name (const struct
> > grub_install_image_target_desc *t);
> >  extern char *grub_install_copy_buffer;
> >  #define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
> >
> > +int
> > +grub_install_is_short_mbrgap_supported(void);
> > +
> >  #endif
> > diff --git a/util/grub-install-common.c b/util/grub-install-common.c
> > index ca0ac612a..b3100b54a 100644
> > --- a/util/grub-install-common.c
> > +++ b/util/grub-install-common.c
> > @@ -234,6 +234,30 @@ char *grub_install_source_directory = NULL;
> >  char *grub_install_locale_directory = NULL;
> >  char *grub_install_themes_directory = NULL;
> >
> > +int
> > +grub_install_is_short_mbrgap_supported()
> > +{
> > +  int i, j;
> > +  static const char *whitelist[] =
> > +    {
> > +     "part_msdos", "biosdisk", "affs", "afs", "bfs", "archelp",
> > +     "cpio", "cpio_be", "newc", "odc", "ext2", "fat", "exfat",
> > +     "f2fs", "fshelp", "hfs", "hfsplus", "hfspluscomp",
> > +     "iso9660", "jfs", "minix", "minix2", "minix3", "minix_be",
> > +     "minix2_be", "minix2_be", "nilfs2", "ntfs", "ntfscomp",
> > +     "reiserfs", "romfs", "sfs", "squash4", "tar", "udf",
> > +     "ufs1", "ufs1_be", "ufs2", "xfs"
> > +    };
> > +  for (i = 0; i < modules.n_entries; i++) {
> > +    for (j = 0; j < ARRAY_SIZE (whitelist); j++)
> > +      if (strcmp(modules.entries[i], whitelist[j]) == 0)
> > + break;
> > +    if (j == ARRAY_SIZE (whitelist))
> > +      return 0;
> > +  }
> > +  return 1;
> > +}
> > +
> >  void
> >  grub_install_push_module (const char *val)
> >  {
> > diff --git a/util/grub-install.c b/util/grub-install.c
> > index 8970b73aa..6db06c99b 100644
> > --- a/util/grub-install.c
> > +++ b/util/grub-install.c
> > @@ -1718,10 +1718,14 @@ main (int argc, char *argv[])
> >   install_device);
> >
> >   /*  Now perform the installation.  */
> > - if (install_bootsector)
> > + if (install_bootsector) {
> > +   int warn_short_mbr_gap = grub_install_is_short_mbrgap_supported();
> > +
> >     grub_util_bios_setup (platdir, "boot.img", "core.img",
> >   install_drive, force,
> > - fs_probe, allow_floppy, add_rs_codes);
> > + fs_probe, allow_floppy, add_rs_codes,
> > + warn_short_mbr_gap);
> > + }
> >   break;
> >        }
> >      case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
> > @@ -1748,7 +1752,7 @@ main (int argc, char *argv[])
> >     grub_util_sparc_setup (platdir, "boot.img", "core.img",
> >   install_drive, force,
> >   fs_probe, allow_floppy,
> > - 0 /* unused */ );
> > + 0 /* unused */, 0 /* unused */ );
> >   break;
> >        }
> >
> > diff --git a/util/grub-setup.c b/util/grub-setup.c
> > index 42b98ad3c..1783224dd 100644
> > --- a/util/grub-setup.c
> > +++ b/util/grub-setup.c
> > @@ -315,7 +315,7 @@ main (int argc, char *argv[])
> >      arguments.core_file ? : DEFAULT_CORE_FILE,
> >      dest_dev, arguments.force,
> >      arguments.fs_probe, arguments.allow_floppy,
> > -    arguments.add_rs_codes);
> > +    arguments.add_rs_codes, 0);
> >
> >    /* Free resources.  */
> >    grub_fini_all ();
> > diff --git a/util/setup.c b/util/setup.c
> > index 3be88aae1..da5f2c07f 100644
> > --- a/util/setup.c
> > +++ b/util/setup.c
> > @@ -254,7 +254,8 @@ SETUP (const char *dir,
> >         const char *boot_file, const char *core_file,
> >         const char *dest, int force,
> >         int fs_probe, int allow_floppy,
> > -       int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
> > +       int add_rs_codes __attribute__ ((unused)), /* unused on sparc64 */
> > +       int warn_small)
> >  {
> >    char *core_path;
> >    char *boot_img, *core_img, *boot_path;
> > @@ -530,7 +531,7 @@ SETUP (const char *dir,
> >   GRUB_EMBED_PCBIOS, &sectors);
> >      else if (ctx.dest_partmap)
> >        err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
> > -      GRUB_EMBED_PCBIOS, &sectors);
> > +      GRUB_EMBED_PCBIOS, &sectors, warn_small);
> >      else
> >        err = fs->fs_embed (dest_dev, &nsec, maxsec,
> >     GRUB_EMBED_PCBIOS, &sectors);
> > --
> > 2.20.1
> >
> >
> > --
> > Regards
> > Vladimir 'phcoder' Serbinenko
> >
> > _______________________________________________
> > Grub-devel mailing list
> > Grub-devel@gnu.org
> > https://lists.gnu.org/mailman/listinfo/grub-devel



-- 
Regards
Vladimir 'phcoder' Serbinenko

[-- Attachment #2: 0001-Warn-if-MBR-gap-is-small-and-user-uses-advanced-modu.patch --]
[-- Type: application/octet-stream, Size: 8052 bytes --]

From cb82e155ef100691e5a9778b88d42e3c10693665 Mon Sep 17 00:00:00 2001
From: Vladimir Serbinenko <phcoder@google.com>
Date: Mon, 27 Apr 2020 17:50:04 +0200
Subject: [PATCH] Warn if MBR gap is small and user uses advanced modules

We don't want to support small MBR gap in pair with anything but
the simplest config of biosdisk+part_msdos+simple filesystem. In this
path "simple filesystems" are all current filesystems except zfs and
btrfs.
---
 grub-core/partmap/gpt.c     |  9 ++++++++-
 grub-core/partmap/msdos.c   |  7 ++++++-
 include/grub/partition.h    |  4 +++-
 include/grub/util/install.h |  7 +++++--
 util/grub-install-common.c  | 24 ++++++++++++++++++++++++
 util/grub-install.c         | 10 +++++++---
 util/grub-setup.c           |  2 +-
 util/setup.c                |  5 +++--
 8 files changed, 57 insertions(+), 11 deletions(-)

diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
index 103f6796f..6b979f7c3 100644
--- a/grub-core/partmap/gpt.c
+++ b/grub-core/partmap/gpt.c
@@ -25,6 +25,9 @@
 #include <grub/msdos_partition.h>
 #include <grub/gpt_partition.h>
 #include <grub/i18n.h>
+#ifdef GRUB_UTIL
+#include <grub/emu/misc.h>
+#endif
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
@@ -169,7 +172,8 @@ static grub_err_t
 gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
 			 unsigned int max_nsectors,
 			 grub_embed_type_t embed_type,
-			 grub_disk_addr_t **sectors)
+			 grub_disk_addr_t **sectors,
+			 int warn_short)
 {
   struct gpt_partition_map_embed_ctx ctx = {
     .start = 0,
@@ -191,6 +195,9 @@ gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
 		       N_("this GPT partition label contains no BIOS Boot Partition;"
 			  " embedding won't be possible"));
 
+  if (ctx.len < GRUB_MIN_RECOMMENDED_MBRGAP) {
+    grub_util_warn("Your BIOS Boot Partition is under 1 MiB, please increase its size.");
+  }
   if (ctx.len < *nsectors)
     return grub_error (GRUB_ERR_OUT_OF_RANGE,
 		       N_("your BIOS Boot Partition is too small;"
diff --git a/grub-core/partmap/msdos.c b/grub-core/partmap/msdos.c
index 7b8e45076..400d7521d 100644
--- a/grub-core/partmap/msdos.c
+++ b/grub-core/partmap/msdos.c
@@ -236,7 +236,8 @@ static grub_err_t
 pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
 			unsigned int max_nsectors,
 			grub_embed_type_t embed_type,
-			grub_disk_addr_t **sectors)
+			grub_disk_addr_t **sectors,
+			int warn_short)
 {
   grub_disk_addr_t end = ~0ULL;
   struct grub_msdos_partition_mbr mbr;
@@ -390,6 +391,10 @@ pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
       return GRUB_ERR_NONE;
     }
 
+  if (end < GRUB_MIN_RECOMMENDED_MBRGAP && warn_short) {
+    grub_util_warn("You have a short MBR gap and use advanced config. Please increase post-MBR gap");
+  }
+
   if (end <= 1)
     return grub_error (GRUB_ERR_FILE_NOT_FOUND,
 		       N_("this msdos-style partition label has no "
diff --git a/include/grub/partition.h b/include/grub/partition.h
index 7adb7ec6e..adc50d680 100644
--- a/include/grub/partition.h
+++ b/include/grub/partition.h
@@ -52,10 +52,12 @@ struct grub_partition_map
 			 grub_partition_iterate_hook_t hook, void *hook_data);
 #ifdef GRUB_UTIL
   /* Determine sectors available for embedding.  */
+#define GRUB_MIN_RECOMMENDED_MBRGAP 1900
   grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
 		       unsigned int max_nsectors,
 		       grub_embed_type_t embed_type,
-		       grub_disk_addr_t **sectors);
+		       grub_disk_addr_t **sectors,
+		       int warn_short);
 #endif
 };
 typedef struct grub_partition_map *grub_partition_map_t;
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
index 2631b1074..640c71d28 100644
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -193,13 +193,13 @@ grub_util_bios_setup (const char *dir,
 		      const char *boot_file, const char *core_file,
 		      const char *dest, int force,
 		      int fs_probe, int allow_floppy,
-		      int add_rs_codes);
+		      int add_rs_codes, int warn_short_mbr_gap);
 void
 grub_util_sparc_setup (const char *dir,
 		       const char *boot_file, const char *core_file,
 		       const char *dest, int force,
 		       int fs_probe, int allow_floppy,
-		       int add_rs_codes);
+		       int add_rs_codes, int warn_short_mbr_gap);
 
 char *
 grub_install_get_image_targets_string (void);
@@ -265,4 +265,7 @@ grub_util_get_target_name (const struct grub_install_image_target_desc *t);
 extern char *grub_install_copy_buffer;
 #define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
 
+int
+grub_install_is_short_mbrgap_supported(void);
+
 #endif
diff --git a/util/grub-install-common.c b/util/grub-install-common.c
index ca0ac612a..b3100b54a 100644
--- a/util/grub-install-common.c
+++ b/util/grub-install-common.c
@@ -234,6 +234,30 @@ char *grub_install_source_directory = NULL;
 char *grub_install_locale_directory = NULL;
 char *grub_install_themes_directory = NULL;
 
+int
+grub_install_is_short_mbrgap_supported()
+{
+  int i, j;
+  static const char *whitelist[] =
+    {
+     "part_msdos", "biosdisk", "affs", "afs", "bfs", "archelp",
+     "cpio", "cpio_be", "newc", "odc", "ext2", "fat", "exfat",
+     "f2fs", "fshelp", "hfs", "hfsplus", "hfspluscomp",
+     "iso9660", "jfs", "minix", "minix2", "minix3", "minix_be",
+     "minix2_be", "minix2_be", "nilfs2", "ntfs", "ntfscomp",
+     "reiserfs", "romfs", "sfs", "squash4", "tar", "udf",
+     "ufs1", "ufs1_be", "ufs2", "xfs"
+    };
+  for (i = 0; i < modules.n_entries; i++) {
+    for (j = 0; j < ARRAY_SIZE (whitelist); j++)
+      if (strcmp(modules.entries[i], whitelist[j]) == 0)
+	break;
+    if (j == ARRAY_SIZE (whitelist))
+      return 0;
+  }
+  return 1;
+}
+
 void
 grub_install_push_module (const char *val)
 {
diff --git a/util/grub-install.c b/util/grub-install.c
index 8970b73aa..6db06c99b 100644
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -1718,10 +1718,14 @@ main (int argc, char *argv[])
 			install_device);
 			
 	/*  Now perform the installation.  */
-	if (install_bootsector)
+	if (install_bootsector) {
+	  int warn_short_mbr_gap = grub_install_is_short_mbrgap_supported();
+
 	  grub_util_bios_setup (platdir, "boot.img", "core.img",
 				install_drive, force,
-				fs_probe, allow_floppy, add_rs_codes);
+				fs_probe, allow_floppy, add_rs_codes,
+				warn_short_mbr_gap);
+	}
 	break;
       }
     case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
@@ -1748,7 +1752,7 @@ main (int argc, char *argv[])
 	  grub_util_sparc_setup (platdir, "boot.img", "core.img",
 				 install_drive, force,
 				 fs_probe, allow_floppy,
-				 0 /* unused */ );
+				 0 /* unused */, 0 /* unused */ );
 	break;
       }
 
diff --git a/util/grub-setup.c b/util/grub-setup.c
index 42b98ad3c..1783224dd 100644
--- a/util/grub-setup.c
+++ b/util/grub-setup.c
@@ -315,7 +315,7 @@ main (int argc, char *argv[])
 		   arguments.core_file ? : DEFAULT_CORE_FILE,
 		   dest_dev, arguments.force,
 		   arguments.fs_probe, arguments.allow_floppy,
-		   arguments.add_rs_codes);
+		   arguments.add_rs_codes, 0);
 
   /* Free resources.  */
   grub_fini_all ();
diff --git a/util/setup.c b/util/setup.c
index 3be88aae1..da5f2c07f 100644
--- a/util/setup.c
+++ b/util/setup.c
@@ -254,7 +254,8 @@ SETUP (const char *dir,
        const char *boot_file, const char *core_file,
        const char *dest, int force,
        int fs_probe, int allow_floppy,
-       int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
+       int add_rs_codes __attribute__ ((unused)), /* unused on sparc64 */
+       int warn_small)
 {
   char *core_path;
   char *boot_img, *core_img, *boot_path;
@@ -530,7 +531,7 @@ SETUP (const char *dir,
 				 GRUB_EMBED_PCBIOS, &sectors);
     else if (ctx.dest_partmap)
       err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
-				     GRUB_EMBED_PCBIOS, &sectors);
+				     GRUB_EMBED_PCBIOS, &sectors, warn_small);
     else
       err = fs->fs_embed (dest_dev, &nsec, maxsec,
 			  GRUB_EMBED_PCBIOS, &sectors);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] Warn if MBR gap is small and user uses advanced modules
  2020-05-29 13:09   ` Vladimir 'phcoder' Serbinenko
@ 2020-05-29 13:10     ` Vladimir 'phcoder' Serbinenko
  0 siblings, 0 replies; 4+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2020-05-29 13:10 UTC (permalink / raw)
  To: Daniel Kiper
  Cc: The development of GRUB 2, Mihai Moldovan,
	Javier Martinez Canillas, Michael Chang, Peter Jones

Signed-off-by: Bladimir Serbinenko <phcoder@gmail.com>

On Fri, May 29, 2020 at 3:09 PM Vladimir 'phcoder' Serbinenko
<phcoder@gmail.com> wrote:
>
> On Tue, May 12, 2020 at 1:48 PM Daniel Kiper <dkiper@net-space.pl> wrote:
> >
> > On Mon, Apr 27, 2020 at 05:51:34PM +0200, Vladimir 'phcoder' Serbinenko wrote:
> > > We don't want to support small MBR gap in pair with anything but
> > > the simplest config of biosdisk+part_msdos+simple filesystem. In this
> > > path "simple filesystems" are all current filesystems except zfs and
> > > btrfs.
> >
> > The patch LGTM. If there are no objections I will take it in a week or so.
> >
> > Additionally, I hope that Vladimir will be able to prepare a doc patch
> > describing the issue and why we introduced these warnings.
> >
> > Daniel
> >
> > > ---
> > >  grub-core/partmap/gpt.c     |  9 ++++++++-
> > >  grub-core/partmap/msdos.c   |  7 ++++++-
> > >  include/grub/partition.h    |  4 +++-
> > >  include/grub/util/install.h |  7 +++++--
> > >  util/grub-install-common.c  | 24 ++++++++++++++++++++++++
> > >  util/grub-install.c         | 10 +++++++---
> > >  util/grub-setup.c           |  2 +-
> > >  util/setup.c                |  5 +++--
> > >  8 files changed, 57 insertions(+), 11 deletions(-)
> > >
> > > diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
> > > index 103f6796f..6b979f7c3 100644
> > > --- a/grub-core/partmap/gpt.c
> > > +++ b/grub-core/partmap/gpt.c
> > > @@ -25,6 +25,9 @@
> > >  #include <grub/msdos_partition.h>
> > >  #include <grub/gpt_partition.h>
> > >  #include <grub/i18n.h>
> > > +#ifdef GRUB_UTIL
> > > +#include <grub/emu/misc.h>
> > > +#endif
> > >
> > >  GRUB_MOD_LICENSE ("GPLv3+");
> > >
> > > @@ -169,7 +172,8 @@ static grub_err_t
> > >  gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
> > >   unsigned int max_nsectors,
> > >   grub_embed_type_t embed_type,
> > > - grub_disk_addr_t **sectors)
> > > + grub_disk_addr_t **sectors,
> > > + int warn_short)
> > >  {
> > >    struct gpt_partition_map_embed_ctx ctx = {
> > >      .start = 0,
> > > @@ -191,6 +195,9 @@ gpt_partition_map_embed (struct grub_disk *disk,
> > > unsigned int *nsectors,
> > >          N_("this GPT partition label contains no BIOS Boot Partition;"
> > >     " embedding won't be possible"));
> > >
> > > +  if (ctx.len < GRUB_MIN_RECOMMENDED_MBRGAP) {
> > > +    grub_util_warn("Your BIOS Boot Partition is under 1 MiB, please
> > > increase its size.");
> > > +  }
> > >    if (ctx.len < *nsectors)
> > >      return grub_error (GRUB_ERR_OUT_OF_RANGE,
> > >          N_("your BIOS Boot Partition is too small;"
> > > diff --git a/grub-core/partmap/msdos.c b/grub-core/partmap/msdos.c
> > > index 7b8e45076..400d7521d 100644
> > > --- a/grub-core/partmap/msdos.c
> > > +++ b/grub-core/partmap/msdos.c
> > > @@ -236,7 +236,8 @@ static grub_err_t
> > >  pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
> > >   unsigned int max_nsectors,
> > >   grub_embed_type_t embed_type,
> > > - grub_disk_addr_t **sectors)
> > > + grub_disk_addr_t **sectors,
> > > + int warn_short)
> > >  {
> > >    grub_disk_addr_t end = ~0ULL;
> > >    struct grub_msdos_partition_mbr mbr;
> > > @@ -390,6 +391,10 @@ pc_partition_map_embed (struct grub_disk *disk,
> > > unsigned int *nsectors,
> > >        return GRUB_ERR_NONE;
> > >      }
> > >
> > > +  if (end < GRUB_MIN_RECOMMENDED_MBRGAP && warn_short) {
> > > +    grub_util_warn("You have a short MBR gap and use advanced config.
> > > Please increase post-MBR gap");
> > > +  }
> > > +
> > >    if (end <= 1)
> > >      return grub_error (GRUB_ERR_FILE_NOT_FOUND,
> > >          N_("this msdos-style partition label has no "
> > > diff --git a/include/grub/partition.h b/include/grub/partition.h
> > > index 7adb7ec6e..adc50d680 100644
> > > --- a/include/grub/partition.h
> > > +++ b/include/grub/partition.h
> > > @@ -52,10 +52,12 @@ struct grub_partition_map
> > >   grub_partition_iterate_hook_t hook, void *hook_data);
> > >  #ifdef GRUB_UTIL
> > >    /* Determine sectors available for embedding.  */
> > > +#define GRUB_MIN_RECOMMENDED_MBRGAP 1900
> > >    grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
> > >          unsigned int max_nsectors,
> > >          grub_embed_type_t embed_type,
> > > -        grub_disk_addr_t **sectors);
> > > +        grub_disk_addr_t **sectors,
> > > +        int warn_short);
> > >  #endif
> > >  };
> > >  typedef struct grub_partition_map *grub_partition_map_t;
> > > diff --git a/include/grub/util/install.h b/include/grub/util/install.h
> > > index 2631b1074..640c71d28 100644
> > > --- a/include/grub/util/install.h
> > > +++ b/include/grub/util/install.h
> > > @@ -193,13 +193,13 @@ grub_util_bios_setup (const char *dir,
> > >         const char *boot_file, const char *core_file,
> > >         const char *dest, int force,
> > >         int fs_probe, int allow_floppy,
> > > -       int add_rs_codes);
> > > +       int add_rs_codes, int warn_short_mbr_gap);
> > >  void
> > >  grub_util_sparc_setup (const char *dir,
> > >          const char *boot_file, const char *core_file,
> > >          const char *dest, int force,
> > >          int fs_probe, int allow_floppy,
> > > -        int add_rs_codes);
> > > +        int add_rs_codes, int warn_short_mbr_gap);
> > >
> > >  char *
> > >  grub_install_get_image_targets_string (void);
> > > @@ -265,4 +265,7 @@ grub_util_get_target_name (const struct
> > > grub_install_image_target_desc *t);
> > >  extern char *grub_install_copy_buffer;
> > >  #define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
> > >
> > > +int
> > > +grub_install_is_short_mbrgap_supported(void);
> > > +
> > >  #endif
> > > diff --git a/util/grub-install-common.c b/util/grub-install-common.c
> > > index ca0ac612a..b3100b54a 100644
> > > --- a/util/grub-install-common.c
> > > +++ b/util/grub-install-common.c
> > > @@ -234,6 +234,30 @@ char *grub_install_source_directory = NULL;
> > >  char *grub_install_locale_directory = NULL;
> > >  char *grub_install_themes_directory = NULL;
> > >
> > > +int
> > > +grub_install_is_short_mbrgap_supported()
> > > +{
> > > +  int i, j;
> > > +  static const char *whitelist[] =
> > > +    {
> > > +     "part_msdos", "biosdisk", "affs", "afs", "bfs", "archelp",
> > > +     "cpio", "cpio_be", "newc", "odc", "ext2", "fat", "exfat",
> > > +     "f2fs", "fshelp", "hfs", "hfsplus", "hfspluscomp",
> > > +     "iso9660", "jfs", "minix", "minix2", "minix3", "minix_be",
> > > +     "minix2_be", "minix2_be", "nilfs2", "ntfs", "ntfscomp",
> > > +     "reiserfs", "romfs", "sfs", "squash4", "tar", "udf",
> > > +     "ufs1", "ufs1_be", "ufs2", "xfs"
> > > +    };
> > > +  for (i = 0; i < modules.n_entries; i++) {
> > > +    for (j = 0; j < ARRAY_SIZE (whitelist); j++)
> > > +      if (strcmp(modules.entries[i], whitelist[j]) == 0)
> > > + break;
> > > +    if (j == ARRAY_SIZE (whitelist))
> > > +      return 0;
> > > +  }
> > > +  return 1;
> > > +}
> > > +
> > >  void
> > >  grub_install_push_module (const char *val)
> > >  {
> > > diff --git a/util/grub-install.c b/util/grub-install.c
> > > index 8970b73aa..6db06c99b 100644
> > > --- a/util/grub-install.c
> > > +++ b/util/grub-install.c
> > > @@ -1718,10 +1718,14 @@ main (int argc, char *argv[])
> > >   install_device);
> > >
> > >   /*  Now perform the installation.  */
> > > - if (install_bootsector)
> > > + if (install_bootsector) {
> > > +   int warn_short_mbr_gap = grub_install_is_short_mbrgap_supported();
> > > +
> > >     grub_util_bios_setup (platdir, "boot.img", "core.img",
> > >   install_drive, force,
> > > - fs_probe, allow_floppy, add_rs_codes);
> > > + fs_probe, allow_floppy, add_rs_codes,
> > > + warn_short_mbr_gap);
> > > + }
> > >   break;
> > >        }
> > >      case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
> > > @@ -1748,7 +1752,7 @@ main (int argc, char *argv[])
> > >     grub_util_sparc_setup (platdir, "boot.img", "core.img",
> > >   install_drive, force,
> > >   fs_probe, allow_floppy,
> > > - 0 /* unused */ );
> > > + 0 /* unused */, 0 /* unused */ );
> > >   break;
> > >        }
> > >
> > > diff --git a/util/grub-setup.c b/util/grub-setup.c
> > > index 42b98ad3c..1783224dd 100644
> > > --- a/util/grub-setup.c
> > > +++ b/util/grub-setup.c
> > > @@ -315,7 +315,7 @@ main (int argc, char *argv[])
> > >      arguments.core_file ? : DEFAULT_CORE_FILE,
> > >      dest_dev, arguments.force,
> > >      arguments.fs_probe, arguments.allow_floppy,
> > > -    arguments.add_rs_codes);
> > > +    arguments.add_rs_codes, 0);
> > >
> > >    /* Free resources.  */
> > >    grub_fini_all ();
> > > diff --git a/util/setup.c b/util/setup.c
> > > index 3be88aae1..da5f2c07f 100644
> > > --- a/util/setup.c
> > > +++ b/util/setup.c
> > > @@ -254,7 +254,8 @@ SETUP (const char *dir,
> > >         const char *boot_file, const char *core_file,
> > >         const char *dest, int force,
> > >         int fs_probe, int allow_floppy,
> > > -       int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
> > > +       int add_rs_codes __attribute__ ((unused)), /* unused on sparc64 */
> > > +       int warn_small)
> > >  {
> > >    char *core_path;
> > >    char *boot_img, *core_img, *boot_path;
> > > @@ -530,7 +531,7 @@ SETUP (const char *dir,
> > >   GRUB_EMBED_PCBIOS, &sectors);
> > >      else if (ctx.dest_partmap)
> > >        err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
> > > -      GRUB_EMBED_PCBIOS, &sectors);
> > > +      GRUB_EMBED_PCBIOS, &sectors, warn_small);
> > >      else
> > >        err = fs->fs_embed (dest_dev, &nsec, maxsec,
> > >     GRUB_EMBED_PCBIOS, &sectors);
> > > --
> > > 2.20.1
> > >
> > >
> > > --
> > > Regards
> > > Vladimir 'phcoder' Serbinenko
> > >
> > > _______________________________________________
> > > Grub-devel mailing list
> > > Grub-devel@gnu.org
> > > https://lists.gnu.org/mailman/listinfo/grub-devel
>
>
>
> --
> Regards
> Vladimir 'phcoder' Serbinenko



-- 
Regards
Vladimir 'phcoder' Serbinenko


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-05-29 13:11 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-27 15:51 [PATCH v2] Warn if MBR gap is small and user uses advanced modules Vladimir 'phcoder' Serbinenko
2020-05-12 11:48 ` Daniel Kiper
2020-05-29 13:09   ` Vladimir 'phcoder' Serbinenko
2020-05-29 13:10     ` Vladimir 'phcoder' Serbinenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.