Merge dbee1a907f
into 1713aa7b4d
This commit is contained in:
commit
4902ecdbf3
|
@ -54,6 +54,7 @@ enum zio_compress {
|
|||
ZIO_COMPRESS_ZLE,
|
||||
ZIO_COMPRESS_LZ4,
|
||||
ZIO_COMPRESS_ZSTD,
|
||||
ZIO_COMPRESS_SLACK,
|
||||
ZIO_COMPRESS_FUNCTIONS
|
||||
};
|
||||
|
||||
|
@ -169,6 +170,10 @@ extern size_t zfs_lz4_compress(abd_t *src, abd_t *dst, size_t s_len,
|
|||
size_t d_len, int level);
|
||||
extern int zfs_lz4_decompress(abd_t *src, abd_t *dst, size_t s_len,
|
||||
size_t d_len, int level);
|
||||
extern size_t zfs_slack_compress(abd_t *src, abd_t *dst, size_t s_len,
|
||||
size_t d_len, int level);
|
||||
extern int zfs_slack_decompress(abd_t *src, abd_t *dst, size_t s_len,
|
||||
size_t d_len, int level);
|
||||
|
||||
/*
|
||||
* Compress and decompress data if necessary.
|
||||
|
|
|
@ -83,6 +83,7 @@ typedef enum spa_feature {
|
|||
SPA_FEATURE_REDACTION_LIST_SPILL,
|
||||
SPA_FEATURE_RAIDZ_EXPANSION,
|
||||
SPA_FEATURE_FAST_DEDUP,
|
||||
SPA_FEATURE_SLACK_COMPRESS,
|
||||
SPA_FEATURES
|
||||
} spa_feature_t;
|
||||
|
||||
|
|
|
@ -126,6 +126,7 @@ nodist_libzpool_la_SOURCES = \
|
|||
module/zfs/rrwlock.c \
|
||||
module/zfs/sa.c \
|
||||
module/zfs/sha2_zfs.c \
|
||||
module/zfs/slack.c \
|
||||
module/zfs/skein_zfs.c \
|
||||
module/zfs/spa.c \
|
||||
module/zfs/spa_checkpoint.c \
|
||||
|
|
|
@ -368,6 +368,7 @@ ZFS_OBJS := \
|
|||
sa.o \
|
||||
sha2_zfs.o \
|
||||
skein_zfs.o \
|
||||
slack.o \
|
||||
spa.o \
|
||||
spa_checkpoint.o \
|
||||
spa_config.o \
|
||||
|
|
|
@ -297,6 +297,7 @@ SRCS+= abd.c \
|
|||
sa.c \
|
||||
sha2_zfs.c \
|
||||
skein_zfs.c \
|
||||
slack.c \
|
||||
spa.c \
|
||||
space_map.c \
|
||||
space_reftree.c \
|
||||
|
|
|
@ -760,6 +760,20 @@ zpool_feature_init(void)
|
|||
ZFEATURE_FLAG_READONLY_COMPAT, ZFEATURE_TYPE_BOOLEAN, NULL,
|
||||
sfeatures);
|
||||
|
||||
{
|
||||
{
|
||||
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, sfeatures);
|
||||
}
|
||||
}
|
||||
|
||||
zfs_mod_list_supported_free(sfeatures);
|
||||
}
|
||||
|
||||
|
|
|
@ -130,6 +130,7 @@ zfs_prop_init(void)
|
|||
{ "gzip-9", ZIO_COMPRESS_GZIP_9 },
|
||||
{ "zle", ZIO_COMPRESS_ZLE },
|
||||
{ "lz4", ZIO_COMPRESS_LZ4 },
|
||||
{ "slack", ZIO_COMPRESS_SLACK },
|
||||
{ "zstd", ZIO_COMPRESS_ZSTD },
|
||||
{ "zstd-fast",
|
||||
ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_DEFAULT) },
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
static size_t
|
||||
zfs_slack_compress_buf(void *src, void *dst, size_t s_len, size_t d_len,
|
||||
int level)
|
||||
{
|
||||
(void) 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);
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_slack_decompress_buf(void *src, void *dst, size_t s_len, size_t d_len,
|
||||
int level)
|
||||
{
|
||||
(void) level;
|
||||
ASSERT3U(d_len, >=, s_len);
|
||||
memcpy(dst, src, s_len);
|
||||
return (0);
|
||||
}
|
||||
|
||||
ZFS_COMPRESS_WRAP_DECL(zfs_slack_compress)
|
||||
ZFS_DECOMPRESS_WRAP_DECL(zfs_slack_decompress)
|
|
@ -4806,6 +4806,20 @@ zfs_check_settable(const char *dsname, nvpair_t *pair, cred_t *cr)
|
|||
}
|
||||
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;
|
||||
|
||||
|
|
|
@ -84,6 +84,8 @@ zio_compress_info_t zio_compress_table[ZIO_COMPRESS_FUNCTIONS] = {
|
|||
zfs_lz4_compress, zfs_lz4_decompress, NULL},
|
||||
{"zstd", ZIO_ZSTD_LEVEL_DEFAULT,
|
||||
zfs_zstd_compress, zfs_zstd_decompress, zfs_zstd_decompress_level},
|
||||
{"slack", 0,
|
||||
zfs_slack_compress, zfs_slack_decompress, NULL },
|
||||
};
|
||||
|
||||
uint8_t
|
||||
|
@ -200,6 +202,8 @@ zio_compress_to_feature(enum zio_compress comp)
|
|||
switch (comp) {
|
||||
case ZIO_COMPRESS_ZSTD:
|
||||
return (SPA_FEATURE_ZSTD_COMPRESS);
|
||||
case ZIO_COMPRESS_SLACK:
|
||||
return (SPA_FEATURE_SLACK_COMPRESS);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue