@@ -15,11 +15,11 @@ static void *erofs_read_inode(struct erofs_buf *buf,
15
15
struct erofs_sb_info * sbi = EROFS_SB (sb );
16
16
struct erofs_inode * vi = EROFS_I (inode );
17
17
const erofs_off_t inode_loc = erofs_iloc (inode );
18
-
19
18
erofs_blk_t blkaddr , nblks = 0 ;
20
19
void * kaddr ;
21
20
struct erofs_inode_compact * dic ;
22
21
struct erofs_inode_extended * die , * copied = NULL ;
22
+ union erofs_inode_i_u iu ;
23
23
unsigned int ifmt ;
24
24
int err ;
25
25
@@ -35,17 +35,16 @@ static void *erofs_read_inode(struct erofs_buf *buf,
35
35
36
36
dic = kaddr + * ofs ;
37
37
ifmt = le16_to_cpu (dic -> i_format );
38
-
39
38
if (ifmt & ~EROFS_I_ALL ) {
40
- erofs_err (inode -> i_sb , "unsupported i_format %u of nid %llu" ,
39
+ erofs_err (sb , "unsupported i_format %u of nid %llu" ,
41
40
ifmt , vi -> nid );
42
41
err = - EOPNOTSUPP ;
43
42
goto err_out ;
44
43
}
45
44
46
45
vi -> datalayout = erofs_inode_datalayout (ifmt );
47
46
if (vi -> datalayout >= EROFS_INODE_DATALAYOUT_MAX ) {
48
- erofs_err (inode -> i_sb , "unsupported datalayout %u of nid %llu" ,
47
+ erofs_err (sb , "unsupported datalayout %u of nid %llu" ,
49
48
vi -> datalayout , vi -> nid );
50
49
err = - EOPNOTSUPP ;
51
50
goto err_out ;
@@ -82,40 +81,15 @@ static void *erofs_read_inode(struct erofs_buf *buf,
82
81
vi -> xattr_isize = erofs_xattr_ibody_size (die -> i_xattr_icount );
83
82
84
83
inode -> i_mode = le16_to_cpu (die -> i_mode );
85
- switch (inode -> i_mode & S_IFMT ) {
86
- case S_IFREG :
87
- case S_IFDIR :
88
- case S_IFLNK :
89
- vi -> raw_blkaddr = le32_to_cpu (die -> i_u .raw_blkaddr );
90
- break ;
91
- case S_IFCHR :
92
- case S_IFBLK :
93
- inode -> i_rdev =
94
- new_decode_dev (le32_to_cpu (die -> i_u .rdev ));
95
- break ;
96
- case S_IFIFO :
97
- case S_IFSOCK :
98
- inode -> i_rdev = 0 ;
99
- break ;
100
- default :
101
- goto bogusimode ;
102
- }
84
+ iu = die -> i_u ;
103
85
i_uid_write (inode , le32_to_cpu (die -> i_uid ));
104
86
i_gid_write (inode , le32_to_cpu (die -> i_gid ));
105
87
set_nlink (inode , le32_to_cpu (die -> i_nlink ));
106
-
107
- /* extended inode has its own timestamp */
88
+ /* each extended inode has its own timestamp */
108
89
inode_set_ctime (inode , le64_to_cpu (die -> i_mtime ),
109
90
le32_to_cpu (die -> i_mtime_nsec ));
110
91
111
92
inode -> i_size = le64_to_cpu (die -> i_size );
112
-
113
- /* total blocks for compressed files */
114
- if (erofs_inode_is_data_compressed (vi -> datalayout ))
115
- nblks = le32_to_cpu (die -> i_u .compressed_blocks );
116
- else if (vi -> datalayout == EROFS_INODE_CHUNK_BASED )
117
- /* fill chunked inode summary info */
118
- vi -> chunkformat = le16_to_cpu (die -> i_u .c .format );
119
93
kfree (copied );
120
94
copied = NULL ;
121
95
break ;
@@ -125,49 +99,51 @@ static void *erofs_read_inode(struct erofs_buf *buf,
125
99
vi -> xattr_isize = erofs_xattr_ibody_size (dic -> i_xattr_icount );
126
100
127
101
inode -> i_mode = le16_to_cpu (dic -> i_mode );
128
- switch (inode -> i_mode & S_IFMT ) {
129
- case S_IFREG :
130
- case S_IFDIR :
131
- case S_IFLNK :
132
- vi -> raw_blkaddr = le32_to_cpu (dic -> i_u .raw_blkaddr );
133
- break ;
134
- case S_IFCHR :
135
- case S_IFBLK :
136
- inode -> i_rdev =
137
- new_decode_dev (le32_to_cpu (dic -> i_u .rdev ));
138
- break ;
139
- case S_IFIFO :
140
- case S_IFSOCK :
141
- inode -> i_rdev = 0 ;
142
- break ;
143
- default :
144
- goto bogusimode ;
145
- }
102
+ iu = dic -> i_u ;
146
103
i_uid_write (inode , le16_to_cpu (dic -> i_uid ));
147
104
i_gid_write (inode , le16_to_cpu (dic -> i_gid ));
148
105
set_nlink (inode , le16_to_cpu (dic -> i_nlink ));
149
-
150
106
/* use build time for compact inodes */
151
107
inode_set_ctime (inode , sbi -> build_time , sbi -> build_time_nsec );
152
108
153
109
inode -> i_size = le32_to_cpu (dic -> i_size );
154
- if (erofs_inode_is_data_compressed (vi -> datalayout ))
155
- nblks = le32_to_cpu (dic -> i_u .compressed_blocks );
156
- else if (vi -> datalayout == EROFS_INODE_CHUNK_BASED )
157
- vi -> chunkformat = le16_to_cpu (dic -> i_u .c .format );
158
110
break ;
159
111
default :
160
- erofs_err (inode -> i_sb ,
161
- "unsupported on-disk inode version %u of nid %llu" ,
112
+ erofs_err (sb , "unsupported on-disk inode version %u of nid %llu" ,
162
113
erofs_inode_version (ifmt ), vi -> nid );
163
114
err = - EOPNOTSUPP ;
164
115
goto err_out ;
165
116
}
166
117
167
- if (vi -> datalayout == EROFS_INODE_CHUNK_BASED ) {
118
+ switch (inode -> i_mode & S_IFMT ) {
119
+ case S_IFREG :
120
+ case S_IFDIR :
121
+ case S_IFLNK :
122
+ vi -> raw_blkaddr = le32_to_cpu (iu .raw_blkaddr );
123
+ break ;
124
+ case S_IFCHR :
125
+ case S_IFBLK :
126
+ inode -> i_rdev = new_decode_dev (le32_to_cpu (iu .rdev ));
127
+ break ;
128
+ case S_IFIFO :
129
+ case S_IFSOCK :
130
+ inode -> i_rdev = 0 ;
131
+ break ;
132
+ default :
133
+ erofs_err (sb , "bogus i_mode (%o) @ nid %llu" , inode -> i_mode ,
134
+ vi -> nid );
135
+ err = - EFSCORRUPTED ;
136
+ goto err_out ;
137
+ }
138
+
139
+ /* total blocks for compressed files */
140
+ if (erofs_inode_is_data_compressed (vi -> datalayout )) {
141
+ nblks = le32_to_cpu (iu .compressed_blocks );
142
+ } else if (vi -> datalayout == EROFS_INODE_CHUNK_BASED ) {
143
+ /* fill chunked inode summary info */
144
+ vi -> chunkformat = le16_to_cpu (iu .c .format );
168
145
if (vi -> chunkformat & ~EROFS_CHUNK_FORMAT_ALL ) {
169
- erofs_err (inode -> i_sb ,
170
- "unsupported chunk format %x of nid %llu" ,
146
+ erofs_err (sb , "unsupported chunk format %x of nid %llu" ,
171
147
vi -> chunkformat , vi -> nid );
172
148
err = - EOPNOTSUPP ;
173
149
goto err_out ;
@@ -191,10 +167,6 @@ static void *erofs_read_inode(struct erofs_buf *buf,
191
167
inode -> i_blocks = nblks << (sb -> s_blocksize_bits - 9 );
192
168
return kaddr ;
193
169
194
- bogusimode :
195
- erofs_err (inode -> i_sb , "bogus i_mode (%o) @ nid %llu" ,
196
- inode -> i_mode , vi -> nid );
197
- err = - EFSCORRUPTED ;
198
170
err_out :
199
171
DBG_BUGON (1 );
200
172
kfree (copied );
0 commit comments