1fa9e4066Sahrens /*
2fa9e4066Sahrens  * CDDL HEADER START
3fa9e4066Sahrens  *
4fa9e4066Sahrens  * The contents of this file are subject to the terms of the
5c9431fa1Sahl  * Common Development and Distribution License (the "License").
6c9431fa1Sahl  * You may not use this file except in compliance with the License.
7fa9e4066Sahrens  *
8fa9e4066Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fa9e4066Sahrens  * or http://www.opensolaris.org/os/licensing.
10fa9e4066Sahrens  * See the License for the specific language governing permissions
11fa9e4066Sahrens  * and limitations under the License.
12fa9e4066Sahrens  *
13fa9e4066Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
14fa9e4066Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fa9e4066Sahrens  * If applicable, add the following below this CDDL HEADER, with the
16fa9e4066Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
17fa9e4066Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
18fa9e4066Sahrens  *
19fa9e4066Sahrens  * CDDL HEADER END
20fa9e4066Sahrens  */
21c9431fa1Sahl 
22fa9e4066Sahrens /*
23b24ab676SJeff Bonwick  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24fa9e4066Sahrens  * Use is subject to license terms.
25fa9e4066Sahrens  */
26a6f561b4SSašo Kiselkov /*
27a6f561b4SSašo Kiselkov  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
28*770499e1SDan Kimmel  * Copyright (c) 2015, 2016 by Delphix. All rights reserved.
29a6f561b4SSašo Kiselkov  */
30fa9e4066Sahrens 
31fa9e4066Sahrens #ifndef _SYS_ZIO_COMPRESS_H
32fa9e4066Sahrens #define	_SYS_ZIO_COMPRESS_H
33fa9e4066Sahrens 
34*770499e1SDan Kimmel #include <sys/abd.h>
35*770499e1SDan Kimmel 
36fa9e4066Sahrens #ifdef	__cplusplus
37fa9e4066Sahrens extern "C" {
38fa9e4066Sahrens #endif
39fa9e4066Sahrens 
405602294fSDan Kimmel enum zio_compress {
415602294fSDan Kimmel 	ZIO_COMPRESS_INHERIT = 0,
425602294fSDan Kimmel 	ZIO_COMPRESS_ON,
435602294fSDan Kimmel 	ZIO_COMPRESS_OFF,
445602294fSDan Kimmel 	ZIO_COMPRESS_LZJB,
455602294fSDan Kimmel 	ZIO_COMPRESS_EMPTY,
465602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_1,
475602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_2,
485602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_3,
495602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_4,
505602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_5,
515602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_6,
525602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_7,
535602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_8,
545602294fSDan Kimmel 	ZIO_COMPRESS_GZIP_9,
555602294fSDan Kimmel 	ZIO_COMPRESS_ZLE,
565602294fSDan Kimmel 	ZIO_COMPRESS_LZ4,
575602294fSDan Kimmel 	ZIO_COMPRESS_FUNCTIONS
585602294fSDan Kimmel };
595602294fSDan Kimmel 
60f7170741SWill Andrews /* Common signature for all zio compress functions. */
61fa9e4066Sahrens typedef size_t zio_compress_func_t(void *src, void *dst,
62c9431fa1Sahl     size_t s_len, size_t d_len, int);
63f7170741SWill Andrews /* Common signature for all zio decompress functions. */
64fa9e4066Sahrens typedef int zio_decompress_func_t(void *src, void *dst,
65c9431fa1Sahl     size_t s_len, size_t d_len, int);
66*770499e1SDan Kimmel /*
67*770499e1SDan Kimmel  * Common signature for all zio decompress functions using an ABD as input.
68*770499e1SDan Kimmel  * This is helpful if you have both compressed ARC and scatter ABDs enabled,
69*770499e1SDan Kimmel  * but is not a requirement for all compression algorithms.
70*770499e1SDan Kimmel  */
71*770499e1SDan Kimmel typedef int zio_decompress_abd_func_t(abd_t *src, void *dst,
72*770499e1SDan Kimmel     size_t s_len, size_t d_len, int);
73fa9e4066Sahrens 
74fa9e4066Sahrens /*
75fa9e4066Sahrens  * Information about each compression function.
76fa9e4066Sahrens  */
77fa9e4066Sahrens typedef struct zio_compress_info {
78*770499e1SDan Kimmel 	char				*ci_name;
79*770499e1SDan Kimmel 	int				ci_level;
80*770499e1SDan Kimmel 	zio_compress_func_t		*ci_compress;
81*770499e1SDan Kimmel 	zio_decompress_func_t		*ci_decompress;
82fa9e4066Sahrens } zio_compress_info_t;
83fa9e4066Sahrens 
84fa9e4066Sahrens extern zio_compress_info_t zio_compress_table[ZIO_COMPRESS_FUNCTIONS];
85fa9e4066Sahrens 
86fa9e4066Sahrens /*
87fa9e4066Sahrens  * Compression routines.
88fa9e4066Sahrens  */
89c9431fa1Sahl extern size_t lzjb_compress(void *src, void *dst, size_t s_len, size_t d_len,
90c9431fa1Sahl     int level);
91c9431fa1Sahl extern int lzjb_decompress(void *src, void *dst, size_t s_len, size_t d_len,
92c9431fa1Sahl     int level);
93c9431fa1Sahl extern size_t gzip_compress(void *src, void *dst, size_t s_len, size_t d_len,
94c9431fa1Sahl     int level);
95c9431fa1Sahl extern int gzip_decompress(void *src, void *dst, size_t s_len, size_t d_len,
96c9431fa1Sahl     int level);
97b24ab676SJeff Bonwick extern size_t zle_compress(void *src, void *dst, size_t s_len, size_t d_len,
98b24ab676SJeff Bonwick     int level);
99b24ab676SJeff Bonwick extern int zle_decompress(void *src, void *dst, size_t s_len, size_t d_len,
100b24ab676SJeff Bonwick     int level);
101a6f561b4SSašo Kiselkov extern size_t lz4_compress(void *src, void *dst, size_t s_len, size_t d_len,
102a6f561b4SSašo Kiselkov     int level);
103a6f561b4SSašo Kiselkov extern int lz4_decompress(void *src, void *dst, size_t s_len, size_t d_len,
104a6f561b4SSašo Kiselkov     int level);
105fa9e4066Sahrens 
106fa9e4066Sahrens /*
107fa9e4066Sahrens  * Compress and decompress data if necessary.
108fa9e4066Sahrens  */
109*770499e1SDan Kimmel extern size_t zio_compress_data(enum zio_compress c, abd_t *src, void *dst,
110b24ab676SJeff Bonwick     size_t s_len);
111*770499e1SDan Kimmel extern int zio_decompress_data(enum zio_compress c, abd_t *src, void *dst,
112*770499e1SDan Kimmel     size_t s_len, size_t d_len);
113*770499e1SDan Kimmel extern int zio_decompress_data_buf(enum zio_compress c, void *src, void *dst,
114b24ab676SJeff Bonwick     size_t s_len, size_t d_len);
115fa9e4066Sahrens 
116fa9e4066Sahrens #ifdef	__cplusplus
117fa9e4066Sahrens }
118fa9e4066Sahrens #endif
119fa9e4066Sahrens 
120fa9e4066Sahrens #endif	/* _SYS_ZIO_COMPRESS_H */
121