@@ -31,10 +31,10 @@ static int erofs_read_inode(struct inode *inode)
3131 unsigned int ofs = erofs_blkoff (sb , erofs_iloc (inode ));
3232 struct erofs_buf buf = __EROFS_BUF_INITIALIZER ;
3333 struct erofs_sb_info * sbi = EROFS_SB (sb );
34+ erofs_blk_t addrmask = BIT_ULL (48 ) - 1 ;
3435 struct erofs_inode * vi = EROFS_I (inode );
3536 struct erofs_inode_extended * die , copied ;
3637 struct erofs_inode_compact * dic ;
37- union erofs_inode_i_u iu ;
3838 unsigned int ifmt ;
3939 void * ptr ;
4040 int err = 0 ;
@@ -71,6 +71,8 @@ static int erofs_read_inode(struct inode *inode)
7171 if (ofs + vi -> inode_isize <= sb -> s_blocksize ) {
7272 ofs += vi -> inode_isize ;
7373 die = (struct erofs_inode_extended * )dic ;
74+ copied .i_u = die -> i_u ;
75+ copied .i_nb = die -> i_nb ;
7476 } else {
7577 const unsigned int gotten = sb -> s_blocksize - ofs ;
7678
@@ -90,7 +92,6 @@ static int erofs_read_inode(struct inode *inode)
9092 vi -> xattr_isize = erofs_xattr_ibody_size (die -> i_xattr_icount );
9193
9294 inode -> i_mode = le16_to_cpu (die -> i_mode );
93- iu = die -> i_u ;
9495 i_uid_write (inode , le32_to_cpu (die -> i_uid ));
9596 i_gid_write (inode , le32_to_cpu (die -> i_gid ));
9697 set_nlink (inode , le32_to_cpu (die -> i_nlink ));
@@ -105,11 +106,20 @@ static int erofs_read_inode(struct inode *inode)
105106 vi -> xattr_isize = erofs_xattr_ibody_size (dic -> i_xattr_icount );
106107
107108 inode -> i_mode = le16_to_cpu (dic -> i_mode );
108- iu = dic -> i_u ;
109+ copied . i_u = dic -> i_u ;
109110 i_uid_write (inode , le16_to_cpu (dic -> i_uid ));
110111 i_gid_write (inode , le16_to_cpu (dic -> i_gid ));
111- set_nlink (inode , le16_to_cpu (dic -> i_nb .nlink ));
112- inode_set_mtime (inode , sbi -> build_time , sbi -> build_time_nsec );
112+ if (!S_ISDIR (inode -> i_mode ) &&
113+ ((ifmt >> EROFS_I_NLINK_1_BIT ) & 1 )) {
114+ set_nlink (inode , 1 );
115+ copied .i_nb = dic -> i_nb ;
116+ } else {
117+ set_nlink (inode , le16_to_cpu (dic -> i_nb .nlink ));
118+ copied .i_nb .startblk_hi = 0 ;
119+ addrmask = BIT_ULL (32 ) - 1 ;
120+ }
121+ inode_set_mtime (inode , sbi -> epoch + le32_to_cpu (dic -> i_mtime ),
122+ sbi -> fixed_nsec );
113123
114124 inode -> i_size = le32_to_cpu (dic -> i_size );
115125 break ;
@@ -129,7 +139,12 @@ static int erofs_read_inode(struct inode *inode)
129139 case S_IFREG :
130140 case S_IFDIR :
131141 case S_IFLNK :
132- vi -> startblk = le32_to_cpu (iu .startblk_lo );
142+ vi -> startblk = le32_to_cpu (copied .i_u .startblk_lo ) |
143+ ((u64 )le16_to_cpu (copied .i_nb .startblk_hi ) << 32 );
144+ if (vi -> datalayout == EROFS_INODE_FLAT_PLAIN &&
145+ !((vi -> startblk ^ EROFS_NULL_ADDR ) & addrmask ))
146+ vi -> startblk = EROFS_NULL_ADDR ;
147+
133148 if (S_ISLNK (inode -> i_mode )) {
134149 err = erofs_fill_symlink (inode , ptr , ofs );
135150 if (err )
@@ -138,7 +153,7 @@ static int erofs_read_inode(struct inode *inode)
138153 break ;
139154 case S_IFCHR :
140155 case S_IFBLK :
141- inode -> i_rdev = new_decode_dev (le32_to_cpu (iu .rdev ));
156+ inode -> i_rdev = new_decode_dev (le32_to_cpu (copied . i_u .rdev ));
142157 break ;
143158 case S_IFIFO :
144159 case S_IFSOCK :
@@ -152,14 +167,14 @@ static int erofs_read_inode(struct inode *inode)
152167 }
153168
154169 if (erofs_inode_is_data_compressed (vi -> datalayout ))
155- inode -> i_blocks = le32_to_cpu (iu .blocks_lo ) <<
170+ inode -> i_blocks = le32_to_cpu (copied . i_u .blocks_lo ) <<
156171 (sb -> s_blocksize_bits - 9 );
157172 else
158173 inode -> i_blocks = round_up (inode -> i_size , sb -> s_blocksize ) >> 9 ;
159174
160175 if (vi -> datalayout == EROFS_INODE_CHUNK_BASED ) {
161176 /* fill chunked inode summary info */
162- vi -> chunkformat = le16_to_cpu (iu .c .format );
177+ vi -> chunkformat = le16_to_cpu (copied . i_u .c .format );
163178 if (vi -> chunkformat & ~EROFS_CHUNK_FORMAT_ALL ) {
164179 erofs_err (sb , "unsupported chunk format %x of nid %llu" ,
165180 vi -> chunkformat , vi -> nid );
0 commit comments