compress: add "slack" compression options
Signed-off-by: Allan Jude <allan@klarasystems.com>
This commit is contained in:
parent
066532da51
commit
802c258fc1
|
@ -54,6 +54,7 @@ enum zio_compress {
|
||||||
ZIO_COMPRESS_ZLE,
|
ZIO_COMPRESS_ZLE,
|
||||||
ZIO_COMPRESS_LZ4,
|
ZIO_COMPRESS_LZ4,
|
||||||
ZIO_COMPRESS_ZSTD,
|
ZIO_COMPRESS_ZSTD,
|
||||||
|
ZIO_COMPRESS_SLACK,
|
||||||
ZIO_COMPRESS_FUNCTIONS
|
ZIO_COMPRESS_FUNCTIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -179,6 +180,8 @@ extern size_t lz4_compress_zfs(void *src, void *dst, size_t s_len, size_t d_len,
|
||||||
int level);
|
int level);
|
||||||
extern int lz4_decompress_zfs(void *src, void *dst, size_t s_len, size_t d_len,
|
extern int lz4_decompress_zfs(void *src, void *dst, size_t s_len, size_t d_len,
|
||||||
int level);
|
int level);
|
||||||
|
extern size_t slack_compress(void *src, void *dst, size_t s_len, size_t d_len,
|
||||||
|
int level);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compress and decompress data if necessary.
|
* Compress and decompress data if necessary.
|
||||||
|
|
|
@ -75,6 +75,7 @@ typedef enum spa_feature {
|
||||||
SPA_FEATURE_DEVICE_REBUILD,
|
SPA_FEATURE_DEVICE_REBUILD,
|
||||||
SPA_FEATURE_ZSTD_COMPRESS,
|
SPA_FEATURE_ZSTD_COMPRESS,
|
||||||
SPA_FEATURE_DRAID,
|
SPA_FEATURE_DRAID,
|
||||||
|
SPA_FEATURE_SLACK_COMPRESS,
|
||||||
SPA_FEATURES
|
SPA_FEATURES
|
||||||
} spa_feature_t;
|
} spa_feature_t;
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,7 @@ KERNEL_C = \
|
||||||
sa.c \
|
sa.c \
|
||||||
sha256.c \
|
sha256.c \
|
||||||
skein_zfs.c \
|
skein_zfs.c \
|
||||||
|
slack.c \
|
||||||
spa.c \
|
spa.c \
|
||||||
spa_boot.c \
|
spa_boot.c \
|
||||||
spa_checkpoint.c \
|
spa_checkpoint.c \
|
||||||
|
|
|
@ -234,6 +234,7 @@ SRCS+= abd.c \
|
||||||
sa.c \
|
sa.c \
|
||||||
sha256.c \
|
sha256.c \
|
||||||
skein_zfs.c \
|
skein_zfs.c \
|
||||||
|
slack.c \
|
||||||
spa.c \
|
spa.c \
|
||||||
spa_boot.c \
|
spa_boot.c \
|
||||||
spa_checkpoint.c \
|
spa_checkpoint.c \
|
||||||
|
|
|
@ -598,6 +598,17 @@ zpool_feature_init(void)
|
||||||
zfeature_register(SPA_FEATURE_DRAID,
|
zfeature_register(SPA_FEATURE_DRAID,
|
||||||
"org.openzfs:draid", "draid", "Support for distributed spare RAID",
|
"org.openzfs:draid", "draid", "Support for distributed spare RAID",
|
||||||
ZFEATURE_FLAG_MOS, ZFEATURE_TYPE_BOOLEAN, NULL);
|
ZFEATURE_FLAG_MOS, ZFEATURE_TYPE_BOOLEAN, NULL);
|
||||||
|
|
||||||
|
{
|
||||||
|
static const spa_feature_t slack_deps[] = {
|
||||||
|
SPA_FEATURE_EXTENSIBLE_DATASET,
|
||||||
|
SPA_FEATURE_NONE
|
||||||
|
};
|
||||||
|
zfeature_register(SPA_FEATURE_SLACK_COMPRESS,
|
||||||
|
"com.klarasystems:slack_compress", "slack_compress",
|
||||||
|
"slack compression support",
|
||||||
|
ZFEATURE_FLAG_PER_DATASET, ZFEATURE_TYPE_BOOLEAN, slack_deps);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
|
|
|
@ -127,6 +127,7 @@ zfs_prop_init(void)
|
||||||
{ "gzip-9", ZIO_COMPRESS_GZIP_9 },
|
{ "gzip-9", ZIO_COMPRESS_GZIP_9 },
|
||||||
{ "zle", ZIO_COMPRESS_ZLE },
|
{ "zle", ZIO_COMPRESS_ZLE },
|
||||||
{ "lz4", ZIO_COMPRESS_LZ4 },
|
{ "lz4", ZIO_COMPRESS_LZ4 },
|
||||||
|
{ "slack", ZIO_COMPRESS_SLACK },
|
||||||
{ "zstd", ZIO_COMPRESS_ZSTD },
|
{ "zstd", ZIO_COMPRESS_ZSTD },
|
||||||
{ "zstd-fast",
|
{ "zstd-fast",
|
||||||
ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_DEFAULT) },
|
ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_DEFAULT) },
|
||||||
|
|
|
@ -70,6 +70,7 @@ $(MODULE)-objs += rrwlock.o
|
||||||
$(MODULE)-objs += sa.o
|
$(MODULE)-objs += sa.o
|
||||||
$(MODULE)-objs += sha256.o
|
$(MODULE)-objs += sha256.o
|
||||||
$(MODULE)-objs += skein_zfs.o
|
$(MODULE)-objs += skein_zfs.o
|
||||||
|
$(MODULE)-objs += slack.o
|
||||||
$(MODULE)-objs += spa.o
|
$(MODULE)-objs += spa.o
|
||||||
$(MODULE)-objs += spa_boot.o
|
$(MODULE)-objs += spa_boot.o
|
||||||
$(MODULE)-objs += spa_checkpoint.o
|
$(MODULE)-objs += spa_checkpoint.o
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* CDDL HEADER START
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the terms of the
|
||||||
|
* Common Development and Distribution License (the "License").
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
*
|
||||||
|
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
* or http://www.opensolaris.org/os/licensing.
|
||||||
|
* See the License for the specific language governing permissions
|
||||||
|
* and limitations under the License.
|
||||||
|
*
|
||||||
|
* When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
* If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
* information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
*
|
||||||
|
* CDDL HEADER END
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Klara Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/zio_compress.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Slack compression simply searches for the last non-zero byte in the buffer,
|
||||||
|
* and sets the position as the size of the "compressed" data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t
|
||||||
|
slack_compress(void *src, void *dst, size_t s_len, size_t d_len, int level)
|
||||||
|
{
|
||||||
|
ASSERT3U(s_len, >, 0);
|
||||||
|
ASSERT0(P2PHASE(s_len, sizeof (uint64_t)));
|
||||||
|
|
||||||
|
uint64_t *buf = (uint64_t *)src;
|
||||||
|
|
||||||
|
int p = (s_len / sizeof (uint64_t)) - 1;
|
||||||
|
for (; p >= 0; p--)
|
||||||
|
if (buf[p] != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (p < 0)
|
||||||
|
return (s_len);
|
||||||
|
|
||||||
|
size_t c_len = (p + 1) * sizeof (uint64_t);
|
||||||
|
if (c_len > d_len)
|
||||||
|
return (s_len);
|
||||||
|
|
||||||
|
memcpy(dst, src, c_len);
|
||||||
|
return (c_len);
|
||||||
|
}
|
|
@ -4569,6 +4569,20 @@ zfs_check_settable(const char *dsname, nvpair_t *pair, cred_t *cr)
|
||||||
}
|
}
|
||||||
spa_close(spa, FTAG);
|
spa_close(spa, FTAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (compval == ZIO_COMPRESS_SLACK) {
|
||||||
|
spa_t *spa;
|
||||||
|
|
||||||
|
if ((err = spa_open(dsname, &spa, FTAG)) != 0)
|
||||||
|
return (err);
|
||||||
|
|
||||||
|
if (!spa_feature_is_enabled(spa,
|
||||||
|
SPA_FEATURE_SLACK_COMPRESS)) {
|
||||||
|
spa_close(spa, FTAG);
|
||||||
|
return (SET_ERROR(ENOTSUP));
|
||||||
|
}
|
||||||
|
spa_close(spa, FTAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ zio_compress_info_t zio_compress_table[ZIO_COMPRESS_FUNCTIONS] = {
|
||||||
{"lz4", 0, lz4_compress_zfs, lz4_decompress_zfs, NULL},
|
{"lz4", 0, lz4_compress_zfs, lz4_decompress_zfs, NULL},
|
||||||
{"zstd", ZIO_ZSTD_LEVEL_DEFAULT, zfs_zstd_compress,
|
{"zstd", ZIO_ZSTD_LEVEL_DEFAULT, zfs_zstd_compress,
|
||||||
zfs_zstd_decompress, zfs_zstd_decompress_level},
|
zfs_zstd_decompress, zfs_zstd_decompress_level},
|
||||||
|
{"slack", 0, slack_compress, NULL, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t
|
uint8_t
|
||||||
|
@ -215,6 +216,8 @@ zio_compress_to_feature(enum zio_compress comp)
|
||||||
switch (comp) {
|
switch (comp) {
|
||||||
case ZIO_COMPRESS_ZSTD:
|
case ZIO_COMPRESS_ZSTD:
|
||||||
return (SPA_FEATURE_ZSTD_COMPRESS);
|
return (SPA_FEATURE_ZSTD_COMPRESS);
|
||||||
|
case ZIO_COMPRESS_SLACK:
|
||||||
|
return (SPA_FEATURE_SLACK_COMPRESS);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue