[PATCH 2/2] erofs-utils: rebuild: set the appropriate `dev` field for dirs
Gao Xiang
hsiangkao at linux.alibaba.com
Wed Nov 27 20:31:28 AEDT 2024
On 2024/11/27 17:28, Hongzhen Luo wrote:
> Currently, setting a default `dev` value (i.e., 0) for directories
> during parsing tar files can lead to the following error:
>
> <E> erofs: bogus i_mode (0) @ nid 0
> <E> erofs: failed to read inode @ 0
>
> Consider the following incremental build scenario, where the path
> "dir1/dir2" is currently being parsed in tarerofs_parse_tar() and
> the directory "dir1" has never appeared before. erofs_rebuild_get_dentry()
> will call erofs_rebuild_mkdir() to allocate a new inode for "dir1",
> with its `dev` field set to 0 by default.
>
> During the dump tree phase, since `dir1->dev` matches `sbi->dev` (both are 0),
> erofs_rebuild_load_basedir() will be called to read the contents of directory
> "dir1" from the disk. However, since there is no information for the new directory
> "dir1" on the disk, the above error occurs.
>
> This patch resolves the above issue by setting the appropriate value
> for the directory's `dev` field during the tar file parsing phase.
>
> Fixes: f64d9d02576b ("erofs-utils: introduce incremental builds")
> Signed-off-by: Hongzhen Luo <hongzhen at linux.alibaba.com>
> ---
> include/erofs/rebuild.h | 1 +
> lib/rebuild.c | 7 +++++--
> lib/tar.c | 2 ++
> 3 files changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/include/erofs/rebuild.h b/include/erofs/rebuild.h
> index b37bc80e8a3c..b71cfdf1fff4 100644
> --- a/include/erofs/rebuild.h
> +++ b/include/erofs/rebuild.h
> @@ -22,6 +22,7 @@ struct erofs_rebuild_getdentry_ctx {
> bool *whout;
> bool *opq;
> bool to_head;
> + int dev;
> };
>
> struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_rebuild_getdentry_ctx *ctx);
> diff --git a/lib/rebuild.c b/lib/rebuild.c
> index 58f1701b3721..3fcb5c92b562 100644
> --- a/lib/rebuild.c
> +++ b/lib/rebuild.c
> @@ -27,7 +27,7 @@
> #endif
>
> static struct erofs_dentry *erofs_rebuild_mkdir(struct erofs_inode *dir,
> - const char *s)
> + const char *s, int dev)
> {
> struct erofs_inode *inode;
> struct erofs_dentry *d;
> @@ -47,6 +47,7 @@ static struct erofs_dentry *erofs_rebuild_mkdir(struct erofs_inode *dir,
> inode->i_gid = getgid();
> inode->i_mtime = inode->sbi->build_time;
> inode->i_mtime_nsec = inode->sbi->build_time_nsec;
> + inode->dev = dev;
Why not just use inode->dir->dev?
Thanks,
Gao Xiang
More information about the Linux-erofs
mailing list