Dear Michael, Thank you for your patch. On 2019-11-05 10:19, Michael Chang wrote: > The zstd support in btrfs has dependenciy to zstd module and core.img dependency > 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 disables (present tense) Maybe: So, disable the zstd support of btrfs for the 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 is *a* simple > landed upstream. lands Is there a feature request/bug report for this? Maybe reference it heare? > Signed-off-by: Michael Chang > --- > 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 . > */ > > +#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 > #include > @@ -35,7 +37,9 @@ > #include > #include > #include > +#ifndef GRUB_MACHINE_PCBIOS > #include > +#endif > #include > #include > #include > @@ -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 Why not just guard the ZSTD line by switching the order of LZO and ZSTD for the closing bracket? > { > 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; Does some documentation need to be updated? Kind regards, Paul