7
7
#include <linux/security.h>
8
8
#include "xattr.h"
9
9
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
-
23
10
struct xattr_iter {
24
11
struct super_block * sb ;
25
12
struct erofs_buf buf ;
13
+ erofs_off_t pos ;
26
14
void * kaddr ;
27
-
28
- erofs_blk_t blkaddr ;
29
- unsigned int ofs ;
30
15
};
31
16
32
17
static int erofs_init_inode_xattrs (struct inode * inode )
@@ -82,17 +67,16 @@ static int erofs_init_inode_xattrs(struct inode *inode)
82
67
83
68
it .buf = __EROFS_BUF_INITIALIZER ;
84
69
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 ;
87
71
88
72
/* 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 );
90
74
if (IS_ERR (it .kaddr )) {
91
75
ret = PTR_ERR (it .kaddr );
92
76
goto out_unlock ;
93
77
}
94
78
95
- ih = ( struct erofs_xattr_ibody_header * )( it .kaddr + it .ofs );
79
+ ih = it .kaddr + erofs_blkoff ( sb , it .pos );
96
80
vi -> xattr_shared_count = ih -> h_shared_count ;
97
81
vi -> xattr_shared_xattrs = kmalloc_array (vi -> xattr_shared_count ,
98
82
sizeof (uint ), GFP_KERNEL );
@@ -103,25 +87,20 @@ static int erofs_init_inode_xattrs(struct inode *inode)
103
87
}
104
88
105
89
/* let's skip ibody header */
106
- it .ofs += sizeof (struct erofs_xattr_ibody_header );
90
+ it .pos += sizeof (struct erofs_xattr_ibody_header );
107
91
108
92
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 ;
121
100
}
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 );
125
104
}
126
105
erofs_put_metabuf (& it .buf );
127
106
@@ -150,24 +129,11 @@ struct xattr_iter_handlers {
150
129
unsigned int len );
151
130
};
152
131
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
-
166
132
static int inline_xattr_iter_begin (struct xattr_iter * it ,
167
133
struct inode * inode )
168
134
{
169
135
struct erofs_inode * const vi = EROFS_I (inode );
170
- unsigned int xattr_header_sz , inline_xattr_ofs ;
136
+ unsigned int xattr_header_sz ;
171
137
172
138
xattr_header_sz = sizeof (struct erofs_xattr_ibody_header ) +
173
139
sizeof (u32 ) * vi -> xattr_shared_count ;
@@ -176,39 +142,39 @@ static int inline_xattr_iter_begin(struct xattr_iter *it,
176
142
return - ENOATTR ;
177
143
}
178
144
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 );
184
148
if (IS_ERR (it -> kaddr ))
185
149
return PTR_ERR (it -> kaddr );
186
150
return vi -> xattr_isize - xattr_header_sz ;
187
151
}
188
152
189
153
/*
190
154
* 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.
192
156
*/
193
157
static int xattr_foreach (struct xattr_iter * it ,
194
158
const struct xattr_iter_handlers * op ,
195
159
unsigned int * tlimit )
196
160
{
197
161
struct erofs_xattr_entry entry ;
162
+ struct super_block * sb = it -> sb ;
198
163
unsigned int value_sz , processed , slice ;
199
164
int err ;
200
165
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 ) ;
205
170
206
171
/*
207
172
* 1. read xattr entry to the memory,
208
173
* since we do EROFS_XATTR_ALIGN
209
174
* therefore entry should be in the page
210
175
*/
211
- entry = * (struct erofs_xattr_entry * )(it -> kaddr + it -> ofs );
176
+ entry = * (struct erofs_xattr_entry * )
177
+ (it -> kaddr + erofs_blkoff (sb , it -> pos ));
212
178
if (tlimit ) {
213
179
unsigned int entry_sz = erofs_xattr_entry_size (& entry );
214
180
@@ -220,40 +186,40 @@ static int xattr_foreach(struct xattr_iter *it,
220
186
* tlimit -= entry_sz ;
221
187
}
222
188
223
- it -> ofs += sizeof (struct erofs_xattr_entry );
189
+ it -> pos += sizeof (struct erofs_xattr_entry );
224
190
value_sz = le16_to_cpu (entry .e_value_size );
225
191
226
192
/* handle entry */
227
193
err = op -> entry (it , & entry );
228
194
if (err ) {
229
- it -> ofs += entry .e_name_len + value_sz ;
195
+ it -> pos += entry .e_name_len + value_sz ;
230
196
goto out ;
231
197
}
232
198
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) */
234
200
processed = 0 ;
235
201
236
202
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 ;
244
208
}
245
209
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 ),
247
212
entry .e_name_len - processed );
248
213
249
214
/* 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 );
251
217
if (err ) {
252
- it -> ofs += entry .e_name_len - processed + value_sz ;
218
+ it -> pos += entry .e_name_len - processed + value_sz ;
253
219
goto out ;
254
220
}
255
221
256
- it -> ofs += slice ;
222
+ it -> pos += slice ;
257
223
processed += slice ;
258
224
}
259
225
@@ -263,31 +229,31 @@ static int xattr_foreach(struct xattr_iter *it,
263
229
if (op -> alloc_buffer ) {
264
230
err = op -> alloc_buffer (it , value_sz );
265
231
if (err ) {
266
- it -> ofs += value_sz ;
232
+ it -> pos += value_sz ;
267
233
goto out ;
268
234
}
269
235
}
270
236
271
237
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 ;
279
243
}
280
244
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 ),
282
247
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 ;
285
251
processed += slice ;
286
252
}
287
253
288
254
out :
289
255
/* 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 );
291
257
return err < 0 ? err : 0 ;
292
258
}
293
259
@@ -394,14 +360,15 @@ static int shared_getxattr(struct inode *inode, struct getxattr_iter *it)
394
360
{
395
361
struct erofs_inode * const vi = EROFS_I (inode );
396
362
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 ;
398
365
int ret = - ENOATTR ;
399
366
400
367
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 );
405
372
if (IS_ERR (it -> it .kaddr ))
406
373
return PTR_ERR (it -> it .kaddr );
407
374
@@ -599,14 +566,15 @@ static int shared_listxattr(struct listxattr_iter *it)
599
566
struct inode * const inode = d_inode (it -> dentry );
600
567
struct erofs_inode * const vi = EROFS_I (inode );
601
568
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 ;
603
571
int ret = 0 ;
604
572
605
573
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 );
610
578
if (IS_ERR (it -> it .kaddr ))
611
579
return PTR_ERR (it -> it .kaddr );
612
580
0 commit comments