[PATCH 07/13] erofs-utils: lib: add erofs_read_xattrs_from_disk() helper
Jingbo Xu
jefflexu at linux.alibaba.com
Mon Aug 14 16:59:03 AEST 2023
On 8/14/23 2:46 PM, Gao Xiang wrote:
>
>
> On 2023/8/14 11:42, Jingbo Xu wrote:
>> Add erofs_read_xattrs_from_disk() helper to read extended attributes
>> from disk.
>>
>> Signed-off-by: Jingbo Xu <jefflexu at linux.alibaba.com>
>> ---
>> include/erofs/xattr.h | 1 +
>> lib/xattr.c | 76 +++++++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 77 insertions(+)
>>
>> diff --git a/include/erofs/xattr.h b/include/erofs/xattr.h
>> index dc27cf6..634daf9 100644
>> --- a/include/erofs/xattr.h
>> +++ b/include/erofs/xattr.h
>> @@ -85,6 +85,7 @@ int erofs_xattr_write_name_prefixes(struct
>> erofs_sb_info *sbi, FILE *f);
>> int erofs_setxattr(struct erofs_inode *inode, char *key,
>> const void *value, size_t size);
>> +int erofs_read_xattrs_from_disk(struct erofs_inode *inode);
>> #ifdef __cplusplus
>> }
>> diff --git a/lib/xattr.c b/lib/xattr.c
>> index 12f580e..8d8f9f0 100644
>> --- a/lib/xattr.c
>> +++ b/lib/xattr.c
>> @@ -493,6 +493,82 @@ int erofs_scan_file_xattrs(struct erofs_inode
>> *inode)
>> return erofs_droid_xattr_set_caps(inode);
>> }
>> +static struct xattr_item *erofs_read_xattr_from_disk(struct
>> erofs_inode *inode,
>> + char *key)
>> +{
>> + ssize_t ret;
>> + u8 prefix;
>> + u16 prefixlen;
>> + unsigned int len[2];
>> + char *kvbuf;
>> +
>> + if (!match_prefix(key, &prefix, &prefixlen))
>> + return ERR_PTR(-ENODATA);
>> +
>> + ret = erofs_getxattr(inode, key, NULL, 0);
>> + if (ret < 0)
>> + return ERR_PTR(-errno);
>> +
>> + /* allocate key-value buffer */
>> + len[0] = strlen(key) - prefixlen;
>> + len[1] = ret;
>> + kvbuf = malloc(len[0] + len[1]);
>> + if (!kvbuf)
>> + return ERR_PTR(-ENOMEM);
>> + memcpy(kvbuf, key + prefixlen, len[0]);
>> + if (len[1]) {
>> + ret = erofs_getxattr(inode, key, kvbuf + len[0], len[1]);
>> + if (ret < 0) {
>> + free(kvbuf);
>> + return ERR_PTR(-errno);
>> + }
>> + if (ret != len[1]) {
>> + erofs_err("size of xattr value got changed just now (%u->
>> %ld)",
>> + len[1], (long)ret);
>> + len[1] = ret;
>> + }
>
> Can this actually happen? Maybe just:
> DBG_BUGON(ret != len[1]);
Make sense.
--
Thanks,
Jingbo
More information about the Linux-erofs
mailing list