Complete filesystem UUID feature on userspace side. Cc: Chao Yu <yuch...@huawei.com> Cc: Li Guifu <bluce.ligu...@huawei.com> Signed-off-by: Gao Xiang <gaoxian...@huawei.com> --- changes since v1: - drop feature_compat since kernel side can already parse UUID from erofs superblock.
configure.ac | 18 ++++++++++++++++++ include/erofs/internal.h | 1 + mkfs/Makefile.am | 3 ++- mkfs/main.c | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index a93767f61578..c4d3af6a3a43 100644 --- a/configure.ac +++ b/configure.ac @@ -54,6 +54,10 @@ AC_ARG_ENABLE(lz4, [AS_HELP_STRING([--disable-lz4], [disable LZ4 compression support @<:@default=enabled@:>@])], [enable_lz4="$enableval"], [enable_lz4="yes"]) +AC_ARG_WITH(uuid, + [AS_HELP_STRING([--without-uuid], + [Ignore presence of libuuid and disable uuid support @<:@default=enabled@:>@])]) + # Checks for libraries. # Use customized LZ4 library path when specified. AC_ARG_WITH(lz4-incdir, @@ -172,6 +176,20 @@ fi AM_CONDITIONAL([ENABLE_LZ4], [test "x${have_lz4}" = "xyes"]) AM_CONDITIONAL([ENABLE_LZ4HC], [test "x${have_lz4hc}" = "xyes"]) +# Configure libuuid +AS_IF([test "x$with_uuid" != "xno"], + [PKG_CHECK_MODULES([libuuid], [uuid], + [have_uuid=yes], [have_uuid=no])], + [have_uuid=no] +) + +AS_IF([test "x$have_uuid" = "xyes"], + [AC_DEFINE([HAVE_LIBUUID], 1, [Define to 1 if libuuid is found])], + [AS_IF([test "x$with_uuid" = "xyes"], + [AC_MSG_ERROR([uuid support requested but libuuid not found])] + )] +) + AC_CONFIG_FILES([Makefile man/Makefile lib/Makefile diff --git a/include/erofs/internal.h b/include/erofs/internal.h index 9e2bb9ce33b6..e13adda12257 100644 --- a/include/erofs/internal.h +++ b/include/erofs/internal.h @@ -56,6 +56,7 @@ struct erofs_sb_info { u32 feature_incompat; u64 build_time; u32 build_time_nsec; + u8 uuid[16]; }; /* global sbi */ diff --git a/mkfs/Makefile.am b/mkfs/Makefile.am index 257f86422bae..9ce06d654d3d 100644 --- a/mkfs/Makefile.am +++ b/mkfs/Makefile.am @@ -3,7 +3,8 @@ AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = mkfs.erofs +AM_CPPFLAGS = ${libuuid_CFLAGS} mkfs_erofs_SOURCES = main.c mkfs_erofs_CFLAGS = -Wall -Werror -I$(top_srcdir)/include -mkfs_erofs_LDADD = $(top_builddir)/lib/liberofs.la +mkfs_erofs_LDADD = $(top_builddir)/lib/liberofs.la ${libuuid_LIBS} diff --git a/mkfs/main.c b/mkfs/main.c index 9187c43ed671..7493a481be82 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -22,6 +22,10 @@ #include "erofs/compress.h" #include "erofs/xattr.h" +#ifdef HAVE_LIBUUID +#include <uuid/uuid.h> +#endif + #define EROFS_SUPER_END (EROFS_SUPER_OFFSET + sizeof(struct erofs_super_block)) static struct option long_options[] = { @@ -234,6 +238,7 @@ int erofs_mkfs_update_super_block(struct erofs_buffer_head *bh, *blocks = erofs_mapbh(NULL, true); sb.blocks = cpu_to_le32(*blocks); sb.root_nid = cpu_to_le16(root_nid); + memcpy(sb.uuid, sbi.uuid, sizeof(sb.uuid)); buf = calloc(sb_blksize, 1); if (!buf) { @@ -305,6 +310,20 @@ static int erofs_mkfs_superblock_csum_set(void) return 0; } +static void erofs_mkfs_generate_uuid(void) +{ + char uuid_str[37] = "not available"; + +#ifdef HAVE_LIBUUID + do { + uuid_generate(sbi.uuid); + } while (uuid_is_null(sbi.uuid)); + + uuid_unparse_lower(sbi.uuid, uuid_str); +#endif + erofs_info("filesystem UUID: %s", uuid_str); +} + int main(int argc, char **argv) { int err = 0; @@ -376,6 +395,7 @@ int main(int argc, char **argv) goto exit; } + erofs_mkfs_generate_uuid(); erofs_inode_manager_init(); err = erofs_build_shared_xattrs_from_path(cfg.c_src_path); -- 2.17.1