mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Merge tag 'ubifixes-for-v2024-10-rc1' of https://source.denx.de/u-boot/custodians/u-boot-ubi
ubi changes for v2024.10-rc1 fs: ubifs: Add support for ZSTD decompression from Piotr Wojtaszczyk Fixes for ubi command from Martin Kurbanov
This commit is contained in:
21
cmd/ubi.c
21
cmd/ubi.c
@@ -248,7 +248,7 @@ static int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
|
||||
|
||||
static struct ubi_volume *ubi_find_volume(char *volume)
|
||||
{
|
||||
struct ubi_volume *vol = NULL;
|
||||
struct ubi_volume *vol;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ubi->vtbl_slots; i++) {
|
||||
@@ -355,13 +355,18 @@ static int ubi_rename_vol(char *oldname, char *newname)
|
||||
|
||||
static int ubi_volume_continue_write(char *volume, void *buf, size_t size)
|
||||
{
|
||||
int err = 1;
|
||||
int err;
|
||||
struct ubi_volume *vol;
|
||||
|
||||
vol = ubi_find_volume(volume);
|
||||
if (vol == NULL)
|
||||
return ENODEV;
|
||||
|
||||
if (!vol->updating) {
|
||||
printf("UBI volume update was not initiated\n");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
err = ubi_more_update_data(ubi, vol, buf, size);
|
||||
if (err < 0) {
|
||||
printf("Couldnt or partially wrote data\n");
|
||||
@@ -391,8 +396,8 @@ static int ubi_volume_continue_write(char *volume, void *buf, size_t size)
|
||||
int ubi_volume_begin_write(char *volume, void *buf, size_t size,
|
||||
size_t full_size)
|
||||
{
|
||||
int err = 1;
|
||||
int rsvd_bytes = 0;
|
||||
int err;
|
||||
int rsvd_bytes;
|
||||
struct ubi_volume *vol;
|
||||
|
||||
vol = ubi_find_volume(volume);
|
||||
@@ -411,6 +416,10 @@ int ubi_volume_begin_write(char *volume, void *buf, size_t size,
|
||||
return -err;
|
||||
}
|
||||
|
||||
/* The volume is just wiped out */
|
||||
if (!full_size)
|
||||
return 0;
|
||||
|
||||
return ubi_volume_continue_write(volume, buf, size);
|
||||
}
|
||||
|
||||
@@ -573,7 +582,7 @@ static int ubi_detach(void)
|
||||
int ubi_part(char *part_name, const char *vid_header_offset)
|
||||
{
|
||||
struct mtd_info *mtd;
|
||||
int err = 0;
|
||||
int err;
|
||||
|
||||
if (ubi && ubi->mtd && !strcmp(ubi->mtd->name, part_name)) {
|
||||
printf("UBI partition '%s' already selected\n", part_name);
|
||||
@@ -604,7 +613,7 @@ int ubi_part(char *part_name, const char *vid_header_offset)
|
||||
|
||||
static int do_ubi(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
||||
{
|
||||
int64_t size = 0;
|
||||
int64_t size;
|
||||
ulong addr = 0;
|
||||
bool skipcheck = false;
|
||||
|
||||
|
||||
@@ -320,12 +320,14 @@ enum {
|
||||
* UBIFS_COMPR_NONE: no compression
|
||||
* UBIFS_COMPR_LZO: LZO compression
|
||||
* UBIFS_COMPR_ZLIB: ZLIB compression
|
||||
* UBIFS_COMPR_ZSTD: ZSTD compression
|
||||
* UBIFS_COMPR_TYPES_CNT: count of supported compression types
|
||||
*/
|
||||
enum {
|
||||
UBIFS_COMPR_NONE,
|
||||
UBIFS_COMPR_LZO,
|
||||
UBIFS_COMPR_ZLIB,
|
||||
UBIFS_COMPR_ZSTD,
|
||||
UBIFS_COMPR_TYPES_CNT,
|
||||
};
|
||||
|
||||
|
||||
@@ -26,6 +26,11 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/lzo.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_ZSTD)
|
||||
#include <linux/zstd.h>
|
||||
#include <abuf.h>
|
||||
#endif
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/* compress.c */
|
||||
@@ -41,6 +46,25 @@ static int gzip_decompress(const unsigned char *in, size_t in_len,
|
||||
(unsigned long *)out_len, 0, 0);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_ZSTD)
|
||||
static int zstd_decompress_wrapper(const unsigned char *in, size_t in_len,
|
||||
unsigned char *out, size_t *out_len)
|
||||
{
|
||||
struct abuf abuf_in, abuf_out;
|
||||
int ret;
|
||||
|
||||
abuf_init_set(&abuf_in, (void *)in, in_len);
|
||||
abuf_init_set(&abuf_out, (void *)out, *out_len);
|
||||
|
||||
ret = zstd_decompress(&abuf_in, &abuf_out);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*out_len = ret;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Fake description object for the "none" compressor */
|
||||
static struct ubifs_compressor none_compr = {
|
||||
.compr_type = UBIFS_COMPR_NONE,
|
||||
@@ -70,8 +94,21 @@ static struct ubifs_compressor zlib_compr = {
|
||||
.decompress = gzip_decompress,
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_ZSTD)
|
||||
static struct ubifs_compressor zstd_compr = {
|
||||
.compr_type = UBIFS_COMPR_ZSTD,
|
||||
#ifndef __UBOOT__
|
||||
.comp_mutex = &zstd_enc_mutex,
|
||||
.decomp_mutex = &zstd_dec_mutex,
|
||||
#endif
|
||||
.name = "zstd",
|
||||
.capi_name = "zstd",
|
||||
.decompress = zstd_decompress_wrapper,
|
||||
};
|
||||
#endif
|
||||
|
||||
/* All UBIFS compressors */
|
||||
struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
|
||||
struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT] = {NULL};
|
||||
|
||||
|
||||
#ifdef __UBOOT__
|
||||
@@ -165,8 +202,14 @@ int ubifs_decompress(const struct ubifs_info *c, const void *in_buf,
|
||||
|
||||
compr = ubifs_compressors[compr_type];
|
||||
|
||||
if (unlikely(!compr)) {
|
||||
ubifs_err(c, "compression type %d is not compiled in", compr_type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(!compr->capi_name)) {
|
||||
ubifs_err(c, "%s compression is not compiled in", compr->name);
|
||||
ubifs_err(c, "%s compression is not compiled in",
|
||||
compr->name ? compr->name : "unknown");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -231,6 +274,12 @@ int __init ubifs_compressors_init(void)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
#if IS_ENABLED(CONFIG_ZSTD)
|
||||
err = compr_init(&zstd_compr);
|
||||
if (err)
|
||||
return err;
|
||||
#endif
|
||||
|
||||
err = compr_init(&none_compr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
Reference in New Issue
Block a user