[PATCH 1/2] erofs-utils: get rid of z_erofs_do_map_blocks() forward declaration
Gao Xiang
hsiangkao at linux.alibaba.com
Mon Mar 6 20:24:53 AEDT 2023
On 2023/3/6 17:25, Yue Hu wrote:
> 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.
Nope, you just need to submit a new patch to sync these.
>
>>
>>>
>>> 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