[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