Skip to content

Commit eba67eb

Browse files
lostjefflehsiangkao
authored andcommitted
erofs: use absolute position in xattr iterator
Replace blkaddr/ofs with pos in 'struct erofs_xattr_iter'. After erofs_bread() is introduced to replace raw page cache APIs for metadata I/Os handling, xattr_iter_fixup() is no longer needed anymore. In addition, it is also unnecessary to check if the iterated position is span over the block boundary as absolute offset is used instead of blkaddr + offset pairs. Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com> Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20230613074114.120115-2-jefflexu@linux.alibaba.com Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
1 parent 001b8cc commit eba67eb

File tree

1 file changed

+65
-97
lines changed

1 file changed

+65
-97
lines changed

fs/erofs/xattr.c

Lines changed: 65 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,11 @@
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-
2310
struct 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

3217
static 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-
166132
static 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
*/
193157
static 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

288254
out:
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

Comments
 (0)