[PATCH 1/2] erofs-utils: get rid of z_erofs_do_map_blocks() forward declaration
Yue Hu
zbestahu at gmail.com
Mon Mar 6 20:25:39 AEDT 2023
On Mon, 6 Mar 2023 17:00:25 +0800
Gao Xiang <hsiangkao at linux.alibaba.com> wrote:
> On 2023/3/6 16:54, Yue Hu wrote:
> > From: Yue Hu <huyue2 at coolpad.com>
> >
> > 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 <huyue2 at coolpad.com>
> > ---
> > 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)
More information about the Linux-erofs
mailing list