bcachefs: Fix zstd compress workspace size
zstd apparently lies about the size of the compression workspace it requires; if we double it compression succeeds. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
3f3ae1250e
commit
bbc3a46065
@ -931,7 +931,7 @@ struct bch_fs {
|
||||
mempool_t compression_bounce[2];
|
||||
mempool_t compress_workspace[BCH_COMPRESSION_TYPE_NR];
|
||||
mempool_t decompress_workspace;
|
||||
ZSTD_parameters zstd_params;
|
||||
size_t zstd_workspace_size;
|
||||
|
||||
struct crypto_shash *sha256;
|
||||
struct crypto_sync_skcipher *chacha20;
|
||||
|
@ -354,8 +354,7 @@ static int attempt_compress(struct bch_fs *c,
|
||||
*/
|
||||
unsigned level = min((compression.level * 3) / 2, zstd_max_clevel());
|
||||
ZSTD_parameters params = zstd_get_params(level, c->opts.encoded_extent_max);
|
||||
ZSTD_CCtx *ctx = zstd_init_cctx(workspace,
|
||||
zstd_cctx_workspace_bound(¶ms.cParams));
|
||||
ZSTD_CCtx *ctx = zstd_init_cctx(workspace, c->zstd_workspace_size);
|
||||
|
||||
/*
|
||||
* ZSTD requires that when we decompress we pass in the exact
|
||||
@ -371,7 +370,7 @@ static int attempt_compress(struct bch_fs *c,
|
||||
size_t len = zstd_compress_cctx(ctx,
|
||||
dst + 4, dst_len - 4 - 7,
|
||||
src, src_len,
|
||||
&c->zstd_params);
|
||||
¶ms);
|
||||
if (zstd_is_error(len))
|
||||
return 0;
|
||||
|
||||
@ -572,6 +571,13 @@ static int __bch2_fs_compress_init(struct bch_fs *c, u64 features)
|
||||
size_t decompress_workspace_size = 0;
|
||||
ZSTD_parameters params = zstd_get_params(zstd_max_clevel(),
|
||||
c->opts.encoded_extent_max);
|
||||
|
||||
/*
|
||||
* ZSTD is lying: if we allocate the size of the workspace it says it
|
||||
* requires, it returns memory allocation errors
|
||||
*/
|
||||
c->zstd_workspace_size = zstd_cctx_workspace_bound(¶ms.cParams);
|
||||
|
||||
struct {
|
||||
unsigned feature;
|
||||
enum bch_compression_type type;
|
||||
@ -585,13 +591,11 @@ static int __bch2_fs_compress_init(struct bch_fs *c, u64 features)
|
||||
zlib_deflate_workspacesize(MAX_WBITS, DEF_MEM_LEVEL),
|
||||
zlib_inflate_workspacesize(), },
|
||||
{ BCH_FEATURE_zstd, BCH_COMPRESSION_TYPE_zstd,
|
||||
zstd_cctx_workspace_bound(¶ms.cParams),
|
||||
c->zstd_workspace_size,
|
||||
zstd_dctx_workspace_bound() },
|
||||
}, *i;
|
||||
bool have_compressed = false;
|
||||
|
||||
c->zstd_params = params;
|
||||
|
||||
for (i = compression_types;
|
||||
i < compression_types + ARRAY_SIZE(compression_types);
|
||||
i++)
|
||||
|
Loading…
Reference in New Issue
Block a user