From patchwork Thu Apr 25 16:07:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 1090964 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=nic.cz Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=nic.cz header.i=@nic.cz header.b="sps/szP/"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 44qhtN2XKdz9s00 for ; Fri, 26 Apr 2019 02:08:12 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 064F0C21E29; Thu, 25 Apr 2019 16:08:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id D6888C21DB5; Thu, 25 Apr 2019 16:07:48 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id E6387C21C51; Thu, 25 Apr 2019 16:07:46 +0000 (UTC) Received: from mail.nic.cz (mail.nic.cz [217.31.204.67]) by lists.denx.de (Postfix) with ESMTPS id 90C5DC21D56 for ; Thu, 25 Apr 2019 16:07:46 +0000 (UTC) Received: from dellmb.labs.office.nic.cz (unknown [172.20.6.125]) by mail.nic.cz (Postfix) with ESMTP id 0417463794; Thu, 25 Apr 2019 18:07:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nic.cz; s=default; t=1556208466; bh=Jjj/l5PycpGntx8hNo6TH1+HrYRSuvMJC7ECjdurKUA=; h=From:To:Date; b=sps/szP/ot7x+O+nGBmlbFay4SkgaIvhuGlJXEw+6+yhuSy8EEKkqPOBEIuX3J7UD Mw+wwX0yuF3g7hSBTPxRqjvya3v/swYRABIx+sflfMrH6bw9ThtSd9giMiixefWcsw Uv5+McuNXqovtVUYrQIIg8O4CppZUjM3yOd0u/jI= From: =?utf-8?q?Marek_Beh=C3=BAn?= To: u-boot@lists.denx.de Date: Thu, 25 Apr 2019 18:07:44 +0200 Message-Id: <20190425160744.6079-4-marek.behun@nic.cz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190425160744.6079-1-marek.behun@nic.cz> References: <20190425160744.6079-1-marek.behun@nic.cz> MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.99.2 at mail X-Virus-Status: Clean Cc: Tom Rini , =?utf-8?q?Alberto_S=C3=A1nchez_Molero?= , Yevgeny Popovych , Stefan Roese Subject: [U-Boot] [PATCH v1 3/3] fs: btrfs: add zstd decompression support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This adds decompression support for Zstandard, which has been included in Linux btrfs driver for some time. Signed-off-by: Marek BehĂșn --- fs/btrfs/Kconfig | 1 + fs/btrfs/btrfs_tree.h | 5 ++-- fs/btrfs/compression.c | 59 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig index 22909d9fcc..f302b1fbef 100644 --- a/fs/btrfs/Kconfig +++ b/fs/btrfs/Kconfig @@ -2,6 +2,7 @@ config FS_BTRFS bool "Enable BTRFS filesystem support" select CRC32C select LZO + select ZSTD select RBTREE help This provides a single-device read-only BTRFS support. BTRFS is a diff --git a/fs/btrfs/btrfs_tree.h b/fs/btrfs/btrfs_tree.h index f90fbb2951..aa0f3d6c86 100644 --- a/fs/btrfs/btrfs_tree.h +++ b/fs/btrfs/btrfs_tree.h @@ -647,8 +647,9 @@ enum btrfs_compression_type { BTRFS_COMPRESS_NONE = 0, BTRFS_COMPRESS_ZLIB = 1, BTRFS_COMPRESS_LZO = 2, - BTRFS_COMPRESS_TYPES = 2, - BTRFS_COMPRESS_LAST = 3, + BTRFS_COMPRESS_ZSTD = 3, + BTRFS_COMPRESS_TYPES = 3, + BTRFS_COMPRESS_LAST = 4, }; struct btrfs_file_extent_item { diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index e5601b8f2b..346875d45a 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -6,7 +6,9 @@ */ #include "btrfs.h" +#include #include +#include #include #include @@ -108,6 +110,61 @@ static u32 decompress_zlib(const u8 *_cbuf, u32 clen, u8 *dbuf, u32 dlen) return res; } +#define ZSTD_BTRFS_MAX_WINDOWLOG 17 +#define ZSTD_BTRFS_MAX_INPUT (1 << ZSTD_BTRFS_MAX_WINDOWLOG) + +static u32 decompress_zstd(const u8 *cbuf, u32 clen, u8 *dbuf, u32 dlen) +{ + ZSTD_DStream *dstream; + ZSTD_inBuffer in_buf; + ZSTD_outBuffer out_buf; + void *workspace; + size_t wsize; + u32 res = -1; + + wsize = ZSTD_DStreamWorkspaceBound(ZSTD_BTRFS_MAX_INPUT); + workspace = malloc(wsize); + if (!workspace) { + debug("%s: cannot allocate workspace of size %zu\n", __func__, + wsize); + return -1; + } + + dstream = ZSTD_initDStream(ZSTD_BTRFS_MAX_INPUT, workspace, wsize); + if (!dstream) { + printf("%s: ZSTD_initDStream failed\n", __func__); + goto err_free; + } + + in_buf.src = cbuf; + in_buf.pos = 0; + in_buf.size = clen; + + out_buf.dst = dbuf; + out_buf.pos = 0; + out_buf.size = dlen; + + while (1) { + size_t ret; + + ret = ZSTD_decompressStream(dstream, &out_buf, &in_buf); + if (ZSTD_isError(ret)) { + printf("%s: ZSTD_decompressStream error %d\n", __func__, + ZSTD_getErrorCode(ret)); + goto err_free; + } + + if (in_buf.pos >= clen || !ret) + break; + } + + res = out_buf.pos; + +err_free: + free(workspace); + return res; +} + u32 btrfs_decompress(u8 type, const char *c, u32 clen, char *d, u32 dlen) { u32 res; @@ -126,6 +183,8 @@ u32 btrfs_decompress(u8 type, const char *c, u32 clen, char *d, u32 dlen) return decompress_zlib(cbuf, clen, dbuf, dlen); case BTRFS_COMPRESS_LZO: return decompress_lzo(cbuf, clen, dbuf, dlen); + case BTRFS_COMPRESS_ZSTD: + return decompress_zstd(cbuf, clen, dbuf, dlen); default: printf("%s: Unsupported compression in extent: %i\n", __func__, type);