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)  

Reply via email to