summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am4
-rw-r--r--configure.ac23
-rw-r--r--include/mtd/ubifs-media.h2
-rw-r--r--ubifs-utils/Makemodule.am4
-rw-r--r--ubifs-utils/mkfs.ubifs/compr.c46
-rw-r--r--ubifs-utils/mkfs.ubifs/compr.h1
-rw-r--r--ubifs-utils/mkfs.ubifs/mkfs.ubifs.c12
-rw-r--r--ubifs-utils/mkfs.ubifs/mkfs.ubifs.h3
8 files changed, 87 insertions, 8 deletions
diff --git a/Makefile.am b/Makefile.am
index 1bc4684..aacf589 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -10,6 +10,10 @@ if WITHOUT_LZO
AM_CPPFLAGS += -DWITHOUT_LZO
endif
+if WITHOUT_ZSTD
+AM_CPPFLAGS += -DWITHOUT_ZSTD
+endif
+
if WITH_SELINUX
AM_CPPFLAGS += -DWITH_SELINUX
endif
diff --git a/configure.ac b/configure.ac
index 1f862ec..b64841c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -66,6 +66,7 @@ need_pthread="no"
need_uuid="no"
need_zlib="no"
need_lzo="no"
+need_zstd="no"
need_xattr="no"
need_cmocka="no"
need_selinux="no"
@@ -138,6 +139,7 @@ AM_COND_IF([BUILD_UBIFS], [
need_xattr="yes"
need_zlib="yes"
need_lzo="yes"
+ need_zstd="yes"
need_openssl="yes"
])
@@ -164,6 +166,14 @@ AC_ARG_WITH([lzo],
*) AC_MSG_ERROR([bad value ${withval} for --without-lzo]) ;;
esac])
+AC_ARG_WITH([zstd],
+ [AS_HELP_STRING([--without-zstd], [Disable support for ZSTD compression])],
+ [case "${withval}" in
+ yes) ;;
+ no) need_zstd="no" ;;
+ *) AC_MSG_ERROR([bad value ${withval} for --without-zstd]) ;;
+ esac])
+
AC_ARG_WITH([selinux],
[AS_HELP_STRING([--with-selinux],
[Enable support for selinux extended attributes])],
@@ -189,6 +199,7 @@ pthread_missing="no"
uuid_missing="no"
zlib_missing="no"
lzo_missing="no"
+zstd_missing="no"
xattr_missing="no"
cmocka_missing="no"
selinux_missing="no"
@@ -225,6 +236,10 @@ if test "x$need_lzo" = "xyes"; then
)
fi
+if test "x$need_zstd" = "xyes"; then
+ PKG_CHECK_MODULES([ZSTD], [libzstd],, zstd_missing="yes")
+fi
+
if test "x$need_xattr" = "xyes"; then
AC_CHECK_HEADERS([sys/xattr.h], [], [xattr_missing="yes"])
AC_CHECK_HEADERS([sys/acl.h], [], [xattr_missing="yes"])
@@ -283,6 +298,13 @@ if test "x$lzo_missing" = "xyes"; then
dep_missing="yes"
fi
+if test "x$zstd_missing" = "xyes"; then
+ AC_MSG_WARN([cannot find ZSTD library required for mkfs program])
+ AC_MSG_NOTICE([mtd-utils can optionally be built without mkfs.ubifs])
+ AC_MSG_NOTICE([mtd-utils can optionally be built without ZSTD support])
+ dep_missing="yes"
+fi
+
if test "x$xattr_missing" = "xyes"; then
AC_MSG_WARN([cannot find headers for extended attributes])
AC_MSG_WARN([disabling XATTR support])
@@ -314,6 +336,7 @@ fi
##### generate output #####
AM_CONDITIONAL([WITHOUT_LZO], [test "x$need_lzo" != "xyes"])
+AM_CONDITIONAL([WITHOUT_ZSTD], [test "x$need_zstd" != "xyes"])
AM_CONDITIONAL([WITHOUT_XATTR], [test "x$need_xattr" != "xyes"])
AM_CONDITIONAL([WITH_SELINUX], [test "x$need_selinux" == "xyes"])
AM_CONDITIONAL([WITH_CRYPTO], [test "x$need_openssl" == "xyes"])
diff --git a/include/mtd/ubifs-media.h b/include/mtd/ubifs-media.h
index e69ba16..7751ac7 100644
--- a/include/mtd/ubifs-media.h
+++ b/include/mtd/ubifs-media.h
@@ -343,12 +343,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,
};
diff --git a/ubifs-utils/Makemodule.am b/ubifs-utils/Makemodule.am
index b8e4075..164ce09 100644
--- a/ubifs-utils/Makemodule.am
+++ b/ubifs-utils/Makemodule.am
@@ -22,8 +22,8 @@ mkfs_ubifs_SOURCES += ubifs-utils/mkfs.ubifs/crypto.c \
ubifs-utils/mkfs.ubifs/fscrypt.c
endif
-mkfs_ubifs_LDADD = libmtd.a libubi.a $(ZLIB_LIBS) $(LZO_LIBS) $(UUID_LIBS) $(LIBSELINUX_LIBS) $(OPENSSL_LIBS) -lm
-mkfs_ubifs_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_CFLAGS) $(LZO_CFLAGS) $(UUID_CFLAGS) $(LIBSELINUX_CFLAGS)\
+mkfs_ubifs_LDADD = libmtd.a libubi.a $(ZLIB_LIBS) $(LZO_LIBS) $(ZSTD_LIBS) $(UUID_LIBS) $(LIBSELINUX_LIBS) $(OPENSSL_LIBS) -lm
+mkfs_ubifs_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_CFLAGS) $(LZO_CFLAGS) $(ZSTD_CFLAGS) $(UUID_CFLAGS) $(LIBSELINUX_CFLAGS)\
-I$(top_srcdir)/ubi-utils/include -I$(top_srcdir)/ubifs-utils/mkfs.ubifs/
UBIFS_BINS = \
diff --git a/ubifs-utils/mkfs.ubifs/compr.c b/ubifs-utils/mkfs.ubifs/compr.c
index 8eff186..6239835 100644
--- a/ubifs-utils/mkfs.ubifs/compr.c
+++ b/ubifs-utils/mkfs.ubifs/compr.c
@@ -28,6 +28,9 @@
#include <lzo/lzo1x.h>
#endif
#include <linux/types.h>
+#ifndef WITHOUT_ZSTSD
+#include <zstd.h>
+#endif
#define crc32 __zlib_crc32
#include <zlib.h>
@@ -109,6 +112,25 @@ static int lzo_compress(void *in_buf, size_t in_len, void *out_buf,
}
#endif
+#ifndef WITHOUT_ZSTD
+static ZSTD_CCtx *zctx;
+
+static int zstd_compress(void *in_buf, size_t in_len, void *out_buf,
+ size_t *out_len)
+{
+ size_t ret;
+
+ ret = ZSTD_compressCCtx(zctx, out_buf, *out_len, in_buf, in_len,
+ ZSTD_CLEVEL_DEFAULT);
+ if (ZSTD_isError(ret)) {
+ errcnt += 1;
+ return -1;
+ }
+ *out_len = ret;
+ return 0;
+}
+#endif
+
static int no_compress(void *in_buf, size_t in_len, void *out_buf,
size_t *out_len)
{
@@ -192,6 +214,11 @@ int compress_data(void *in_buf, size_t in_len, void *out_buf, size_t *out_len,
case MKFS_UBIFS_COMPR_ZLIB:
ret = zlib_deflate(in_buf, in_len, out_buf, out_len);
break;
+#ifndef WITHOUT_ZSTD
+ case MKFS_UBIFS_COMPR_ZSTD:
+ ret = zstd_compress(in_buf, in_len, out_buf, out_len);
+ break;
+#endif
case MKFS_UBIFS_COMPR_NONE:
ret = 1;
break;
@@ -219,18 +246,29 @@ int init_compression(void)
#endif
zlib_buf = malloc(UBIFS_BLOCK_SIZE * WORST_COMPR_FACTOR);
- if (!zlib_buf) {
- free(lzo_mem);
- return -1;
- }
+ if (!zlib_buf)
+ goto err;
+
+#ifndef WITHOUT_ZSTD
+ zctx = ZSTD_createCCtx();
+ if (!zctx)
+ goto err;
+#endif
return 0;
+err:
+ free(zlib_buf);
+ free(lzo_mem);
+ return -1;
}
void destroy_compression(void)
{
free(zlib_buf);
free(lzo_mem);
+#ifndef WITHOUT_ZSTD
+ ZSTD_freeCCtx(zctx);
+#endif
if (errcnt)
fprintf(stderr, "%llu compression errors occurred\n", errcnt);
}
diff --git a/ubifs-utils/mkfs.ubifs/compr.h b/ubifs-utils/mkfs.ubifs/compr.h
index e3dd95c..d58c7c7 100644
--- a/ubifs-utils/mkfs.ubifs/compr.h
+++ b/ubifs-utils/mkfs.ubifs/compr.h
@@ -36,6 +36,7 @@ enum compression_type
MKFS_UBIFS_COMPR_NONE,
MKFS_UBIFS_COMPR_LZO,
MKFS_UBIFS_COMPR_ZLIB,
+ MKFS_UBIFS_COMPR_ZSTD,
};
int compress_data(void *in_buf, size_t in_len, void *out_buf, size_t *out_len,
diff --git a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
index 4b31979..6d8e55d 100644
--- a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
+++ b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
@@ -35,6 +35,10 @@
#include <selinux/label.h>
#endif
+#ifndef WITHOUT_ZSTD
+#include <zstd.h>
+#endif
+
#include "crypto.h"
#include "fscrypt.h"
@@ -209,8 +213,8 @@ static const char *helptext =
"-o, --output=FILE output to FILE\n"
"-j, --jrn-size=SIZE journal size\n"
"-R, --reserved=SIZE how much space should be reserved for the super-user\n"
-"-x, --compr=TYPE compression type - \"lzo\", \"favor_lzo\", \"zlib\" or\n"
-" \"none\" (default: \"lzo\")\n"
+"-x, --compr=TYPE compression type - \"lzo\", \"favor_lzo\", \"zlib\"\n"
+" \"zstd\" or \"none\" (default: \"lzo\")\n"
"-X, --favor-percent may only be used with favor LZO compression and defines\n"
" how many percent better zlib should compress to make\n"
" mkfs.ubifs use zlib instead of LZO (default 20%)\n"
@@ -654,6 +658,10 @@ static int get_options(int argc, char**argv)
c->default_compr = UBIFS_COMPR_NONE;
else if (strcmp(optarg, "zlib") == 0)
c->default_compr = UBIFS_COMPR_ZLIB;
+#ifndef WITHOUT_ZSTD
+ else if (strcmp(optarg, "zstd") == 0)
+ c->default_compr = UBIFS_COMPR_ZSTD;
+#endif
#ifndef WITHOUT_LZO
else if (strcmp(optarg, "favor_lzo") == 0) {
c->default_compr = UBIFS_COMPR_LZO;
diff --git a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.h b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.h
index 8f01860..f1425c5 100644
--- a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.h
+++ b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.h
@@ -77,6 +77,9 @@
#if MKFS_UBIFS_COMPR_ZLIB != UBIFS_COMPR_ZLIB
#error MKFS_UBIFS_COMPR_ZLIB != UBIFS_COMPR_ZLIB
#endif
+#if MKFS_UBIFS_COMPR_ZSTD != UBIFS_COMPR_ZSTD
+#error MKFS_UBIFS_COMPR_ZSTD != UBIFS_COMPR_ZSTD
+#endif
extern int verbose;
extern int debug_level;