[PATCH v2 3/4] erofs-utils: add erofs_read_metadata() helper
Jingbo Xu
jefflexu at linux.alibaba.com
Wed Aug 16 15:39:18 AEST 2023
On 8/16/23 11:58 AM, Gao Xiang wrote:
>
>
> On 2023/8/16 11:49, Jingbo Xu wrote:
>> Add erofs_read_metadata() helper reading variable-sized metadata from
>> inode specified by @nid. Read from meta inode if @nid is 0.
>>
>> Signed-off-by: Jingbo Xu <jefflexu at linux.alibaba.com>
>> ---
>> include/erofs/internal.h | 2 +
>> lib/data.c | 84 ++++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 86 insertions(+)
>>
>> diff --git a/include/erofs/internal.h b/include/erofs/internal.h
>> index a04e6a6..3e7319d 100644
>> --- a/include/erofs/internal.h
>> +++ b/include/erofs/internal.h
>> @@ -364,6 +364,8 @@ int erofs_read_one_data(struct erofs_inode *inode,
>> struct erofs_map_blocks *map,
>> int z_erofs_read_one_data(struct erofs_inode *inode,
>> struct erofs_map_blocks *map, char *raw, char *buffer,
>> erofs_off_t skip, erofs_off_t length, bool trimmed);
>> +void *erofs_read_metadata(struct erofs_sb_info *sbi, erofs_nid_t nid,
>> + erofs_off_t *offset, int *lengthp);
>> static inline int erofs_get_occupied_size(const struct erofs_inode
>> *inode,
>> erofs_off_t *size)
>> diff --git a/lib/data.c b/lib/data.c
>> index a172bb5..3ec5330 100644
>> --- a/lib/data.c
>> +++ b/lib/data.c
>> @@ -372,3 +372,87 @@ int erofs_pread(struct erofs_inode *inode, char
>> *buf,
>> }
>> return -EINVAL;
>> }
>> +
>> +static void *erofs_read_meta(struct erofs_sb_info *sbi, erofs_nid_t nid,
>> + erofs_off_t *offset, int *lengthp)
>
> erofs_read_metadata_nid?
Okay.
>
>> +{
>> + struct erofs_inode vi = { .sbi = sbi, .nid = nid };
>> + __le16 __len;
>> + int ret, len;
>> + char *buffer;
>> +
>> + ret = erofs_read_inode_from_disk(&vi);
>> + if (ret)
>> + return ERR_PTR(ret);
>> +
>> + *offset = round_up(*offset, 4);
>> + ret = erofs_pread(&vi, (void *)&__len, sizeof(__le16), *offset);
>> + if (ret)
>> + return ERR_PTR(ret);
>> +
>> + len = le16_to_cpu(__len);
>> + if (!len)
>> + return ERR_PTR(-EFSCORRUPTED);
>> +
>> + buffer = malloc(len);
>> + if (!buffer)
>> + return ERR_PTR(-ENOMEM);
>> + *offset += sizeof(__le16);
>> + *lengthp = len;
>> +
>> + ret = erofs_pread(&vi, buffer, len, *offset);
>> + if (ret) {
>> + free(buffer);
>> + return ERR_PTR(ret);
>> + }
>> + *offset += len;
>> + return buffer;
>> +}
>> +
>> +static void *erofs_read_metainode(struct erofs_sb_info *sbi,
>> + erofs_off_t *offset, int *lengthp)
>
> erofs_read_metadata_bdi?
Okay.
--
Thanks,
Jingbo
More information about the Linux-erofs
mailing list