Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1909528imu; Wed, 21 Nov 2018 04:00:53 -0800 (PST) X-Google-Smtp-Source: AFSGD/UWyjSeB9LiHw0/8UnsaTfm5xr4Q4JbGCzD11o6vr5dveS2KZu/qKOjvTzgu+Rp8iCcAtWy X-Received: by 2002:a63:cc43:: with SMTP id q3mr5607240pgi.291.1542801653703; Wed, 21 Nov 2018 04:00:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542801653; cv=none; d=google.com; s=arc-20160816; b=BATOCsYu9Bv0nHAGWloLhlaYpYCOH0/4D8512nsq9/00HJleGQaU879odiLbjNYBU5 2lYYuX7qzfAirQWXiGM1jxGujdCc7jNpnMooI1hm42Vd0QKyxFLQ91rjEJtAQUQIk8ke Mavhzg7RQVZXAHTtHE9pjp2WzzLz5dxEQBJcY0OdMoMBEhqZaSVI6DCEi/z5zDyPmBjA l5KL3Eqv0tpbYyjPemJyRV73IIaDSFtphWAZsbypJSs/aD2r9GvTsEqW9+PAti9cfwVG fRwJd9NTHYOeqO2meZCl9i8aRlmYSMaRm0/g6rE+4dHA3dCHPDL3nlLTEutSWANEYwsQ gGmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :spamdiagnosticmetadata:spamdiagnosticoutput:nodisclaimer :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from:dkim-signature; bh=3y7Q5FCM3TywQ5fEWGQ0PndnpaHCrgQho/WgCfw7Tiw=; b=T5Z8XFfYIkAOb7n9no/B0G8tmpoJt4yRSiGeftEOVWT08XCDTTtkdqJpuwd2ckFRTu lUmK8n+yxJBLUKEYpUVqWOzt50qh9MalEBSXNlq9FalR9S4dD4wNqkv9nk8c5TokzTQt Pxku7BxqA9JMzyStm5wrYP80n4gjA6CcjBmtOQImssTHJ3A7KGz+su8RbG0JpRc9XUi9 YihlyfCs7aoAIOseKt5c8Tn4t/gvA6PrTSApcLCg8JsrlcJmjNuHwWYCLrpDf7vqbvF6 BKQQlMZsYOARQ8NyJr9Qff0KVtwWgAyhVUNLuzFIju4xlOfgjKnYSOlQQMryRqp/78ya gDDw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector1-arm-com header.b=CoDU4hmh; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a17-v6si4135152pfa.227.2018.11.21.04.00.38; Wed, 21 Nov 2018 04:00:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector1-arm-com header.b=CoDU4hmh; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730075AbeKUWd5 (ORCPT + 99 others); Wed, 21 Nov 2018 17:33:57 -0500 Received: from mail-eopbgr80071.outbound.protection.outlook.com ([40.107.8.71]:41861 "EHLO EUR04-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728460AbeKUWd4 (ORCPT ); Wed, 21 Nov 2018 17:33:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3y7Q5FCM3TywQ5fEWGQ0PndnpaHCrgQho/WgCfw7Tiw=; b=CoDU4hmhnqRe367wLAZLP11CHhIgfRO8UThzuMmDfPc4FkPD8xOAaGFFj26i3sPpYTCgXd4+uysK/6vfq7k6fz/610t2JTq/IrIJKLC3iGmSMBsUDwIsch7Q5/bsP641aH4xsax0oIuyiErXDE1ew/67b7wC0cYtlH0w3EsyQzc= Received: from VI1PR0802MB2528.eurprd08.prod.outlook.com (10.175.20.142) by VI1PR0802MB2269.eurprd08.prod.outlook.com (10.172.13.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1339.20; Wed, 21 Nov 2018 11:59:35 +0000 Received: from VI1PR0802MB2528.eurprd08.prod.outlook.com ([fe80::3d5c:5229:b634:b1ac]) by VI1PR0802MB2528.eurprd08.prod.outlook.com ([fe80::3d5c:5229:b634:b1ac%9]) with mapi id 15.20.1339.027; Wed, 21 Nov 2018 11:59:35 +0000 From: Dave Rodgman To: "linux-kernel@vger.kernel.org" CC: nd , "herbert@gondor.apana.org.au" , "davem@davemloft.net" , Matt Sealey , "nitingupta910@gmail.com" , "rpurdie@openedhand.com" , "markus@oberhumer.com" , "minchan@kernel.org" , "sergey.senozhatsky.work@gmail.com" Subject: [PATCH 6/6] lib/lzo: separate lzo-rle from lzo Thread-Topic: [PATCH 6/6] lib/lzo: separate lzo-rle from lzo Thread-Index: AQHUgZGrxB4lU1FSfUWDqlG/XrJ9FA== Date: Wed, 21 Nov 2018 11:59:35 +0000 Message-ID: <20181121115922.22864-7-dave.rodgman@arm.com> References: <20181121115922.22864-2-dave.rodgman@arm.com> In-Reply-To: <20181121115922.22864-2-dave.rodgman@arm.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.16.4 x-originating-ip: [217.140.106.53] x-clientproxiedby: LO2P265CA0301.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a5::25) To VI1PR0802MB2528.eurprd08.prod.outlook.com (2603:10a6:800:b0::14) authentication-results: spf=none (sender IP is ) smtp.mailfrom=dave.rodgman@arm.com; x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;VI1PR0802MB2269;6:mJe/itVIvguK0GcHgvSoI/TIkERjVUZ8tCT9Ng+U+s7VinN2sPdPMP7eWg+g4JDey1pardc8SGt4Sxp419Lc1couxwuQhSnqHLlYJuOr1+89ZnPC5HWuKMugE0oBykOocpJ6kYKp5K+wkLcULSohub3afZVZUwN7vIfj32LDbqjY5q0F2ZXujv8GOoIqzW1o7L3Q1cBdDIzeqCsQDV9RFfKMkQhR5sr0JdDO5wbTcAZy5iZ7prYjxVGW5JvckHgF500qDLe1l3QdbzGK46mG/41XQjC4sHvRhAfC68GbDAAJr7vFXJe8SbFMLKG/FyiPHr+AV/soZZKhlcRQamEBCICJw2MlhIBfu7kRrclSgDPQmgdFyqdEnJ2ceGS+pGny2R1IHJ/v7YNxIK7eh/3qjR67aEo2NylV5K7CQ0e3bKv+EZrva1VN+9rsJz9NSihjPAgJZSgwRtLz4gjs5t2VYw==;5:eDzS3DCQ35EwdiQrGFnLepiRYGo+hutztzvO8e3M8FyRkHj87UW1UFWIaHfufAxwzh+aJLS0qEamtJF00T/zvYVQQcm2x/ISUUnpkdBlNLKYDW5pZAGp/3Zi7XKpicEggcvRPyu7ezcQKXL10BQRcIEzTMryyzdiP4ydDIcmu0E=;7:W1ZLaCYQ/cSLCw3MdzsSbvhakEUDZxWLc1OTepmH/fbVi6I6bqBSvKB9zbnV9hRsEyozctKviidt4KwoY+P97iOo6T7FhzBXUpeq1ldLVtnS2ivkZ3FroquJesiOSXmgYfF1D34Fkmph1hBMH85Izw== x-ms-office365-filtering-correlation-id: 6552c811-3883-463f-be25-08d64fa8ce05 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390098)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);SRVR:VI1PR0802MB2269; x-ms-traffictypediagnostic: VI1PR0802MB2269: nodisclaimer: True x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3002001)(3231442)(944501410)(52105112)(6055026)(148016)(149066)(150057)(6041310)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123560045)(201708071742011)(7699051)(76991095);SRVR:VI1PR0802MB2269;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0802MB2269; x-forefront-prvs: 08635C03D4 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(396003)(346002)(376002)(366004)(39860400002)(136003)(199004)(189003)(50226002)(14454004)(478600001)(53936002)(5660300001)(186003)(6512007)(54906003)(305945005)(316002)(6436002)(5640700003)(1076002)(106356001)(6486002)(6116002)(36756003)(3846002)(7736002)(476003)(52116002)(2906002)(446003)(2616005)(39060400002)(66066001)(486006)(71200400001)(99286004)(71190400001)(76176011)(68736007)(2900100001)(11346002)(14444005)(2351001)(105586002)(256004)(8676002)(4326008)(26005)(81156014)(97736004)(25786009)(81166006)(8936002)(6916009)(102836004)(4744004)(6506007)(386003)(575784001)(2501003)(44832011)(86362001)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR0802MB2269;H:VI1PR0802MB2528.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: o23zfizh3tZD4ErBNxydYht0KDKB07G7qjhWUD+yXb8UR/HhjCi1jSqFOVIGXydtohTaSLpTZhLuEVnVGSYpM8P03wAatO4Tw/HM/2MwSgNzc6bLOtUJA2GWn2Ywf6jl6f25FXX70CYkeeDggGPajeMsbndxpnEAztuTowh+mV3QI57rZWjqDEHdJU9PfJhDWstYuoF9yynPExsuI6MCI9A/fDHyCIIxbLBxbreOFHQga6v0nZeioxO1B7r3bKrzz1iBAfldQr9bI2C1r8IE6RaEmarpSJ1heXImbY5pMpTOyP3PHw1QvWHRKu+1OaBpcP61TDLZCevWxBN8JKuK/ihr4UOpCgdBeHS1nSH8Too= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6552c811-3883-463f-be25-08d64fa8ce05 X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Nov 2018 11:59:35.1899 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2269 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org To prevent any issues with persistent data, separate lzo-rle from lzo so that it is treated as a separate algorithm, and lzo is still available. Use lzo-rle as the default algorithm for zram. Signed-off-by: Dave Rodgman --- Documentation/lzo.txt | 12 ++- crypto/Makefile | 2 +- crypto/lzo-rle.c | 171 ++++++++++++++++++++++++++++++++++++++= ++++ crypto/tcrypt.c | 4 +- drivers/block/zram/zcomp.c | 1 + drivers/block/zram/zram_drv.c | 2 +- include/linux/lzo.h | 4 + lib/lzo/lzo1x_compress.c | 42 ++++++++--- lib/lzo/lzodefs.h | 3 +- 9 files changed, 223 insertions(+), 18 deletions(-) create mode 100644 crypto/lzo-rle.c diff --git a/Documentation/lzo.txt b/Documentation/lzo.txt index 306c60344ca7..f79934225d8d 100644 --- a/Documentation/lzo.txt +++ b/Documentation/lzo.txt @@ -88,6 +88,10 @@ length encoding. This improves speed for data with many = zeros, which is a common case for zram. This modifies the bitstream in a backwards compatibl= e way (v1 can correctly decompress v0 compressed data, but v0 cannot read v1 dat= a). =20 +For maximum compatibility, both versions are available under different nam= es +(lzo and lzo-rle). Differences in the encoding are noted in this document = with +e.g.: version 1 only. + Byte sequences =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 @@ -99,8 +103,8 @@ Byte sequences invalid at this place. =20 17 : bitstream version. If the first byte is 17, the next byte - gives the bitstream version. If the first byte is not 17, - the bitstream version is 0. + gives the bitstream version (version 1 only). If the first= byte + is not 17, the bitstream version is 0. =20 18..21 : copy 0..3 literals state =3D (byte - 17) =3D 0..3 [ copy literals ] @@ -154,8 +158,8 @@ Byte sequences state =3D S (copy S literals after this block) End of stream is reached if distance =3D=3D 16384 =20 - In version 1, this instruction is also used to encode a run of zer= os if - distance =3D 0xbfff, i.e. H =3D 1 and the D bits are all 1. + In version 1 only, this instruction is also used to encode a run o= f + zeros if distance =3D 0xbfff, i.e. H =3D 1 and the D bits are all = 1. In this case, it is followed by a fourth byte, X. run length =3D ((X << 3) | (0 0 0 0 0 L L L)) + 4. =20 diff --git a/crypto/Makefile b/crypto/Makefile index 6d1d40eeb964..4b482fa11fee 100644 --- a/crypto/Makefile +++ b/crypto/Makefile @@ -125,7 +125,7 @@ obj-$(CONFIG_CRYPTO_CRC32C) +=3D crc32c_generic.o obj-$(CONFIG_CRYPTO_CRC32) +=3D crc32_generic.o obj-$(CONFIG_CRYPTO_CRCT10DIF) +=3D crct10dif_common.o crct10dif_generic.o obj-$(CONFIG_CRYPTO_AUTHENC) +=3D authenc.o authencesn.o -obj-$(CONFIG_CRYPTO_LZO) +=3D lzo.o +obj-$(CONFIG_CRYPTO_LZO) +=3D lzo.o lzo-rle.o obj-$(CONFIG_CRYPTO_LZ4) +=3D lz4.o obj-$(CONFIG_CRYPTO_LZ4HC) +=3D lz4hc.o obj-$(CONFIG_CRYPTO_842) +=3D 842.o diff --git a/crypto/lzo-rle.c b/crypto/lzo-rle.c new file mode 100644 index 000000000000..d51baebbd8d7 --- /dev/null +++ b/crypto/lzo-rle.c @@ -0,0 +1,171 @@ +/* + * Cryptographic API. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as publishe= d by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WIT= HOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License f= or + * more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +struct lzorle_ctx { + void *lzorle_comp_mem; +}; + +static void *lzorle_alloc_ctx(struct crypto_scomp *tfm) +{ + void *ctx; + + ctx =3D kvmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + if (!ctx) + return ERR_PTR(-ENOMEM); + + return ctx; +} + +static int lzorle_init(struct crypto_tfm *tfm) +{ + struct lzorle_ctx *ctx =3D crypto_tfm_ctx(tfm); + + ctx->lzorle_comp_mem =3D lzorle_alloc_ctx(NULL); + if (IS_ERR(ctx->lzorle_comp_mem)) + return -ENOMEM; + + return 0; +} + +static void lzorle_free_ctx(struct crypto_scomp *tfm, void *ctx) +{ + kvfree(ctx); +} + +static void lzorle_exit(struct crypto_tfm *tfm) +{ + struct lzorle_ctx *ctx =3D crypto_tfm_ctx(tfm); + + lzorle_free_ctx(NULL, ctx->lzorle_comp_mem); +} + +static int __lzorle_compress(const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen, void *ctx) +{ + size_t tmp_len =3D *dlen; /* size_t(ulong) <-> uint on 64 bit */ + int err; + + err =3D lzorle1x_1_compress(src, slen, dst, &tmp_len, ctx); + + if (err !=3D LZO_E_OK) + return -EINVAL; + + *dlen =3D tmp_len; + return 0; +} + +static int lzorle_compress(struct crypto_tfm *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen) +{ + struct lzorle_ctx *ctx =3D crypto_tfm_ctx(tfm); + + return __lzorle_compress(src, slen, dst, dlen, ctx->lzorle_comp_mem); +} + +static int lzorle_scompress(struct crypto_scomp *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen, + void *ctx) +{ + return __lzorle_compress(src, slen, dst, dlen, ctx); +} + +static int __lzorle_decompress(const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) +{ + int err; + size_t tmp_len =3D *dlen; /* size_t(ulong) <-> uint on 64 bit */ + + err =3D lzo1x_decompress_safe(src, slen, dst, &tmp_len); + + if (err !=3D LZO_E_OK) + return -EINVAL; + + *dlen =3D tmp_len; + return 0; +} + +static int lzorle_decompress(struct crypto_tfm *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen) +{ + return __lzorle_decompress(src, slen, dst, dlen); +} + +static int lzorle_sdecompress(struct crypto_scomp *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen, + void *ctx) +{ + return __lzorle_decompress(src, slen, dst, dlen); +} + +static struct crypto_alg alg =3D { + .cra_name =3D "lzo-rle", + .cra_flags =3D CRYPTO_ALG_TYPE_COMPRESS, + .cra_ctxsize =3D sizeof(struct lzorle_ctx), + .cra_module =3D THIS_MODULE, + .cra_init =3D lzorle_init, + .cra_exit =3D lzorle_exit, + .cra_u =3D { .compress =3D { + .coa_compress =3D lzorle_compress, + .coa_decompress =3D lzorle_decompress } } +}; + +static struct scomp_alg scomp =3D { + .alloc_ctx =3D lzorle_alloc_ctx, + .free_ctx =3D lzorle_free_ctx, + .compress =3D lzorle_scompress, + .decompress =3D lzorle_sdecompress, + .base =3D { + .cra_name =3D "lzo-rle", + .cra_driver_name =3D "lzo-rle-scomp", + .cra_module =3D THIS_MODULE, + } +}; + +static int __init lzorle_mod_init(void) +{ + int ret; + + ret =3D crypto_register_alg(&alg); + if (ret) + return ret; + + ret =3D crypto_register_scomp(&scomp); + if (ret) { + crypto_unregister_alg(&alg); + return ret; + } + + return ret; +} + +static void __exit lzorle_mod_fini(void) +{ + crypto_unregister_alg(&alg); + crypto_unregister_scomp(&scomp); +} + +module_init(lzorle_mod_init); +module_exit(lzorle_mod_fini); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("LZO-RLE Compression Algorithm"); +MODULE_ALIAS_CRYPTO("lzo-rle"); diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index bdde95e8d369..c154bc657e3a 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c @@ -76,8 +76,8 @@ static char *check[] =3D { "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt", "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320", - "lzo", "cts", "zlib", "sha3-224", "sha3-256", "sha3-384", "sha3-512", - NULL + "lzo", "lzo-rle", "cts", "zlib", "sha3-224", "sha3-256", "sha3-384", + "sha3-512", NULL }; =20 static u32 block_sizes[] =3D { 16, 64, 256, 1024, 8192, 0 }; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 4ed0a78fdc09..4d9a38890965 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -20,6 +20,7 @@ =20 static const char * const backends[] =3D { "lzo", + "lzo-rle", #if IS_ENABLED(CONFIG_CRYPTO_LZ4) "lz4", #endif diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index a1d6b5597c17..bc127f21d1e9 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -41,7 +41,7 @@ static DEFINE_IDR(zram_index_idr); static DEFINE_MUTEX(zram_index_mutex); =20 static int zram_major; -static const char *default_compressor =3D "lzo"; +static const char *default_compressor =3D "lzo-rle"; =20 /* Module params (documentation at end) */ static unsigned int num_devices =3D 1; diff --git a/include/linux/lzo.h b/include/linux/lzo.h index 547a86c71e1b..e95c7d1092b2 100644 --- a/include/linux/lzo.h +++ b/include/linux/lzo.h @@ -24,6 +24,10 @@ int lzo1x_1_compress(const unsigned char *src, size_t src_len, unsigned char *dst, size_t *dst_len, void *wrkmem); =20 +/* This requires 'wrkmem' of size LZO1X_1_MEM_COMPRESS */ +int lzorle1x_1_compress(const unsigned char *src, size_t src_len, + unsigned char *dst, size_t *dst_len, void *wrkmem); + /* safe decompression with overrun testing */ int lzo1x_decompress_safe(const unsigned char *src, size_t src_len, unsigned char *dst, size_t *dst_len); diff --git a/lib/lzo/lzo1x_compress.c b/lib/lzo/lzo1x_compress.c index fa8d4ff38531..1a1cd5e84391 100644 --- a/lib/lzo/lzo1x_compress.c +++ b/lib/lzo/lzo1x_compress.c @@ -20,7 +20,8 @@ static noinline size_t lzo1x_1_do_compress(const unsigned char *in, size_t in_len, unsigned char *out, size_t *out_len, - size_t ti, void *wrkmem, signed char *state_offset) + size_t ti, void *wrkmem, signed char *state_offset, + const unsigned char bitstream_version) { const unsigned char *ip; unsigned char *op; @@ -46,7 +47,7 @@ lzo1x_1_do_compress(const unsigned char *in, size_t in_le= n, break; dv =3D get_unaligned_le32(ip); =20 - if (dv =3D=3D 0) { + if (dv =3D=3D 0 && bitstream_version) { const unsigned char *ir =3D ip + 4; const unsigned char *limit =3D ip_end < (ip + MAX_ZERO_RUN_LENGTH + 1) @@ -282,30 +283,36 @@ lzo1x_1_do_compress(const unsigned char *in, size_t i= n_len, return in_end - (ii - ti); } =20 -int lzo1x_1_compress(const unsigned char *in, size_t in_len, +int lzogeneric1x_1_compress(const unsigned char *in, size_t in_len, unsigned char *out, size_t *out_len, - void *wrkmem) + void *wrkmem, const unsigned char bitstream_version) { const unsigned char *ip =3D in; unsigned char *op =3D out; size_t l =3D in_len; size_t t =3D 0; signed char state_offset =3D -2; + unsigned int m4_max_offset; =20 // LZO v0 will never write 17 as first byte, // so this is used to version the bitstream - *op++ =3D 17; - *op++ =3D LZO_VERSION; + if (bitstream_version > 0) { + *op++ =3D 17; + *op++ =3D bitstream_version; + m4_max_offset =3D M4_MAX_OFFSET_V1; + } else { + m4_max_offset =3D M4_MAX_OFFSET_V0; + } =20 while (l > 20) { - size_t ll =3D l <=3D (M4_MAX_OFFSET + 1) ? l : (M4_MAX_OFFSET + 1); + size_t ll =3D l <=3D (m4_max_offset + 1) ? l : (m4_max_offset + 1); uintptr_t ll_end =3D (uintptr_t) ip + ll; if ((ll_end + ((t + ll) >> 5)) <=3D ll_end) break; BUILD_BUG_ON(D_SIZE * sizeof(lzo_dict_t) > LZO1X_1_MEM_COMPRESS); memset(wrkmem, 0, D_SIZE * sizeof(lzo_dict_t)); - t =3D lzo1x_1_do_compress(ip, ll, op, out_len, - t, wrkmem, &state_offset); + t =3D lzo1x_1_do_compress(ip, ll, op, out_len, t, wrkmem, + &state_offset, bitstream_version); ip +=3D ll; op +=3D *out_len; l -=3D ll; @@ -348,7 +355,24 @@ int lzo1x_1_compress(const unsigned char *in, size_t i= n_len, *out_len =3D op - out; return LZO_E_OK; } + +int lzo1x_1_compress(const unsigned char *in, size_t in_len, + unsigned char *out, size_t *out_len, + void *wrkmem) +{ + return lzogeneric1x_1_compress(in, in_len, out, out_len, wrkmem, 0); +} + +int lzorle1x_1_compress(const unsigned char *in, size_t in_len, + unsigned char *out, size_t *out_len, + void *wrkmem) +{ + return lzogeneric1x_1_compress(in, in_len, out, out_len, + wrkmem, LZO_VERSION); +} + EXPORT_SYMBOL_GPL(lzo1x_1_compress); +EXPORT_SYMBOL_GPL(lzorle1x_1_compress); =20 MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("LZO1X-1 Compressor"); diff --git a/lib/lzo/lzodefs.h b/lib/lzo/lzodefs.h index 436bb400ac87..60b5c63afcdb 100644 --- a/lib/lzo/lzodefs.h +++ b/lib/lzo/lzodefs.h @@ -52,7 +52,8 @@ #define M1_MAX_OFFSET 0x0400 #define M2_MAX_OFFSET 0x0800 #define M3_MAX_OFFSET 0x4000 -#define M4_MAX_OFFSET 0xbffe +#define M4_MAX_OFFSET_V0 0xbfff +#define M4_MAX_OFFSET_V1 0xbffe =20 #define M1_MIN_LEN 2 #define M1_MAX_LEN 2 --=20 2.16.4