Hi Xiang, On Wed, 4 Jan 2023 10:48:40 +0800 Xiang Gao <[email protected]> wrote:
> Hi Yue, > > ?? 2022/12/24 17:43, Yue Hu ????: > > From: Yue Hu <[email protected]> > > > > Add compressed fragments support for fsck.erofs. > > > > Signed-off-by: Yue Hu <[email protected]> > > --- > > fsck/main.c | 41 +++++++++++++++++++++++++++++++++++++++-- > > lib/zmap.c | 1 + > > 2 files changed, 40 insertions(+), 2 deletions(-) > > > > diff --git a/fsck/main.c b/fsck/main.c > > index 2a9c501..9babc61 100644 > > --- a/fsck/main.c > > +++ b/fsck/main.c > > @@ -421,6 +421,31 @@ static int erofs_verify_inode_data(struct erofs_inode > > *inode, int outfd) > > if (!(map.m_flags & EROFS_MAP_MAPPED) || !fsckcfg.check_decomp) > > continue; > > > > + if (map.m_flags & EROFS_MAP_FRAGMENT) { > > + struct erofs_inode packed_inode = { > > + .nid = sbi.packed_nid, > > + }; > > Sorry for late response. > > a question... why don't we just rely on z_erofs_read_data()? We may fall back to uncompressed mode for packed inode due to 'ENOSPC'. > > > Thanks, > Gao Xiang > > > + > > + ret = erofs_read_inode_from_disk(&packed_inode); > > + if (ret) { > > + erofs_err("failed to read packed inode from > > disk"); > > + goto out; > > + } > > + > > + if (!buffer || map.m_llen > buffer_size) { > > + buffer_size = map.m_llen; > > + buffer = realloc(buffer, map.m_llen); > > + BUG_ON(!buffer); > > + } > > + ret = erofs_pread(&packed_inode, buffer, map.m_llen, > > + inode->fragmentoff); > > + if (ret) > > + goto out; > > + > > + compressed = true; /* force using buffer */ > > + goto write_outfd; > > + } > > + > > if (map.m_plen > raw_size) { > > raw_size = map.m_plen; > > raw = realloc(raw, raw_size); > > @@ -476,6 +501,7 @@ static int erofs_verify_inode_data(struct erofs_inode > > *inode, int outfd) > > } > > } > > > > +write_outfd: > > if (outfd >= 0 && write(outfd, compressed ? buffer : raw, > > map.m_llen) < 0) { > > erofs_err("I/O error occurred when verifying data chunk > > @ nid %llu", > > @@ -486,8 +512,9 @@ static int erofs_verify_inode_data(struct erofs_inode > > *inode, int outfd) > > } > > > > if (fsckcfg.print_comp_ratio) { > > - fsckcfg.logical_blocks += BLK_ROUND_UP(inode->i_size); > > fsckcfg.physical_blocks += BLK_ROUND_UP(pchunk_len); > > + if (!erofs_is_packed_inode(inode)) > > + fsckcfg.logical_blocks += BLK_ROUND_UP(inode->i_size); > > } > > out: > > if (raw) > > @@ -732,6 +759,8 @@ static int erofsfsck_check_inode(erofs_nid_t pnid, > > erofs_nid_t nid) > > ret = erofs_extract_dir(&inode); > > break; > > case S_IFREG: > > + if (erofs_is_packed_inode(&inode)) > > + goto verify; > > ret = erofs_extract_file(&inode); > > break; > > case S_IFLNK: > > @@ -767,7 +796,7 @@ verify: > > ret = erofs_iterate_dir(&ctx, true); > > } > > > > - if (!ret) > > + if (!ret && !erofs_is_packed_inode(&inode)) > > erofsfsck_set_attributes(&inode, fsckcfg.extract_path); > > > > if (ret == -ECANCELED) > > @@ -822,6 +851,14 @@ int main(int argc, char **argv) > > goto exit_put_super; > > } > > > > + if (erofs_sb_has_fragments()) { > > + err = erofsfsck_check_inode(sbi.packed_nid, sbi.packed_nid); > > + if (err) { > > + erofs_err("failed to verify packed file"); > > + goto exit_put_super; > > + } > > + } > > + > > err = erofsfsck_check_inode(sbi.root_nid, sbi.root_nid); > > if (fsckcfg.corrupted) { > > if (!fsckcfg.extract_path) > > diff --git a/lib/zmap.c b/lib/zmap.c > > index 41e0713..ca65038 100644 > > --- a/lib/zmap.c > > +++ b/lib/zmap.c > > @@ -639,6 +639,7 @@ static int z_erofs_do_map_blocks(struct erofs_inode *vi, > > map->m_plen = vi->z_idata_size; > > } else if (fragment && m.lcn == vi->z_tailextent_headlcn) { > > map->m_flags |= EROFS_MAP_FRAGMENT; > > + map->m_plen = 0; > > } else { > > map->m_pa = blknr_to_addr(m.pblk); > > err = z_erofs_get_extent_compressedlen(&m, initial_lcn);
