77#include <linux/security.h>
88#include "xattr.h"
99
10- static inline erofs_blk_t erofs_xattr_blkaddr (struct super_block * sb ,
11- unsigned int xattr_id )
12- {
13- return EROFS_SB (sb )-> xattr_blkaddr +
14- erofs_blknr (sb , xattr_id * sizeof (__u32 ));
15- }
16-
17- static inline unsigned int erofs_xattr_blkoff (struct super_block * sb ,
18- unsigned int xattr_id )
19- {
20- return erofs_blkoff (sb , xattr_id * sizeof (__u32 ));
21- }
22-
2310struct xattr_iter {
2411 struct super_block * sb ;
2512 struct erofs_buf buf ;
13+ erofs_off_t pos ;
2614 void * kaddr ;
27-
28- erofs_blk_t blkaddr ;
29- unsigned int ofs ;
3015};
3116
3217static int erofs_init_inode_xattrs (struct inode * inode )
@@ -82,17 +67,16 @@ static int erofs_init_inode_xattrs(struct inode *inode)
8267
8368 it .buf = __EROFS_BUF_INITIALIZER ;
8469 erofs_init_metabuf (& it .buf , sb );
85- it .blkaddr = erofs_blknr (sb , erofs_iloc (inode ) + vi -> inode_isize );
86- it .ofs = erofs_blkoff (sb , erofs_iloc (inode ) + vi -> inode_isize );
70+ it .pos = erofs_iloc (inode ) + vi -> inode_isize ;
8771
8872 /* read in shared xattr array (non-atomic, see kmalloc below) */
89- it .kaddr = erofs_bread (& it .buf , it .blkaddr , EROFS_KMAP );
73+ it .kaddr = erofs_bread (& it .buf , erofs_blknr ( sb , it .pos ) , EROFS_KMAP );
9074 if (IS_ERR (it .kaddr )) {
9175 ret = PTR_ERR (it .kaddr );
9276 goto out_unlock ;
9377 }
9478
95- ih = ( struct erofs_xattr_ibody_header * )( it .kaddr + it .ofs );
79+ ih = it .kaddr + erofs_blkoff ( sb , it .pos );
9680 vi -> xattr_shared_count = ih -> h_shared_count ;
9781 vi -> xattr_shared_xattrs = kmalloc_array (vi -> xattr_shared_count ,
9882 sizeof (uint ), GFP_KERNEL );
@@ -103,25 +87,20 @@ static int erofs_init_inode_xattrs(struct inode *inode)
10387 }
10488
10589 /* let's skip ibody header */
106- it .ofs += sizeof (struct erofs_xattr_ibody_header );
90+ it .pos += sizeof (struct erofs_xattr_ibody_header );
10791
10892 for (i = 0 ; i < vi -> xattr_shared_count ; ++ i ) {
109- if (it .ofs >= sb -> s_blocksize ) {
110- /* cannot be unaligned */
111- DBG_BUGON (it .ofs != sb -> s_blocksize );
112-
113- it .kaddr = erofs_bread (& it .buf , ++ it .blkaddr , EROFS_KMAP );
114- if (IS_ERR (it .kaddr )) {
115- kfree (vi -> xattr_shared_xattrs );
116- vi -> xattr_shared_xattrs = NULL ;
117- ret = PTR_ERR (it .kaddr );
118- goto out_unlock ;
119- }
120- it .ofs = 0 ;
93+ it .kaddr = erofs_bread (& it .buf , erofs_blknr (sb , it .pos ),
94+ EROFS_KMAP );
95+ if (IS_ERR (it .kaddr )) {
96+ kfree (vi -> xattr_shared_xattrs );
97+ vi -> xattr_shared_xattrs = NULL ;
98+ ret = PTR_ERR (it .kaddr );
99+ goto out_unlock ;
121100 }
122- vi -> xattr_shared_xattrs [i ] =
123- le32_to_cpu ( * ( __le32 * )( it .kaddr + it .ofs ));
124- it .ofs += sizeof (__le32 );
101+ vi -> xattr_shared_xattrs [i ] = le32_to_cpu ( * ( __le32 * )
102+ ( it .kaddr + erofs_blkoff ( sb , it .pos ) ));
103+ it .pos += sizeof (__le32 );
125104 }
126105 erofs_put_metabuf (& it .buf );
127106
@@ -150,24 +129,11 @@ struct xattr_iter_handlers {
150129 unsigned int len );
151130};
152131
153- static inline int xattr_iter_fixup (struct xattr_iter * it )
154- {
155- if (it -> ofs < it -> sb -> s_blocksize )
156- return 0 ;
157-
158- it -> blkaddr += erofs_blknr (it -> sb , it -> ofs );
159- it -> kaddr = erofs_bread (& it -> buf , it -> blkaddr , EROFS_KMAP );
160- if (IS_ERR (it -> kaddr ))
161- return PTR_ERR (it -> kaddr );
162- it -> ofs = erofs_blkoff (it -> sb , it -> ofs );
163- return 0 ;
164- }
165-
166132static int inline_xattr_iter_begin (struct xattr_iter * it ,
167133 struct inode * inode )
168134{
169135 struct erofs_inode * const vi = EROFS_I (inode );
170- unsigned int xattr_header_sz , inline_xattr_ofs ;
136+ unsigned int xattr_header_sz ;
171137
172138 xattr_header_sz = sizeof (struct erofs_xattr_ibody_header ) +
173139 sizeof (u32 ) * vi -> xattr_shared_count ;
@@ -176,39 +142,39 @@ static int inline_xattr_iter_begin(struct xattr_iter *it,
176142 return - ENOATTR ;
177143 }
178144
179- inline_xattr_ofs = vi -> inode_isize + xattr_header_sz ;
180-
181- it -> blkaddr = erofs_blknr (it -> sb , erofs_iloc (inode ) + inline_xattr_ofs );
182- it -> ofs = erofs_blkoff (it -> sb , erofs_iloc (inode ) + inline_xattr_ofs );
183- it -> kaddr = erofs_bread (& it -> buf , it -> blkaddr , EROFS_KMAP );
145+ it -> pos = erofs_iloc (inode ) + vi -> inode_isize + xattr_header_sz ;
146+ it -> kaddr = erofs_bread (& it -> buf , erofs_blknr (it -> sb , it -> pos ),
147+ EROFS_KMAP );
184148 if (IS_ERR (it -> kaddr ))
185149 return PTR_ERR (it -> kaddr );
186150 return vi -> xattr_isize - xattr_header_sz ;
187151}
188152
189153/*
190154 * Regardless of success or failure, `xattr_foreach' will end up with
191- * `ofs ' pointing to the next xattr item rather than an arbitrary position.
155+ * `pos ' pointing to the next xattr item rather than an arbitrary position.
192156 */
193157static int xattr_foreach (struct xattr_iter * it ,
194158 const struct xattr_iter_handlers * op ,
195159 unsigned int * tlimit )
196160{
197161 struct erofs_xattr_entry entry ;
162+ struct super_block * sb = it -> sb ;
198163 unsigned int value_sz , processed , slice ;
199164 int err ;
200165
201- /* 0. fixup blkaddr, ofs, ipage */
202- err = xattr_iter_fixup ( it );
203- if (err )
204- return err ;
166+ /* 0. fixup blkaddr, pos */
167+ it -> kaddr = erofs_bread ( & it -> buf , erofs_blknr ( sb , it -> pos ), EROFS_KMAP );
168+ if (IS_ERR ( it -> kaddr ) )
169+ return PTR_ERR ( it -> kaddr ) ;
205170
206171 /*
207172 * 1. read xattr entry to the memory,
208173 * since we do EROFS_XATTR_ALIGN
209174 * therefore entry should be in the page
210175 */
211- entry = * (struct erofs_xattr_entry * )(it -> kaddr + it -> ofs );
176+ entry = * (struct erofs_xattr_entry * )
177+ (it -> kaddr + erofs_blkoff (sb , it -> pos ));
212178 if (tlimit ) {
213179 unsigned int entry_sz = erofs_xattr_entry_size (& entry );
214180
@@ -220,40 +186,40 @@ static int xattr_foreach(struct xattr_iter *it,
220186 * tlimit -= entry_sz ;
221187 }
222188
223- it -> ofs += sizeof (struct erofs_xattr_entry );
189+ it -> pos += sizeof (struct erofs_xattr_entry );
224190 value_sz = le16_to_cpu (entry .e_value_size );
225191
226192 /* handle entry */
227193 err = op -> entry (it , & entry );
228194 if (err ) {
229- it -> ofs += entry .e_name_len + value_sz ;
195+ it -> pos += entry .e_name_len + value_sz ;
230196 goto out ;
231197 }
232198
233- /* 2. handle xattr name (ofs will finally be at the end of name) */
199+ /* 2. handle xattr name (pos will finally be at the end of name) */
234200 processed = 0 ;
235201
236202 while (processed < entry .e_name_len ) {
237- if (it -> ofs >= it -> sb -> s_blocksize ) {
238- DBG_BUGON (it -> ofs > it -> sb -> s_blocksize );
239-
240- err = xattr_iter_fixup (it );
241- if (err )
242- goto out ;
243- it -> ofs = 0 ;
203+ it -> kaddr = erofs_bread (& it -> buf , erofs_blknr (sb , it -> pos ),
204+ EROFS_KMAP );
205+ if (IS_ERR (it -> kaddr )) {
206+ err = PTR_ERR (it -> kaddr );
207+ goto out ;
244208 }
245209
246- slice = min_t (unsigned int , it -> sb -> s_blocksize - it -> ofs ,
210+ slice = min_t (unsigned int ,
211+ sb -> s_blocksize - erofs_blkoff (sb , it -> pos ),
247212 entry .e_name_len - processed );
248213
249214 /* handle name */
250- err = op -> name (it , processed , it -> kaddr + it -> ofs , slice );
215+ err = op -> name (it , processed ,
216+ it -> kaddr + erofs_blkoff (sb , it -> pos ), slice );
251217 if (err ) {
252- it -> ofs += entry .e_name_len - processed + value_sz ;
218+ it -> pos += entry .e_name_len - processed + value_sz ;
253219 goto out ;
254220 }
255221
256- it -> ofs += slice ;
222+ it -> pos += slice ;
257223 processed += slice ;
258224 }
259225
@@ -263,31 +229,31 @@ static int xattr_foreach(struct xattr_iter *it,
263229 if (op -> alloc_buffer ) {
264230 err = op -> alloc_buffer (it , value_sz );
265231 if (err ) {
266- it -> ofs += value_sz ;
232+ it -> pos += value_sz ;
267233 goto out ;
268234 }
269235 }
270236
271237 while (processed < value_sz ) {
272- if (it -> ofs >= it -> sb -> s_blocksize ) {
273- DBG_BUGON (it -> ofs > it -> sb -> s_blocksize );
274-
275- err = xattr_iter_fixup (it );
276- if (err )
277- goto out ;
278- it -> ofs = 0 ;
238+ it -> kaddr = erofs_bread (& it -> buf , erofs_blknr (sb , it -> pos ),
239+ EROFS_KMAP );
240+ if (IS_ERR (it -> kaddr )) {
241+ err = PTR_ERR (it -> kaddr );
242+ goto out ;
279243 }
280244
281- slice = min_t (unsigned int , it -> sb -> s_blocksize - it -> ofs ,
245+ slice = min_t (unsigned int ,
246+ sb -> s_blocksize - erofs_blkoff (sb , it -> pos ),
282247 value_sz - processed );
283- op -> value (it , processed , it -> kaddr + it -> ofs , slice );
284- it -> ofs += slice ;
248+ op -> value (it , processed , it -> kaddr + erofs_blkoff (sb , it -> pos ),
249+ slice );
250+ it -> pos += slice ;
285251 processed += slice ;
286252 }
287253
288254out :
289255 /* xattrs should be 4-byte aligned (on-disk constraint) */
290- it -> ofs = EROFS_XATTR_ALIGN (it -> ofs );
256+ it -> pos = EROFS_XATTR_ALIGN (it -> pos );
291257 return err < 0 ? err : 0 ;
292258}
293259
@@ -394,14 +360,15 @@ static int shared_getxattr(struct inode *inode, struct getxattr_iter *it)
394360{
395361 struct erofs_inode * const vi = EROFS_I (inode );
396362 struct super_block * const sb = it -> it .sb ;
397- unsigned int i , xsid ;
363+ struct erofs_sb_info * sbi = EROFS_SB (sb );
364+ unsigned int i ;
398365 int ret = - ENOATTR ;
399366
400367 for (i = 0 ; i < vi -> xattr_shared_count ; ++ i ) {
401- xsid = vi -> xattr_shared_xattrs [ i ];
402- it -> it . blkaddr = erofs_xattr_blkaddr ( sb , xsid );
403- it -> it .ofs = erofs_xattr_blkoff ( sb , xsid );
404- it -> it . kaddr = erofs_bread ( & it -> it . buf , it -> it .blkaddr , EROFS_KMAP );
368+ it -> it . pos = erofs_pos ( sb , sbi -> xattr_blkaddr ) +
369+ vi -> xattr_shared_xattrs [ i ] * sizeof ( __le32 );
370+ it -> it .kaddr = erofs_bread ( & it -> it . buf ,
371+ erofs_blknr ( sb , it -> it .pos ) , EROFS_KMAP );
405372 if (IS_ERR (it -> it .kaddr ))
406373 return PTR_ERR (it -> it .kaddr );
407374
@@ -599,14 +566,15 @@ static int shared_listxattr(struct listxattr_iter *it)
599566 struct inode * const inode = d_inode (it -> dentry );
600567 struct erofs_inode * const vi = EROFS_I (inode );
601568 struct super_block * const sb = it -> it .sb ;
602- unsigned int i , xsid ;
569+ struct erofs_sb_info * sbi = EROFS_SB (sb );
570+ unsigned int i ;
603571 int ret = 0 ;
604572
605573 for (i = 0 ; i < vi -> xattr_shared_count ; ++ i ) {
606- xsid = vi -> xattr_shared_xattrs [ i ];
607- it -> it . blkaddr = erofs_xattr_blkaddr ( sb , xsid );
608- it -> it .ofs = erofs_xattr_blkoff ( sb , xsid );
609- it -> it . kaddr = erofs_bread ( & it -> it . buf , it -> it .blkaddr , EROFS_KMAP );
574+ it -> it . pos = erofs_pos ( sb , sbi -> xattr_blkaddr ) +
575+ vi -> xattr_shared_xattrs [ i ] * sizeof ( __le32 );
576+ it -> it .kaddr = erofs_bread ( & it -> it . buf ,
577+ erofs_blknr ( sb , it -> it .pos ) , EROFS_KMAP );
610578 if (IS_ERR (it -> it .kaddr ))
611579 return PTR_ERR (it -> it .kaddr );
612580
0 commit comments