[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2] Warn if MBR gap is small and user uses advanced modules
From: |
Vladimir 'phcoder' Serbinenko |
Subject: |
Re: [PATCH v2] Warn if MBR gap is small and user uses advanced modules |
Date: |
Fri, 29 May 2020 15:10:51 +0200 |
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, §ors);
> > > else if (ctx.dest_partmap)
> > > err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
> > > - GRUB_EMBED_PCBIOS, §ors);
> > > + GRUB_EMBED_PCBIOS, §ors, warn_small);
> > > else
> > > err = fs->fs_embed (dest_dev, &nsec, maxsec,
> > > GRUB_EMBED_PCBIOS, §ors);
> > > --
> > > 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