[PATCH 1/2] erofs-utils: lib: simplify erofs_read_inode_from_disk()

Gao Xiang hsiangkao at linux.alibaba.com
Thu Mar 6 04:39:28 AEDT 2025


Source kernel commit: 914fa861e3d7803c9bbafc229652c2a69edb8b60

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/namei.c | 77 ++++++++++++++++++-----------------------------------
 1 file changed, 26 insertions(+), 51 deletions(-)

diff --git a/lib/namei.c b/lib/namei.c
index eec1f5c..b40f092 100644
--- a/lib/namei.c
+++ b/lib/namei.c
@@ -26,14 +26,13 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi)
 {
 	int ret, ifmt;
 	char buf[sizeof(struct erofs_inode_extended)];
+	erofs_off_t inode_loc = erofs_iloc(vi);
 	struct erofs_sb_info *sbi = vi->sbi;
 	struct erofs_inode_compact *dic;
 	struct erofs_inode_extended *die;
-	erofs_off_t inode_loc;
+	union erofs_inode_i_u iu;
 
 	DBG_BUGON(!sbi);
-	inode_loc = erofs_iloc(vi);
-
 	ret = erofs_dev_read(sbi, 0, buf, inode_loc, sizeof(*dic));
 	if (ret < 0)
 		return -EIO;
@@ -61,26 +60,7 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi)
 		vi->xattr_isize = erofs_xattr_ibody_size(die->i_xattr_icount);
 		vi->i_mode = le16_to_cpu(die->i_mode);
 		vi->i_ino[0] = le32_to_cpu(die->i_ino);
-
-		switch (vi->i_mode & S_IFMT) {
-		case S_IFREG:
-		case S_IFDIR:
-		case S_IFLNK:
-			vi->u.i_blkaddr = le32_to_cpu(die->i_u.raw_blkaddr);
-			break;
-		case S_IFCHR:
-		case S_IFBLK:
-			vi->u.i_rdev =
-				erofs_new_decode_dev(le32_to_cpu(die->i_u.rdev));
-			break;
-		case S_IFIFO:
-		case S_IFSOCK:
-			vi->u.i_rdev = 0;
-			break;
-		default:
-			goto bogusimode;
-		}
-
+		iu = die->i_u;
 		vi->i_uid = le32_to_cpu(die->i_uid);
 		vi->i_gid = le32_to_cpu(die->i_gid);
 		vi->i_nlink = le32_to_cpu(die->i_nlink);
@@ -88,35 +68,13 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi)
 		vi->i_mtime = le64_to_cpu(die->i_mtime);
 		vi->i_mtime_nsec = le64_to_cpu(die->i_mtime_nsec);
 		vi->i_size = le64_to_cpu(die->i_size);
-		if (vi->datalayout == EROFS_INODE_CHUNK_BASED)
-			/* fill chunked inode summary info */
-			vi->u.chunkformat = le16_to_cpu(die->i_u.c.format);
 		break;
 	case EROFS_INODE_LAYOUT_COMPACT:
 		vi->inode_isize = sizeof(struct erofs_inode_compact);
 		vi->xattr_isize = erofs_xattr_ibody_size(dic->i_xattr_icount);
 		vi->i_mode = le16_to_cpu(dic->i_mode);
 		vi->i_ino[0] = le32_to_cpu(dic->i_ino);
-
-		switch (vi->i_mode & S_IFMT) {
-		case S_IFREG:
-		case S_IFDIR:
-		case S_IFLNK:
-			vi->u.i_blkaddr = le32_to_cpu(dic->i_u.raw_blkaddr);
-			break;
-		case S_IFCHR:
-		case S_IFBLK:
-			vi->u.i_rdev =
-				erofs_new_decode_dev(le32_to_cpu(dic->i_u.rdev));
-			break;
-		case S_IFIFO:
-		case S_IFSOCK:
-			vi->u.i_rdev = 0;
-			break;
-		default:
-			goto bogusimode;
-		}
-
+		iu = dic->i_u;
 		vi->i_uid = le16_to_cpu(dic->i_uid);
 		vi->i_gid = le16_to_cpu(dic->i_gid);
 		vi->i_nlink = le16_to_cpu(dic->i_nlink);
@@ -125,8 +83,6 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi)
 		vi->i_mtime_nsec = sbi->build_time_nsec;
 
 		vi->i_size = le32_to_cpu(dic->i_size);
-		if (vi->datalayout == EROFS_INODE_CHUNK_BASED)
-			vi->u.chunkformat = le16_to_cpu(dic->i_u.c.format);
 		break;
 	default:
 		erofs_err("unsupported on-disk inode version %u of nid %llu",
@@ -134,8 +90,30 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi)
 		return -EOPNOTSUPP;
 	}
 
+	switch (vi->i_mode & S_IFMT) {
+	case S_IFREG:
+	case S_IFDIR:
+	case S_IFLNK:
+		vi->u.i_blkaddr = le32_to_cpu(iu.raw_blkaddr);
+		break;
+	case S_IFCHR:
+	case S_IFBLK:
+		vi->u.i_rdev = erofs_new_decode_dev(le32_to_cpu(iu.rdev));
+		break;
+	case S_IFIFO:
+	case S_IFSOCK:
+		vi->u.i_rdev = 0;
+		break;
+	default:
+		erofs_err("bogus i_mode (%o) @ nid %llu", vi->i_mode,
+			  vi->nid | 0ULL);
+		return -EFSCORRUPTED;
+	}
+
 	vi->flags = 0;
 	if (vi->datalayout == EROFS_INODE_CHUNK_BASED) {
+		/* fill chunked inode summary info */
+		vi->u.chunkformat = le16_to_cpu(iu.c.format);
 		if (vi->u.chunkformat & ~EROFS_CHUNK_FORMAT_ALL) {
 			erofs_err("unsupported chunk format %x of nid %llu",
 				  vi->u.chunkformat, vi->nid | 0ULL);
@@ -145,9 +123,6 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi)
 			(vi->u.chunkformat & EROFS_CHUNK_FORMAT_BLKBITS_MASK);
 	}
 	return 0;
-bogusimode:
-	erofs_err("bogus i_mode (%o) @ nid %llu", vi->i_mode, vi->nid | 0ULL);
-	return -EFSCORRUPTED;
 }
 
 struct erofs_dirent *find_target_dirent(erofs_nid_t pnid,
-- 
2.43.5



More information about the Linux-erofs mailing list