On Mon, 6 Mar 2023 17:00:25 +0800 Gao Xiang <[email protected]> wrote:
> On 2023/3/6 16:54, Yue Hu wrote: > > From: Yue Hu <[email protected]> > > > > Keep in sync with the kernel commit 999f2f9a63f4 ("erofs: get rid of > > z_erofs_do_map_blocks() forward declaration"). > > Does z_erofs_do_map_blocks() already keep in sync with the kernel > implementation? Anyway, it's just another question indepentently > to this patch. Ok, let me correct the message in v2. > > > > > Signed-off-by: Yue Hu <[email protected]> > > --- > > lib/zmap.c | 156 ++++++++++++++++++++++++++--------------------------- > > 1 file changed, 76 insertions(+), 80 deletions(-) > > > > diff --git a/lib/zmap.c b/lib/zmap.c > > index 69b468d..3c665f8 100644 > > --- a/lib/zmap.c > > +++ b/lib/zmap.c > > @@ -10,10 +10,6 @@ > > #include "erofs/io.h" > > #include "erofs/print.h" > > > > -static int z_erofs_do_map_blocks(struct erofs_inode *vi, > > - struct erofs_map_blocks *map, > > - int flags); > > - > > int z_erofs_fill_inode(struct erofs_inode *vi) > > { > > if (!erofs_sb_has_big_pcluster() && > > @@ -29,82 +25,6 @@ int z_erofs_fill_inode(struct erofs_inode *vi) > > return 0; > > } > > > > -static int z_erofs_fill_inode_lazy(struct erofs_inode *vi) > > -{ > > - int ret; > > - erofs_off_t pos; > > - struct z_erofs_map_header *h; > > - char buf[sizeof(struct z_erofs_map_header)]; > > - > > - if (vi->flags & EROFS_I_Z_INITED) > > - return 0; > > - > > - pos = round_up(iloc(vi->nid) + vi->inode_isize + vi->xattr_isize, 8); > > - ret = dev_read(0, buf, pos, sizeof(buf)); > > - if (ret < 0) > > - return -EIO; > > - > > - h = (struct z_erofs_map_header *)buf; > > - /* > > - * if the highest bit of the 8-byte map header is set, the whole file > > - * is stored in the packed inode. The rest bits keeps z_fragmentoff. > > - */ > > - if (h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT) { > > - vi->z_advise = Z_EROFS_ADVISE_FRAGMENT_PCLUSTER; > > - vi->fragmentoff = le64_to_cpu(*(__le64 *)h) ^ (1ULL << 63); > > - vi->z_tailextent_headlcn = 0; > > - goto out; > > - } > > - > > - vi->z_advise = le16_to_cpu(h->h_advise); > > - vi->z_algorithmtype[0] = h->h_algorithmtype & 15; > > - vi->z_algorithmtype[1] = h->h_algorithmtype >> 4; > > - > > - if (vi->z_algorithmtype[0] >= Z_EROFS_COMPRESSION_MAX) { > > - erofs_err("unknown compression format %u for nid %llu", > > - vi->z_algorithmtype[0], (unsigned long long)vi->nid); > > - return -EOPNOTSUPP; > > - } > > - > > - vi->z_logical_clusterbits = LOG_BLOCK_SIZE + (h->h_clusterbits & 7); > > - if (vi->datalayout == EROFS_INODE_FLAT_COMPRESSION && > > - !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1) ^ > > - !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_2)) { > > - erofs_err("big pcluster head1/2 of compact indexes should be > > consistent for nid %llu", > > - vi->nid * 1ULL); > > - return -EFSCORRUPTED; > > - } > > - > > - if (vi->z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER) { > > - struct erofs_map_blocks map = { .index = UINT_MAX }; > > - > > - vi->idata_size = le16_to_cpu(h->h_idata_size); > > - ret = z_erofs_do_map_blocks(vi, &map, > > - EROFS_GET_BLOCKS_FINDTAIL); > > - if (!map.m_plen || > > - erofs_blkoff(map.m_pa) + map.m_plen > EROFS_BLKSIZ) { > > - erofs_err("invalid tail-packing pclustersize %llu", > > - map.m_plen | 0ULL); > > - return -EFSCORRUPTED; > > - } > > - if (ret < 0) > > - return ret; > > - } > > - if (vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER && > > - !(h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT)) { > > - struct erofs_map_blocks map = { .index = UINT_MAX }; > > - > > - vi->fragmentoff = le32_to_cpu(h->h_fragmentoff); > > - ret = z_erofs_do_map_blocks(vi, &map, > > - EROFS_GET_BLOCKS_FINDTAIL); > > - if (ret < 0) > > - return ret; > > - } > > -out: > > - vi->flags |= EROFS_I_Z_INITED; > > - return 0; > > -} > > - > > struct z_erofs_maprecorder { > > struct erofs_inode *inode; > > struct erofs_map_blocks *map; > > @@ -675,6 +595,82 @@ out: > > return err; > > } > > > > +static int z_erofs_fill_inode_lazy(struct erofs_inode *vi) > > +{ > > + int ret; > > + erofs_off_t pos; > > + struct z_erofs_map_header *h; > > + char buf[sizeof(struct z_erofs_map_header)]; > > + > > + if (vi->flags & EROFS_I_Z_INITED) > > + return 0; > > + > > + pos = round_up(iloc(vi->nid) + vi->inode_isize + vi->xattr_isize, 8); > > + ret = dev_read(0, buf, pos, sizeof(buf)); > > + if (ret < 0) > > + return -EIO; > > + > > + h = (struct z_erofs_map_header *)buf; > > + /* > > + * if the highest bit of the 8-byte map header is set, the whole file > > + * is stored in the packed inode. The rest bits keeps z_fragmentoff. > > + */ > > + if (h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT) { > > + vi->z_advise = Z_EROFS_ADVISE_FRAGMENT_PCLUSTER; > > + vi->fragmentoff = le64_to_cpu(*(__le64 *)h) ^ (1ULL << 63); > > + vi->z_tailextent_headlcn = 0; > > + goto out; > > + } > > + > > + vi->z_advise = le16_to_cpu(h->h_advise); > > + vi->z_algorithmtype[0] = h->h_algorithmtype & 15; > > + vi->z_algorithmtype[1] = h->h_algorithmtype >> 4; > > + > > + if (vi->z_algorithmtype[0] >= Z_EROFS_COMPRESSION_MAX) { > > + erofs_err("unknown compression format %u for nid %llu", > > + vi->z_algorithmtype[0], (unsigned long long)vi->nid); > > + return -EOPNOTSUPP; > > + } > > + > > + vi->z_logical_clusterbits = LOG_BLOCK_SIZE + (h->h_clusterbits & 7); > > + if (vi->datalayout == EROFS_INODE_FLAT_COMPRESSION && > > + !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1) ^ > > + !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_2)) { > > + erofs_err("big pcluster head1/2 of compact indexes should be > > consistent for nid %llu", > > + vi->nid * 1ULL); > > + return -EFSCORRUPTED; > > + } > > + > > + if (vi->z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER) { > > + struct erofs_map_blocks map = { .index = UINT_MAX }; > > + > > + vi->idata_size = le16_to_cpu(h->h_idata_size); > > + ret = z_erofs_do_map_blocks(vi, &map, > > + EROFS_GET_BLOCKS_FINDTAIL); > > + if (!map.m_plen || > > + erofs_blkoff(map.m_pa) + map.m_plen > EROFS_BLKSIZ) { > > + erofs_err("invalid tail-packing pclustersize %llu", > > + map.m_plen | 0ULL); > > + return -EFSCORRUPTED; > > + } > > + if (ret < 0) > > + return ret; > > + } > > + if (vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER && > > + !(h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT)) { > > + struct erofs_map_blocks map = { .index = UINT_MAX }; > > + > > + vi->fragmentoff = le32_to_cpu(h->h_fragmentoff); > > + ret = z_erofs_do_map_blocks(vi, &map, > > + EROFS_GET_BLOCKS_FINDTAIL); > > + if (ret < 0) > > + return ret; > > + } > > +out: > > + vi->flags |= EROFS_I_Z_INITED; > > + return 0; > > +} > > + > > int z_erofs_map_blocks_iter(struct erofs_inode *vi, > > struct erofs_map_blocks *map, > > int flags)
