5d1d201c64
- Disable btrfs zstd support for i386-pc to workaround core.img too large to be embedded in btrfs bootloader area or MBR gap (boo#1154809) * 0001-btrfs-disable-zstd-support-for-i386-pc.patch OBS-URL: https://build.opensuse.org/request/show/743951 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=343
136 lines
4.4 KiB
Diff
136 lines
4.4 KiB
Diff
From adf02937d4859495aab539818a116efa23505eaa Mon Sep 17 00:00:00 2001
|
|
From: Michael Chang <mchang@suse.com>
|
|
Date: Mon, 28 Oct 2019 05:48:11 -0400
|
|
Subject: [PATCH] btrfs: disable zstd support for i386-pc
|
|
|
|
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.
|
|
---
|
|
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 eed7099d8..21a7641c0 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>
|
|
@@ -60,8 +64,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];
|
|
@@ -244,7 +250,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
|
|
|
|
@@ -1372,6 +1380,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);
|
|
@@ -1461,6 +1470,7 @@ err:
|
|
|
|
return ret;
|
|
}
|
|
+#endif
|
|
|
|
static grub_ssize_t
|
|
grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
|
|
@@ -1637,8 +1647,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",
|
|
@@ -1678,6 +1692,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 -
|
|
@@ -1687,6 +1702,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;
|
|
@@ -1724,10 +1740,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.21.0
|
|
|