]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
ZFS zlib compression support
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 3 Dec 2010 23:40:44 +0000 (00:40 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 3 Dec 2010 23:40:44 +0000 (00:40 +0100)
grub-core/fs/zfs/zfs.c
include/grub/zfs/zio.h

index 8901af76fe0bf690c1d4799b672ab0022b4cb182..d7bf2bc3092c00501d062d72239e0b5510431e62 100644 (file)
@@ -51,6 +51,7 @@
 #include <grub/zfs/sa_impl.h>
 #include <grub/zfs/dsl_dir.h>
 #include <grub/zfs/dsl_dataset.h>
+#include <grub/deflate.h>
 
 #define        ZPOOL_PROP_BOOTFS               "bootfs"
 
@@ -161,13 +162,30 @@ struct grub_zfs_data
   grub_disk_addr_t vdev_phys_sector;
 };
 
+static grub_err_t 
+zlib_decompress (void *s, void *d,
+                grub_size_t slen, grub_size_t dlen)
+{
+  if (grub_zlib_decompress (s, slen, 0, d, dlen) < 0)
+    return grub_errno;
+  return GRUB_ERR_NONE;
+}
+
 decomp_entry_t decomp_table[ZIO_COMPRESS_FUNCTIONS] = {
   {"inherit", NULL},           /* ZIO_COMPRESS_INHERIT */
   {"on", lzjb_decompress},     /* ZIO_COMPRESS_ON */
   {"off", NULL},               /* ZIO_COMPRESS_OFF */
   {"lzjb", lzjb_decompress},   /* ZIO_COMPRESS_LZJB */
   {"empty", NULL},             /* ZIO_COMPRESS_EMPTY */
-  {"gzip", NULL},              /* ZIO_COMPRESS_GZIP */
+  {"gzip-1", zlib_decompress},  /* ZIO_COMPRESS_GZIP1 */
+  {"gzip-2", zlib_decompress},  /* ZIO_COMPRESS_GZIP2 */
+  {"gzip-3", zlib_decompress},  /* ZIO_COMPRESS_GZIP3 */
+  {"gzip-4", zlib_decompress},  /* ZIO_COMPRESS_GZIP4 */
+  {"gzip-5", zlib_decompress},  /* ZIO_COMPRESS_GZIP5 */
+  {"gzip-6", zlib_decompress},  /* ZIO_COMPRESS_GZIP6 */
+  {"gzip-7", zlib_decompress},  /* ZIO_COMPRESS_GZIP7 */
+  {"gzip-8", zlib_decompress},  /* ZIO_COMPRESS_GZIP8 */
+  {"gzip-9", zlib_decompress},  /* ZIO_COMPRESS_GZIP9 */
 };
 
 static grub_err_t zio_read_data (blkptr_t * bp, grub_zfs_endian_t endian,
@@ -525,7 +543,7 @@ zio_read (blkptr_t * bp, grub_zfs_endian_t endian, void **buf,
   *buf = NULL;
 
   checksum = (grub_zfs_to_cpu64((bp)->blk_prop, endian) >> 40) & 0xff;
-  comp = (grub_zfs_to_cpu64((bp)->blk_prop, endian)>>32) & 0x7;
+  comp = (grub_zfs_to_cpu64((bp)->blk_prop, endian)>>32) & 0xff;
   lsize = (BP_IS_HOLE(bp) ? 0 :
           (((grub_zfs_to_cpu64 ((bp)->blk_prop, endian) & 0xffff) + 1)
            << SPA_MINBLOCKSHIFT));
index 797d4f9b3a8584a14a9e662e44e7c1dc5fc5dda6..3dafb402800577e6020c8bf08fb348bc1b0afa33 100644 (file)
@@ -77,7 +77,15 @@ enum zio_compress {
        ZIO_COMPRESS_OFF,
        ZIO_COMPRESS_LZJB,
        ZIO_COMPRESS_EMPTY,
-       ZIO_COMPRESS_GZIP,
+       ZIO_COMPRESS_GZIP1,
+       ZIO_COMPRESS_GZIP2,
+       ZIO_COMPRESS_GZIP3,
+       ZIO_COMPRESS_GZIP4,
+       ZIO_COMPRESS_GZIP5,
+       ZIO_COMPRESS_GZIP6,
+       ZIO_COMPRESS_GZIP7,
+       ZIO_COMPRESS_GZIP8,
+       ZIO_COMPRESS_GZIP9,
        ZIO_COMPRESS_FUNCTIONS
 };