[PATCH 8/9] erofs-utils: lib: switch erofs_bread() to passing offset instead of block number
Gao Xiang
hsiangkao at linux.alibaba.com
Thu Dec 25 05:31:30 AEDT 2025
Source kernel commit: 469ad583c1293f5d9f45183050b3beeb4a8c3475
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
lib/xattr.c | 37 +++++++++++++------------------------
1 file changed, 13 insertions(+), 24 deletions(-)
diff --git a/lib/xattr.c b/lib/xattr.c
index 5624311fdbba..6598845ed46d 100644
--- a/lib/xattr.c
+++ b/lib/xattr.c
@@ -1108,7 +1108,6 @@ struct erofs_xattr_iter {
static int erofs_init_inode_xattrs(struct erofs_inode *vi)
{
struct erofs_sb_info *sbi = vi->sbi;
- int blkmask = erofs_blksiz(sbi) - 1;
struct erofs_xattr_iter it;
unsigned int i;
struct erofs_xattr_ibody_header *ih;
@@ -1144,12 +1143,11 @@ static int erofs_init_inode_xattrs(struct erofs_inode *vi)
it.pos = erofs_iloc(vi) + vi->inode_isize;
/* read in shared xattr array (non-atomic, see kmalloc below) */
- it.kaddr = erofs_bread(&it.buf, it.pos & ~blkmask, true);
+ it.kaddr = erofs_bread(&it.buf, it.pos, true);
if (IS_ERR(it.kaddr))
return PTR_ERR(it.kaddr);
- ih = it.kaddr + erofs_blkoff(sbi, it.pos);
-
+ ih = it.kaddr;
vi->xattr_shared_count = ih->h_shared_count;
vi->xattr_shared_xattrs = malloc(vi->xattr_shared_count * sizeof(uint));
if (!vi->xattr_shared_xattrs) {
@@ -1161,14 +1159,13 @@ static int erofs_init_inode_xattrs(struct erofs_inode *vi)
it.pos += sizeof(struct erofs_xattr_ibody_header);
for (i = 0; i < vi->xattr_shared_count; ++i) {
- it.kaddr = erofs_bread(&it.buf, it.pos & ~blkmask, true);
+ it.kaddr = erofs_bread(&it.buf, it.pos, true);
if (IS_ERR(it.kaddr)) {
free(vi->xattr_shared_xattrs);
vi->xattr_shared_xattrs = NULL;
return PTR_ERR(it.kaddr);
}
- vi->xattr_shared_xattrs[i] = le32_to_cpu(*(__le32 *)
- (it.kaddr + erofs_blkoff(sbi, it.pos)));
+ vi->xattr_shared_xattrs[i] = le32_to_cpu(*(__le32 *)it.kaddr);
it.pos += sizeof(__le32);
}
erofs_put_metabuf(&it.buf);
@@ -1181,15 +1178,14 @@ static int erofs_xattr_copy_to_buffer(struct erofs_xattr_iter *it,
{
unsigned int slice, processed;
struct erofs_sb_info *sbi = it->sbi;
- int blkmask = erofs_blksiz(sbi) - 1;
void *src;
for (processed = 0; processed < len; processed += slice) {
- it->kaddr = erofs_bread(&it->buf, it->pos & ~blkmask, true);
+ it->kaddr = erofs_bread(&it->buf, it->pos, true);
if (IS_ERR(it->kaddr))
return PTR_ERR(it->kaddr);
- src = it->kaddr + erofs_blkoff(sbi, it->pos);
+ src = it->kaddr;
slice = min_t(unsigned int, erofs_blksiz(sbi) -
erofs_blkoff(sbi, it->pos), len - processed);
memcpy(it->buffer + it->buffer_ofs, src, slice);
@@ -1207,8 +1203,7 @@ static int erofs_listxattr_foreach(struct erofs_xattr_iter *it)
int err;
/* 1. handle xattr entry */
- entry = *(struct erofs_xattr_entry *)
- (it->kaddr + erofs_blkoff(it->sbi, it->pos));
+ entry = *(struct erofs_xattr_entry *)it->kaddr;
it->pos += sizeof(struct erofs_xattr_entry);
base_index = entry.e_name_index;
@@ -1254,13 +1249,11 @@ static int erofs_listxattr_foreach(struct erofs_xattr_iter *it)
static int erofs_getxattr_foreach(struct erofs_xattr_iter *it)
{
struct erofs_sb_info *sbi = it->sbi;
- int blkmask = erofs_blksiz(sbi) - 1;
struct erofs_xattr_entry entry;
unsigned int slice, processed, value_sz;
/* 1. handle xattr entry */
- entry = *(struct erofs_xattr_entry *)
- (it->kaddr + erofs_blkoff(sbi, it->pos));
+ entry = *(struct erofs_xattr_entry *)it->kaddr;
it->pos += sizeof(struct erofs_xattr_entry);
value_sz = le16_to_cpu(entry.e_value_size);
@@ -1290,7 +1283,7 @@ static int erofs_getxattr_foreach(struct erofs_xattr_iter *it)
/* 2. handle xattr name */
for (processed = 0; processed < entry.e_name_len; processed += slice) {
- it->kaddr = erofs_bread(&it->buf, it->pos & ~blkmask, true);
+ it->kaddr = erofs_bread(&it->buf, it->pos, true);
if (IS_ERR(it->kaddr))
return PTR_ERR(it->kaddr);
@@ -1298,7 +1291,7 @@ static int erofs_getxattr_foreach(struct erofs_xattr_iter *it)
erofs_blksiz(sbi) - erofs_blkoff(sbi, it->pos),
entry.e_name_len - processed);
if (memcmp(it->name + it->infix_len + processed,
- it->kaddr + erofs_blkoff(sbi, it->pos), slice))
+ it->kaddr, slice))
return -ENOATTR;
it->pos += slice;
}
@@ -1318,8 +1311,6 @@ static int erofs_getxattr_foreach(struct erofs_xattr_iter *it)
static int erofs_xattr_iter_inline(struct erofs_xattr_iter *it,
struct erofs_inode *vi, bool getxattr)
{
- struct erofs_sb_info *sbi = vi->sbi;
- int blkmask = erofs_blksiz(sbi) - 1;
unsigned int xattr_header_sz, remaining, entry_sz;
erofs_off_t next_pos;
int ret;
@@ -1334,12 +1325,11 @@ static int erofs_xattr_iter_inline(struct erofs_xattr_iter *it,
remaining = vi->xattr_isize - xattr_header_sz;
it->pos = erofs_iloc(vi) + vi->inode_isize + xattr_header_sz;
while (remaining) {
- it->kaddr = erofs_bread(&it->buf, it->pos & ~blkmask, true);
+ it->kaddr = erofs_bread(&it->buf, it->pos, true);
if (IS_ERR(it->kaddr))
return PTR_ERR(it->kaddr);
- entry_sz = erofs_xattr_entry_size(it->kaddr +
- erofs_blkoff(it->sbi, it->pos));
+ entry_sz = erofs_xattr_entry_size(it->kaddr);
/* xattr on-disk corruption: xattr entry beyond xattr_isize */
if (remaining < entry_sz) {
DBG_BUGON(1);
@@ -1370,8 +1360,7 @@ static int erofs_xattr_iter_shared(struct erofs_xattr_iter *it,
for (i = 0; i < vi->xattr_shared_count; ++i) {
it->pos = erofs_pos(sbi, sbi->xattr_blkaddr) +
vi->xattr_shared_xattrs[i] * sizeof(__le32);
- it->kaddr = erofs_bread(&it->buf,
- it->pos & ~(erofs_blksiz(sbi) - 1), true);
+ it->kaddr = erofs_bread(&it->buf, it->pos, true);
if (IS_ERR(it->kaddr))
return PTR_ERR(it->kaddr);
--
2.43.5
More information about the Linux-erofs
mailing list