When rebuilding from upper to lower, a whiteout below an already recreated directory should keep that directory but stop older lower entries from being merged into it.
Mark the existing directory opaque before applying the generic non-directory bailout. Reported-by: cayoub-oai <[email protected]> Closes: https://github.com/erofs/erofs-utils/issues/49 Assisted-by: Codex:GPT-5.5 Signed-off-by: Yifan Zhao <[email protected]> --- lib/rebuild.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/rebuild.c b/lib/rebuild.c index 51dfe18..108a464 100644 --- a/lib/rebuild.c +++ b/lib/rebuild.c @@ -401,7 +401,13 @@ static int erofs_rebuild_dirent_iter(struct erofs_dir_context *ctx) .nid = ctx->de_nid }; ret = erofs_read_inode_from_disk(&src); - if (ret || !S_ISDIR(src.i_mode)) + if (ret) + goto out; + if (erofs_inode_is_whiteout(&src)) { + d->inode->opaque = true; + goto out; + } + if (!S_ISDIR(src.i_mode)) goto out; mergedir = d->inode; inode = dir = &src; -- 2.47.3
