]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Support zle compression on ZFS.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 5 Nov 2011 13:50:53 +0000 (14:50 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 5 Nov 2011 13:50:53 +0000 (14:50 +0100)
* grub-core/fs/zfs/zfs.c (zle_decompress): New function.
(decomp_table): Add zle.
* include/grub/zfs/zio.h (zio_compress): Add zle.

ChangeLog
grub-core/fs/zfs/zfs.c
include/grub/zfs/zio.h

index 8c125fa97d04eaf247ebdccd0659b2ed242efe20..9e9f315f457e94839f5089778af8cadfc3a2d7d4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-11-05  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Support zle compression on ZFS.
+
+       * grub-core/fs/zfs/zfs.c (zle_decompress): New function.
+       (decomp_table): Add zle.
+       * include/grub/zfs/zio.h (zio_compress): Add zle.
+
 2011-11-05  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Support BtrFS embedding.
index f892290a1c98867f4e1c4a0c4d1360aacabd6fd2..9658dea0d06044aff90ce07c8b8e10648d8f0737 100644 (file)
@@ -199,6 +199,39 @@ zlib_decompress (void *s, void *d,
   return GRUB_ERR_NONE;
 }
 
+static grub_err_t 
+zle_decompress (void *s, void *d,
+               grub_size_t slen, grub_size_t dlen)
+{
+  grub_uint8_t *iptr, *optr;
+  grub_size_t clen;
+  for (iptr = s, optr = d; iptr < (grub_uint8_t *) s + slen
+        && optr < (grub_uint8_t *) d + dlen;)
+    {
+      if (*iptr & 0x80)
+       clen = ((*iptr) & 0x7f) + 0x41;
+      else
+       clen = ((*iptr) & 0x3f) + 1;
+      if ((grub_ssize_t) clen > (grub_uint8_t *) d + dlen - optr)
+       clen = (grub_uint8_t *) d + dlen - optr;
+      if (*iptr & 0x40 || *iptr & 0x80)
+       {
+         grub_memset (optr, 0, clen);
+         iptr++;
+         optr += clen;
+         continue;
+       }
+      if ((grub_ssize_t) clen > (grub_uint8_t *) s + slen - iptr - 1)
+       clen = (grub_uint8_t *) s + slen - iptr - 1;
+      grub_memcpy (optr, iptr + 1, clen);
+      optr += clen;
+      iptr += clen + 1;
+    }
+  if (optr < (grub_uint8_t *) d + dlen)
+    grub_memset (optr, 0, (grub_uint8_t *) d + dlen - optr);
+  return GRUB_ERR_NONE;
+}
+
 static decomp_entry_t decomp_table[ZIO_COMPRESS_FUNCTIONS] = {
   {"inherit", NULL},           /* ZIO_COMPRESS_INHERIT */
   {"on", lzjb_decompress},     /* ZIO_COMPRESS_ON */
@@ -214,6 +247,7 @@ static decomp_entry_t decomp_table[ZIO_COMPRESS_FUNCTIONS] = {
   {"gzip-7", zlib_decompress},  /* ZIO_COMPRESS_GZIP7 */
   {"gzip-8", zlib_decompress},  /* ZIO_COMPRESS_GZIP8 */
   {"gzip-9", zlib_decompress},  /* ZIO_COMPRESS_GZIP9 */
+  {"zle", zle_decompress},      /* ZIO_COMPRESS_ZLE   */
 };
 
 static grub_err_t zio_read_data (blkptr_t * bp, grub_zfs_endian_t endian,
index 3dafb402800577e6020c8bf08fb348bc1b0afa33..29451593f1f68504fd64f2cd87ed4225e61791e9 100644 (file)
@@ -86,6 +86,7 @@ enum zio_compress {
        ZIO_COMPRESS_GZIP7,
        ZIO_COMPRESS_GZIP8,
        ZIO_COMPRESS_GZIP9,
+       ZIO_COMPRESS_ZLE,
        ZIO_COMPRESS_FUNCTIONS
 };