Lines Matching full:it

19 static inline void xattr_iter_end(struct xattr_iter *it, bool atomic)  in xattr_iter_end()  argument
23 kunmap(it->page); in xattr_iter_end()
25 kunmap_atomic(it->kaddr); in xattr_iter_end()
27 unlock_page(it->page); in xattr_iter_end()
28 put_page(it->page); in xattr_iter_end()
31 static inline void xattr_iter_end_final(struct xattr_iter *it) in xattr_iter_end_final() argument
33 if (!it->page) in xattr_iter_end_final()
36 xattr_iter_end(it, true); in xattr_iter_end_final()
42 struct xattr_iter it; in init_inode_xattrs() local
64 * 1) it is not enough to contain erofs_xattr_ibody_header then in init_inode_xattrs()
65 * ->xattr_isize should be 0 (it means no xattr); in init_inode_xattrs()
66 * 2) it is just to contain erofs_xattr_ibody_header, which is on-disk in init_inode_xattrs()
89 it.blkaddr = erofs_blknr(iloc(sbi, vi->nid) + vi->inode_isize); in init_inode_xattrs()
90 it.ofs = erofs_blkoff(iloc(sbi, vi->nid) + vi->inode_isize); in init_inode_xattrs()
92 it.page = erofs_get_meta_page(sb, it.blkaddr); in init_inode_xattrs()
93 if (IS_ERR(it.page)) { in init_inode_xattrs()
94 ret = PTR_ERR(it.page); in init_inode_xattrs()
99 it.kaddr = kmap(it.page); in init_inode_xattrs()
102 ih = (struct erofs_xattr_ibody_header *)(it.kaddr + it.ofs); in init_inode_xattrs()
108 xattr_iter_end(&it, atomic_map); in init_inode_xattrs()
114 it.ofs += sizeof(struct erofs_xattr_ibody_header); in init_inode_xattrs()
117 if (it.ofs >= EROFS_BLKSIZ) { in init_inode_xattrs()
119 DBG_BUGON(it.ofs != EROFS_BLKSIZ); in init_inode_xattrs()
120 xattr_iter_end(&it, atomic_map); in init_inode_xattrs()
122 it.page = erofs_get_meta_page(sb, ++it.blkaddr); in init_inode_xattrs()
123 if (IS_ERR(it.page)) { in init_inode_xattrs()
126 ret = PTR_ERR(it.page); in init_inode_xattrs()
130 it.kaddr = kmap_atomic(it.page); in init_inode_xattrs()
132 it.ofs = 0; in init_inode_xattrs()
135 le32_to_cpu(*(__le32 *)(it.kaddr + it.ofs)); in init_inode_xattrs()
136 it.ofs += sizeof(__le32); in init_inode_xattrs()
138 xattr_iter_end(&it, atomic_map); in init_inode_xattrs()
163 static inline int xattr_iter_fixup(struct xattr_iter *it) in xattr_iter_fixup() argument
165 if (it->ofs < EROFS_BLKSIZ) in xattr_iter_fixup()
168 xattr_iter_end(it, true); in xattr_iter_fixup()
170 it->blkaddr += erofs_blknr(it->ofs); in xattr_iter_fixup()
172 it->page = erofs_get_meta_page(it->sb, it->blkaddr); in xattr_iter_fixup()
173 if (IS_ERR(it->page)) { in xattr_iter_fixup()
174 int err = PTR_ERR(it->page); in xattr_iter_fixup()
176 it->page = NULL; in xattr_iter_fixup()
180 it->kaddr = kmap_atomic(it->page); in xattr_iter_fixup()
181 it->ofs = erofs_blkoff(it->ofs); in xattr_iter_fixup()
185 static int inline_xattr_iter_begin(struct xattr_iter *it, in inline_xattr_iter_begin() argument
200 it->blkaddr = erofs_blknr(iloc(sbi, vi->nid) + inline_xattr_ofs); in inline_xattr_iter_begin()
201 it->ofs = erofs_blkoff(iloc(sbi, vi->nid) + inline_xattr_ofs); in inline_xattr_iter_begin()
203 it->page = erofs_get_meta_page(inode->i_sb, it->blkaddr); in inline_xattr_iter_begin()
204 if (IS_ERR(it->page)) in inline_xattr_iter_begin()
205 return PTR_ERR(it->page); in inline_xattr_iter_begin()
207 it->kaddr = kmap_atomic(it->page); in inline_xattr_iter_begin()
215 static int xattr_foreach(struct xattr_iter *it, in xattr_foreach() argument
224 err = xattr_iter_fixup(it); in xattr_foreach()
233 entry = *(struct erofs_xattr_entry *)(it->kaddr + it->ofs); in xattr_foreach()
245 it->ofs += sizeof(struct erofs_xattr_entry); in xattr_foreach()
249 err = op->entry(it, &entry); in xattr_foreach()
251 it->ofs += entry.e_name_len + value_sz; in xattr_foreach()
259 if (it->ofs >= EROFS_BLKSIZ) { in xattr_foreach()
260 DBG_BUGON(it->ofs > EROFS_BLKSIZ); in xattr_foreach()
262 err = xattr_iter_fixup(it); in xattr_foreach()
265 it->ofs = 0; in xattr_foreach()
268 slice = min_t(unsigned int, PAGE_SIZE - it->ofs, in xattr_foreach()
272 err = op->name(it, processed, it->kaddr + it->ofs, slice); in xattr_foreach()
274 it->ofs += entry.e_name_len - processed + value_sz; in xattr_foreach()
278 it->ofs += slice; in xattr_foreach()
286 err = op->alloc_buffer(it, value_sz); in xattr_foreach()
288 it->ofs += value_sz; in xattr_foreach()
294 if (it->ofs >= EROFS_BLKSIZ) { in xattr_foreach()
295 DBG_BUGON(it->ofs > EROFS_BLKSIZ); in xattr_foreach()
297 err = xattr_iter_fixup(it); in xattr_foreach()
300 it->ofs = 0; in xattr_foreach()
303 slice = min_t(unsigned int, PAGE_SIZE - it->ofs, in xattr_foreach()
305 op->value(it, processed, it->kaddr + it->ofs, slice); in xattr_foreach()
306 it->ofs += slice; in xattr_foreach()
312 it->ofs = EROFS_XATTR_ALIGN(it->ofs); in xattr_foreach()
317 struct xattr_iter it; member
327 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_entrymatch() local
329 return (it->index != entry->e_name_index || in xattr_entrymatch()
330 it->name.len != entry->e_name_len) ? -ENOATTR : 0; in xattr_entrymatch()
336 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_namematch() local
338 return memcmp(buf, it->name.name + processed, len) ? -ENOATTR : 0; in xattr_namematch()
344 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_checkbuffer() local
345 int err = it->buffer_size < value_sz ? -ERANGE : 0; in xattr_checkbuffer()
347 it->buffer_size = value_sz; in xattr_checkbuffer()
348 return !it->buffer ? 1 : err; in xattr_checkbuffer()
355 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_copyvalue() local
357 memcpy(it->buffer + processed, buf, len); in xattr_copyvalue()
367 static int inline_getxattr(struct inode *inode, struct getxattr_iter *it) in inline_getxattr() argument
372 ret = inline_xattr_iter_begin(&it->it, inode); in inline_getxattr()
378 ret = xattr_foreach(&it->it, &find_xattr_handlers, &remaining); in inline_getxattr()
382 xattr_iter_end_final(&it->it); in inline_getxattr()
384 return ret ? ret : it->buffer_size; in inline_getxattr()
387 static int shared_getxattr(struct inode *inode, struct getxattr_iter *it) in shared_getxattr() argument
399 it->it.ofs = xattrblock_offset(sbi, vi->xattr_shared_xattrs[i]); in shared_getxattr()
401 if (!i || blkaddr != it->it.blkaddr) { in shared_getxattr()
403 xattr_iter_end(&it->it, true); in shared_getxattr()
405 it->it.page = erofs_get_meta_page(sb, blkaddr); in shared_getxattr()
406 if (IS_ERR(it->it.page)) in shared_getxattr()
407 return PTR_ERR(it->it.page); in shared_getxattr()
409 it->it.kaddr = kmap_atomic(it->it.page); in shared_getxattr()
410 it->it.blkaddr = blkaddr; in shared_getxattr()
413 ret = xattr_foreach(&it->it, &find_xattr_handlers, NULL); in shared_getxattr()
418 xattr_iter_end_final(&it->it); in shared_getxattr()
420 return ret ? ret : it->buffer_size; in shared_getxattr()
438 struct getxattr_iter it; in erofs_getxattr() local
447 it.index = index; in erofs_getxattr()
449 it.name.len = strlen(name); in erofs_getxattr()
450 if (it.name.len > EROFS_NAME_LEN) in erofs_getxattr()
452 it.name.name = name; in erofs_getxattr()
454 it.buffer = buffer; in erofs_getxattr()
455 it.buffer_size = buffer_size; in erofs_getxattr()
457 it.it.sb = inode->i_sb; in erofs_getxattr()
458 ret = inline_getxattr(inode, &it); in erofs_getxattr()
460 ret = shared_getxattr(inode, &it); in erofs_getxattr()
522 struct xattr_iter it; member
532 struct listxattr_iter *it = in xattr_entrylist() local
533 container_of(_it, struct listxattr_iter, it); in xattr_entrylist()
540 if (!h || (h->list && !h->list(it->dentry))) in xattr_entrylist()
546 if (!it->buffer) { in xattr_entrylist()
547 it->buffer_ofs += prefix_len + entry->e_name_len + 1; in xattr_entrylist()
551 if (it->buffer_ofs + prefix_len in xattr_entrylist()
552 + entry->e_name_len + 1 > it->buffer_size) in xattr_entrylist()
555 memcpy(it->buffer + it->buffer_ofs, prefix, prefix_len); in xattr_entrylist()
556 it->buffer_ofs += prefix_len; in xattr_entrylist()
563 struct listxattr_iter *it = in xattr_namelist() local
564 container_of(_it, struct listxattr_iter, it); in xattr_namelist()
566 memcpy(it->buffer + it->buffer_ofs, buf, len); in xattr_namelist()
567 it->buffer_ofs += len; in xattr_namelist()
574 struct listxattr_iter *it = in xattr_skipvalue() local
575 container_of(_it, struct listxattr_iter, it); in xattr_skipvalue()
577 it->buffer[it->buffer_ofs++] = '\0'; in xattr_skipvalue()
588 static int inline_listxattr(struct listxattr_iter *it) in inline_listxattr() argument
593 ret = inline_xattr_iter_begin(&it->it, d_inode(it->dentry)); in inline_listxattr()
599 ret = xattr_foreach(&it->it, &list_xattr_handlers, &remaining); in inline_listxattr()
603 xattr_iter_end_final(&it->it); in inline_listxattr()
604 return ret ? ret : it->buffer_ofs; in inline_listxattr()
607 static int shared_listxattr(struct listxattr_iter *it) in shared_listxattr() argument
609 struct inode *const inode = d_inode(it->dentry); in shared_listxattr()
620 it->it.ofs = xattrblock_offset(sbi, vi->xattr_shared_xattrs[i]); in shared_listxattr()
621 if (!i || blkaddr != it->it.blkaddr) { in shared_listxattr()
623 xattr_iter_end(&it->it, true); in shared_listxattr()
625 it->it.page = erofs_get_meta_page(sb, blkaddr); in shared_listxattr()
626 if (IS_ERR(it->it.page)) in shared_listxattr()
627 return PTR_ERR(it->it.page); in shared_listxattr()
629 it->it.kaddr = kmap_atomic(it->it.page); in shared_listxattr()
630 it->it.blkaddr = blkaddr; in shared_listxattr()
633 ret = xattr_foreach(&it->it, &list_xattr_handlers, NULL); in shared_listxattr()
638 xattr_iter_end_final(&it->it); in shared_listxattr()
640 return ret ? ret : it->buffer_ofs; in shared_listxattr()
647 struct listxattr_iter it; in erofs_listxattr() local
655 it.dentry = dentry; in erofs_listxattr()
656 it.buffer = buffer; in erofs_listxattr()
657 it.buffer_size = buffer_size; in erofs_listxattr()
658 it.buffer_ofs = 0; in erofs_listxattr()
660 it.it.sb = dentry->d_sb; in erofs_listxattr()
662 ret = inline_listxattr(&it); in erofs_listxattr()
665 return shared_listxattr(&it); in erofs_listxattr()