[PATCH v6 06/11] erofs-utils: lib: add erofs_rebuild_get_dentry() helper

Gao Xiang hsiangkao at linux.alibaba.com
Thu Sep 7 20:02:21 AEST 2023



On 2023/9/5 18:02, Jingbo Xu wrote:
> Rename tarerofs_get_dentry() to erofs_rebuild_get_dentry().
> 
> Also make `whout` and 'opq' parameter optional when `aufs` is false.
> 
> Signed-off-by: Jingbo Xu <jefflexu at linux.alibaba.com>
> ---
>   include/erofs/rebuild.h |  19 +++++++
>   lib/Makefile.am         |   3 +-
>   lib/rebuild.c           | 117 ++++++++++++++++++++++++++++++++++++++++
>   lib/tar.c               | 109 ++-----------------------------------
>   4 files changed, 141 insertions(+), 107 deletions(-)
>   create mode 100644 include/erofs/rebuild.h
>   create mode 100644 lib/rebuild.c
> 
> diff --git a/include/erofs/rebuild.h b/include/erofs/rebuild.h
> new file mode 100644
> index 0000000..92873c9
> --- /dev/null
> +++ b/include/erofs/rebuild.h
> @@ -0,0 +1,19 @@
> +/* SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0 */
> +#ifndef __EROFS_REBUILD_H
> +#define __EROFS_REBUILD_H
> +
> +#ifdef __cplusplus
> +extern "C"
> +{
> +#endif
> +
> +#include "internal.h"
> +
> +struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_inode *pwd,
> +		char *path, bool aufs, bool *whout, bool *opq);
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif
> diff --git a/lib/Makefile.am b/lib/Makefile.am
> index 3e09516..8a45bd6 100644
> --- a/lib/Makefile.am
> +++ b/lib/Makefile.am
> @@ -25,6 +25,7 @@ noinst_HEADERS = $(top_srcdir)/include/erofs_fs.h \
>         $(top_srcdir)/include/erofs/compress_hints.h \
>         $(top_srcdir)/include/erofs/fragments.h \
>         $(top_srcdir)/include/erofs/xxhash.h \
> +      $(top_srcdir)/include/erofs/rebuild.h \
>         $(top_srcdir)/lib/liberofs_private.h
>   
>   noinst_HEADERS += compressor.h
> @@ -32,7 +33,7 @@ liberofs_la_SOURCES = config.c io.c cache.c super.c inode.c xattr.c exclude.c \
>   		      namei.c data.c compress.c compressor.c zmap.c decompress.c \
>   		      compress_hints.c hashmap.c sha256.c blobchunk.c dir.c \
>   		      fragments.c rb_tree.c dedupe.c uuid_unparse.c uuid.c tar.c \
> -		      block_list.c xxhash.c
> +		      block_list.c xxhash.c rebuild.c
>   
>   liberofs_la_CFLAGS = -Wall ${libuuid_CFLAGS} -I$(top_srcdir)/include
>   if ENABLE_LZ4
> diff --git a/lib/rebuild.c b/lib/rebuild.c
> new file mode 100644
> index 0000000..7aaa071
> --- /dev/null
> +++ b/lib/rebuild.c
> @@ -0,0 +1,117 @@
> +// SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0
> +#define _GNU_SOURCE
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include "erofs/print.h"
> +#include "erofs/inode.h"
> +#include "erofs/rebuild.h"
> +#include "erofs/internal.h"
> +
> +#ifdef HAVE_LINUX_AUFS_TYPE_H
> +#include <linux/aufs_type.h>
> +#else
> +#define AUFS_WH_PFX		".wh."
> +#define AUFS_DIROPQ_NAME	AUFS_WH_PFX ".opq"
> +#define AUFS_WH_DIROPQ		AUFS_WH_PFX AUFS_DIROPQ_NAME
> +#endif
> +
> +static struct erofs_dentry *erofs_rebuild_mkdir(struct erofs_inode *dir,
> +						const char *s)
> +{
> +	struct erofs_inode *inode;
> +	struct erofs_dentry *d;
> +
> +	inode = erofs_new_inode();
> +	if (IS_ERR(inode))
> +		return ERR_CAST(inode);
> +
> +	inode->i_mode = S_IFDIR | 0755;
> +	inode->i_parent = dir;
> +	inode->i_uid = getuid();
> +	inode->i_gid = getgid();
> +	inode->i_mtime = inode->sbi->build_time;
> +	inode->i_mtime_nsec = inode->sbi->build_time_nsec;
> +	erofs_init_empty_dir(inode);
> +
> +	d = erofs_d_alloc(dir, s);
> +	if (!IS_ERR(d)) {
> +		d->type = EROFS_FT_DIR;
> +		d->inode = inode;
> +	}
> +	return d;
> +}
> +
> +struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_inode *pwd,
> +		char *path, bool aufs, bool *whout, bool *opq)
> +{
> +	struct erofs_dentry *d = NULL;
> +	unsigned int len = strlen(path);
> +	char *s = path;
> +
> +	if (aufs) {
> +		*whout = false;
> +		*opq = false;
> +	}

I'd suggest adding a boolean dumb instead here, otherwise
it looks good to me.

Thanks,
Gao Xiang


More information about the Linux-erofs mailing list