On Mon, Apr 22, 2024 at 07:31:32PM +0800, Yifan Zhao wrote: > Currently fsck skips file extraction if it finds that EROFS_MAP_MAPPED > is unset, which is not the case for chunk-based files with hole. This > patch handles the corner case correctly. > > Signed-off-by: Yifan Zhao <zhaoyi...@sjtu.edu.cn>
I will apply the following version: >From 56e2f73cec3fa45d8b1dd1e9ec571b1f075d2275 Mon Sep 17 00:00:00 2001 From: Yifan Zhao <zhaoyi...@sjtu.edu.cn> Date: Mon, 22 Apr 2024 19:31:32 +0800 Subject: [PATCH] erofs-utils: fsck: extract chunk-based file with hole correctly Currently fsck skips file extraction if it finds that EROFS_MAP_MAPPED is unset, which is not the case for chunk-based files with holes. This patch handles the corner case correctly. Signed-off-by: Yifan Zhao <zhaoyi...@sjtu.edu.cn> Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- fsck/main.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fsck/main.c b/fsck/main.c index e5c37be..4dcb49d 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -470,9 +470,18 @@ static int erofs_verify_inode_data(struct erofs_inode *inode, int outfd) pos += map.m_llen; /* should skip decomp? */ - if (!(map.m_flags & EROFS_MAP_MAPPED) || !fsckcfg.check_decomp) + if (map.m_la >= inode->i_size || !fsckcfg.check_decomp) continue; + if (outfd >= 0 && !(map.m_flags & EROFS_MAP_MAPPED)) { + ret = lseek(outfd, map.m_llen, SEEK_CUR); + if (ret < 0) { + ret = -errno; + goto out; + } + continue; + } + if (map.m_plen > Z_EROFS_PCLUSTER_MAX_SIZE) { if (compressed) { erofs_err("invalid pcluster size %" PRIu64 " @ offset %" PRIu64 " of nid %" PRIu64, -- 2.30.2