commit: 6385625e34276cf4a32a6373b97c2178324f64d8 Author: Mike Gilbert <floppym <AT> gentoo <DOT> org> AuthorDate: Thu May 22 18:08:08 2025 +0000 Commit: Mike Gilbert <floppym <AT> gentoo <DOT> org> CommitDate: Thu May 22 18:08:08 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=6385625e
sys-boot/grub: backport ZSH zstd support Closes: https://bugs.gentoo.org/956414 Signed-off-by: Mike Gilbert <floppym <AT> gentoo.org> .../grub-2.12-zfs-zstd-compression-support.patch | 101 +++++++++++++++++++++ .../{grub-2.12-r6.ebuild => grub-2.12-r7.ebuild} | 1 + 2 files changed, 102 insertions(+) diff --git a/sys-boot/grub/files/grub-2.12-zfs-zstd-compression-support.patch b/sys-boot/grub/files/grub-2.12-zfs-zstd-compression-support.patch new file mode 100644 index 000000000000..63862e7ab8f6 --- /dev/null +++ b/sys-boot/grub/files/grub-2.12-zfs-zstd-compression-support.patch @@ -0,0 +1,101 @@ +Patch fixes ZFS root filesystem dataset identification issues. + +This patch was mostly extracted from gub upstream commit f96df6fe9f6faa328c82820af88f14af07b2c9b9. +See Gentoo Bugzilla https://bugs.gentoo.org/956414 for further details. + +diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def +index 7fa9446bd..705d73fab 100644 +--- a/grub-core/Makefile.core.def ++++ b/grub-core/Makefile.core.def +@@ -1601,6 +1601,7 @@ module = { + common = fs/zfs/zfs_lz4.c; + common = fs/zfs/zfs_sha256.c; + common = fs/zfs/zfs_fletcher.c; ++ cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/zstd'; + }; + + module = { +diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c +index b5453e006..3fdf9bda8 100644 +--- a/grub-core/fs/zfs/zfs.c ++++ b/grub-core/fs/zfs/zfs.c +@@ -57,6 +57,8 @@ + #include <grub/i18n.h> + #include <grub/safemath.h> + ++#include <zstd.h> ++ + GRUB_MOD_LICENSE ("GPLv3+"); + + #define ZPOOL_PROP_BOOTFS "bootfs" +@@ -291,6 +293,9 @@ static const char *spa_feature_names[] = { + "com.delphix:embedded_data", + "com.delphix:extensible_dataset", + "org.open-zfs:large_blocks", ++ "com.klarasystems:vdev_zaps_v2", ++ "com.delphix:head_errlog", ++ "org.freebsd:zstd_compress", + NULL + }; + +@@ -312,6 +317,40 @@ zlib_decompress (void *s, void *d, + return grub_errno; + } + ++static grub_err_t ++zstd_decompress (void *ibuf, void *obuf, grub_size_t isize, ++ grub_size_t osize) ++{ ++ grub_size_t zstd_ret; ++ grub_uint32_t c_len; ++ grub_uint8_t *byte_buf = (grub_uint8_t *) ibuf; ++ ++ if (isize < 8) ++ return grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, "zstd data too short"); ++ ++ c_len = grub_be_to_cpu32 (grub_get_unaligned32 (byte_buf)); ++ ++ if (c_len > isize - 8) ++ return grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, ++ "zstd data announced size overflow"); ++ ++ /* ++ * ZFS uses non-stadard magic for zstd streams. Rather than adjusting ++ * library functions, replace non-standard magic with standard one. ++ */ ++ byte_buf[4] = 0x28; ++ byte_buf[5] = 0xb5; ++ byte_buf[6] = 0x2f; ++ byte_buf[7] = 0xfd; ++ zstd_ret = ZSTD_decompress (obuf, osize, byte_buf + 4, c_len + 4); ++ ++ if (ZSTD_isError (zstd_ret)) ++ return grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, ++ "zstd data corrupted (error %d)", (int) zstd_ret); ++ ++ return GRUB_ERR_NONE; ++} ++ + static grub_err_t + zle_decompress (void *s, void *d, + grub_size_t slen, grub_size_t dlen) +@@ -362,6 +401,7 @@ static decomp_entry_t decomp_table[ZIO_COMPRESS_FUNCTIONS] = { + {"gzip-9", zlib_decompress}, /* ZIO_COMPRESS_GZIP9 */ + {"zle", zle_decompress}, /* ZIO_COMPRESS_ZLE */ + {"lz4", lz4_decompress}, /* ZIO_COMPRESS_LZ4 */ ++ {"zstd", zstd_decompress}, /* ZIO_COMPRESS_ZSTD */ + }; + + static grub_err_t zio_read_data (blkptr_t * bp, grub_zfs_endian_t endian, +diff --git a/include/grub/zfs/zio.h b/include/grub/zfs/zio.h +index 19ce136bb..997b0c4d4 100644 +--- a/include/grub/zfs/zio.h ++++ b/include/grub/zfs/zio.h +@@ -89,6 +89,7 @@ enum zio_compress { + ZIO_COMPRESS_GZIP9, + ZIO_COMPRESS_ZLE, + ZIO_COMPRESS_LZ4, ++ ZIO_COMPRESS_ZSTD, + ZIO_COMPRESS_FUNCTIONS + }; + diff --git a/sys-boot/grub/grub-2.12-r6.ebuild b/sys-boot/grub/grub-2.12-r7.ebuild similarity index 99% rename from sys-boot/grub/grub-2.12-r6.ebuild rename to sys-boot/grub/grub-2.12-r7.ebuild index 8931d754a9a2..70f69b0043af 100644 --- a/sys-boot/grub/grub-2.12-r6.ebuild +++ b/sys-boot/grub/grub-2.12-r7.ebuild @@ -64,6 +64,7 @@ PATCHES=( "${FILESDIR}"/grub-2.06-test-words.patch "${FILESDIR}"/grub-2.12-fwsetup.patch "${WORKDIR}"/grub-2.12-bash-completion.patch + "${FILESDIR}"/grub-2.12-zfs-zstd-compression-support.patch ) DEJAVU=dejavu-sans-ttf-2.37
