Please don't do it this way. The right solution is to move it to separate module and include zstd module when needed. Not everybody uses btrfs embedded area. I recommend not to use it. Using mbr gap or BBP is the recommended way.
On Tue, 5 Nov 2019, 01:25 Michael Chang, <mch...@suse.com> wrote: > The zstd support in btrfs has dependenciy to zstd module and core.img > grows its size significantly to 75KB on my system. The resulted image > cannot be installed into btrfs bootloader area in the size of 64KB and > eventually fails with following message. > > /usr/sbin/grub-install: warning: your core.img is unusually large. It > won't fit in the embedding area. > /usr/sbin/grub-install: error: filesystem `btrfs' doesn't support > blocklists. > > The patch disabled the zstd support of btrfs in pc-bios platform to > avoid the regression. The resulting size is 56KB, albeit a bit too close > to the 64KB but works. This is simple workaround until a proper fix > landed upstream. > > Signed-off-by: Michael Chang <mch...@suse.com> > --- > grub-core/fs/btrfs.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c > index 48bd3d04a..8f98892d3 100644 > --- a/grub-core/fs/btrfs.c > +++ b/grub-core/fs/btrfs.c > @@ -17,6 +17,7 @@ > * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > */ > > +#ifndef GRUB_MACHINE_PCBIOS > /* > * Tell zstd to expose functions that aren't part of the stable API, which > * aren't safe to use when linking against a dynamic library. We vendor > in a > @@ -24,6 +25,7 @@ > * functions to provide our own allocator, which uses grub_malloc(), to > zstd. > */ > #define ZSTD_STATIC_LINKING_ONLY > +#endif > > #include <grub/err.h> > #include <grub/file.h> > @@ -35,7 +37,9 @@ > #include <grub/lib/crc.h> > #include <grub/deflate.h> > #include <minilzo.h> > +#ifndef GRUB_MACHINE_PCBIOS > #include <zstd.h> > +#endif > #include <grub/i18n.h> > #include <grub/btrfs.h> > #include <grub/crypto.h> > @@ -56,8 +60,10 @@ GRUB_MOD_LICENSE ("GPLv3+"); > #define GRUB_BTRFS_LZO_BLOCK_MAX_CSIZE (GRUB_BTRFS_LZO_BLOCK_SIZE + \ > (GRUB_BTRFS_LZO_BLOCK_SIZE / 16) + 64 > + 3) > > +#ifndef GRUB_MACHINE_PCBIOS > #define ZSTD_BTRFS_MAX_WINDOWLOG 17 > #define ZSTD_BTRFS_MAX_INPUT (1 << ZSTD_BTRFS_MAX_WINDOWLOG) > +#endif > > typedef grub_uint8_t grub_btrfs_checksum_t[0x20]; > typedef grub_uint16_t grub_btrfs_uuid_t[8]; > @@ -229,7 +235,9 @@ struct grub_btrfs_extent_data > #define GRUB_BTRFS_COMPRESSION_NONE 0 > #define GRUB_BTRFS_COMPRESSION_ZLIB 1 > #define GRUB_BTRFS_COMPRESSION_LZO 2 > +#ifndef GRUB_MACHINE_PCBIOS > #define GRUB_BTRFS_COMPRESSION_ZSTD 3 > +#endif > > #define GRUB_BTRFS_OBJECT_ID_CHUNK 0x100 > > @@ -1229,6 +1237,7 @@ grub_btrfs_read_inode (struct grub_btrfs_data *data, > return grub_btrfs_read_logical (data, elemaddr, inode, sizeof (*inode), > 0); > } > > +#ifndef GRUB_MACHINE_PCBIOS > static void *grub_zstd_malloc (void *state __attribute__((unused)), > size_t size) > { > return grub_malloc (size); > @@ -1318,6 +1327,7 @@ err: > > return ret; > } > +#endif > > static grub_ssize_t > grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off, > @@ -1494,8 +1504,12 @@ grub_btrfs_extent_read (struct grub_btrfs_data > *data, > > if (data->extent->compression != GRUB_BTRFS_COMPRESSION_NONE > && data->extent->compression != GRUB_BTRFS_COMPRESSION_ZLIB > +#ifndef GRUB_MACHINE_PCBIOS > && data->extent->compression != GRUB_BTRFS_COMPRESSION_LZO > && data->extent->compression != GRUB_BTRFS_COMPRESSION_ZSTD) > +#else > + && data->extent->compression != GRUB_BTRFS_COMPRESSION_LZO) > +#endif > { > grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, > "compression type 0x%x not supported", > @@ -1535,6 +1549,7 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data, > != (grub_ssize_t) csize) > return -1; > } > +#ifndef GRUB_MACHINE_PCBIOS > else if (data->extent->compression == > GRUB_BTRFS_COMPRESSION_ZSTD) > { > if (grub_btrfs_zstd_decompress (data->extent->inl, > data->extsize - > @@ -1544,6 +1559,7 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data, > != (grub_ssize_t) csize) > return -1; > } > +#endif > else > grub_memcpy (buf, data->extent->inl + extoff, csize); > break; > @@ -1581,10 +1597,12 @@ grub_btrfs_extent_read (struct grub_btrfs_data > *data, > ret = grub_btrfs_lzo_decompress (tmp, zsize, extoff > + grub_le_to_cpu64 > (data->extent->offset), > buf, csize); > +#ifndef GRUB_MACHINE_PCBIOS > else if (data->extent->compression == > GRUB_BTRFS_COMPRESSION_ZSTD) > ret = grub_btrfs_zstd_decompress (tmp, zsize, extoff > + grub_le_to_cpu64 > (data->extent->offset), > buf, csize); > +#endif > else > ret = -1; > > -- > 2.16.4 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel