Source kernel commit: 914fa861e3d7803c9bbafc229652c2a69edb8b60 Signed-off-by: Gao Xiang <hsiang...@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