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
70 * 1) it is not enough to contain erofs_xattr_ibody_header then in init_inode_xattrs()
71 * ->xattr_isize should be 0 (it means no xattr); in init_inode_xattrs()
72 * 2) it is just to contain erofs_xattr_ibody_header, which is on-disk in init_inode_xattrs()
95 it.blkaddr = erofs_blknr(iloc(sbi, vi->nid) + vi->inode_isize); in init_inode_xattrs()
96 it.ofs = erofs_blkoff(iloc(sbi, vi->nid) + vi->inode_isize); in init_inode_xattrs()
98 it.page = erofs_get_meta_page(sb, it.blkaddr); in init_inode_xattrs()
99 if (IS_ERR(it.page)) { in init_inode_xattrs()
100 ret = PTR_ERR(it.page); in init_inode_xattrs()
105 it.kaddr = kmap(it.page); in init_inode_xattrs()
108 ih = (struct erofs_xattr_ibody_header *)(it.kaddr + it.ofs); in init_inode_xattrs()
114 xattr_iter_end(&it, atomic_map); in init_inode_xattrs()
120 it.ofs += sizeof(struct erofs_xattr_ibody_header); in init_inode_xattrs()
123 if (it.ofs >= EROFS_BLKSIZ) { in init_inode_xattrs()
125 DBG_BUGON(it.ofs != EROFS_BLKSIZ); in init_inode_xattrs()
126 xattr_iter_end(&it, atomic_map); in init_inode_xattrs()
128 it.page = erofs_get_meta_page(sb, ++it.blkaddr); in init_inode_xattrs()
129 if (IS_ERR(it.page)) { in init_inode_xattrs()
132 ret = PTR_ERR(it.page); in init_inode_xattrs()
136 it.kaddr = kmap_atomic(it.page); in init_inode_xattrs()
138 it.ofs = 0; in init_inode_xattrs()
141 le32_to_cpu(*(__le32 *)(it.kaddr + it.ofs)); in init_inode_xattrs()
142 it.ofs += sizeof(__le32); in init_inode_xattrs()
144 xattr_iter_end(&it, atomic_map); in init_inode_xattrs()
171 static inline int xattr_iter_fixup(struct xattr_iter *it) in xattr_iter_fixup() argument
173 if (it->ofs < EROFS_BLKSIZ) in xattr_iter_fixup()
176 xattr_iter_end(it, true); in xattr_iter_fixup()
178 it->blkaddr += erofs_blknr(it->ofs); in xattr_iter_fixup()
180 it->page = erofs_get_meta_page(it->sb, it->blkaddr); in xattr_iter_fixup()
181 if (IS_ERR(it->page)) { in xattr_iter_fixup()
182 int err = PTR_ERR(it->page); in xattr_iter_fixup()
184 it->page = NULL; in xattr_iter_fixup()
188 it->kaddr = kmap_atomic(it->page); in xattr_iter_fixup()
189 it->ofs = erofs_blkoff(it->ofs); in xattr_iter_fixup()
193 static int inline_xattr_iter_begin(struct xattr_iter *it, in inline_xattr_iter_begin() argument
208 it->blkaddr = erofs_blknr(iloc(sbi, vi->nid) + inline_xattr_ofs); in inline_xattr_iter_begin()
209 it->ofs = erofs_blkoff(iloc(sbi, vi->nid) + inline_xattr_ofs); in inline_xattr_iter_begin()
211 it->page = erofs_get_meta_page(inode->i_sb, it->blkaddr); in inline_xattr_iter_begin()
212 if (IS_ERR(it->page)) in inline_xattr_iter_begin()
213 return PTR_ERR(it->page); in inline_xattr_iter_begin()
215 it->kaddr = kmap_atomic(it->page); in inline_xattr_iter_begin()
223 static int xattr_foreach(struct xattr_iter *it, in xattr_foreach() argument
232 err = xattr_iter_fixup(it); in xattr_foreach()
241 entry = *(struct erofs_xattr_entry *)(it->kaddr + it->ofs); in xattr_foreach()
253 it->ofs += sizeof(struct erofs_xattr_entry); in xattr_foreach()
257 err = op->entry(it, &entry); in xattr_foreach()
259 it->ofs += entry.e_name_len + value_sz; in xattr_foreach()
267 if (it->ofs >= EROFS_BLKSIZ) { in xattr_foreach()
268 DBG_BUGON(it->ofs > EROFS_BLKSIZ); in xattr_foreach()
270 err = xattr_iter_fixup(it); in xattr_foreach()
273 it->ofs = 0; in xattr_foreach()
276 slice = min_t(unsigned int, PAGE_SIZE - it->ofs, in xattr_foreach()
280 err = op->name(it, processed, it->kaddr + it->ofs, slice); in xattr_foreach()
282 it->ofs += entry.e_name_len - processed + value_sz; in xattr_foreach()
286 it->ofs += slice; in xattr_foreach()
294 err = op->alloc_buffer(it, value_sz); in xattr_foreach()
296 it->ofs += value_sz; in xattr_foreach()
302 if (it->ofs >= EROFS_BLKSIZ) { in xattr_foreach()
303 DBG_BUGON(it->ofs > EROFS_BLKSIZ); in xattr_foreach()
305 err = xattr_iter_fixup(it); in xattr_foreach()
308 it->ofs = 0; in xattr_foreach()
311 slice = min_t(unsigned int, PAGE_SIZE - it->ofs, in xattr_foreach()
313 op->value(it, processed, it->kaddr + it->ofs, slice); in xattr_foreach()
314 it->ofs += slice; in xattr_foreach()
320 it->ofs = EROFS_XATTR_ALIGN(it->ofs); in xattr_foreach()
325 struct xattr_iter it; member
335 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_entrymatch() local
337 return (it->index != entry->e_name_index || in xattr_entrymatch()
338 it->name.len != entry->e_name_len) ? -ENOATTR : 0; in xattr_entrymatch()
344 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_namematch() local
346 return memcmp(buf, it->name.name + processed, len) ? -ENOATTR : 0; in xattr_namematch()
352 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_checkbuffer() local
353 int err = it->buffer_size < value_sz ? -ERANGE : 0; in xattr_checkbuffer()
355 it->buffer_size = value_sz; in xattr_checkbuffer()
356 return !it->buffer ? 1 : err; in xattr_checkbuffer()
363 struct getxattr_iter *it = container_of(_it, struct getxattr_iter, it); in xattr_copyvalue() local
365 memcpy(it->buffer + processed, buf, len); in xattr_copyvalue()
375 static int inline_getxattr(struct inode *inode, struct getxattr_iter *it) in inline_getxattr() argument
380 ret = inline_xattr_iter_begin(&it->it, inode); in inline_getxattr()
386 ret = xattr_foreach(&it->it, &find_xattr_handlers, &remaining); in inline_getxattr()
390 xattr_iter_end_final(&it->it); in inline_getxattr()
392 return ret ? ret : it->buffer_size; in inline_getxattr()
395 static int shared_getxattr(struct inode *inode, struct getxattr_iter *it) in shared_getxattr() argument
407 it->it.ofs = xattrblock_offset(sbi, vi->xattr_shared_xattrs[i]); in shared_getxattr()
409 if (!i || blkaddr != it->it.blkaddr) { in shared_getxattr()
411 xattr_iter_end(&it->it, true); in shared_getxattr()
413 it->it.page = erofs_get_meta_page(sb, blkaddr); in shared_getxattr()
414 if (IS_ERR(it->it.page)) in shared_getxattr()
415 return PTR_ERR(it->it.page); in shared_getxattr()
417 it->it.kaddr = kmap_atomic(it->it.page); in shared_getxattr()
418 it->it.blkaddr = blkaddr; in shared_getxattr()
421 ret = xattr_foreach(&it->it, &find_xattr_handlers, NULL); in shared_getxattr()
426 xattr_iter_end_final(&it->it); in shared_getxattr()
428 return ret ? ret : it->buffer_size; in shared_getxattr()
446 struct getxattr_iter it; in erofs_getxattr() local
455 it.index = index; in erofs_getxattr()
457 it.name.len = strlen(name); in erofs_getxattr()
458 if (it.name.len > EROFS_NAME_LEN) in erofs_getxattr()
460 it.name.name = name; in erofs_getxattr()
462 it.buffer = buffer; in erofs_getxattr()
463 it.buffer_size = buffer_size; in erofs_getxattr()
465 it.it.sb = inode->i_sb; in erofs_getxattr()
466 ret = inline_getxattr(inode, &it); in erofs_getxattr()
468 ret = shared_getxattr(inode, &it); in erofs_getxattr()
530 struct xattr_iter it; member
540 struct listxattr_iter *it = in xattr_entrylist() local
541 container_of(_it, struct listxattr_iter, it); in xattr_entrylist()
548 if (!h || (h->list && !h->list(it->dentry))) in xattr_entrylist()
554 if (!it->buffer) { in xattr_entrylist()
555 it->buffer_ofs += prefix_len + entry->e_name_len + 1; in xattr_entrylist()
559 if (it->buffer_ofs + prefix_len in xattr_entrylist()
560 + entry->e_name_len + 1 > it->buffer_size) in xattr_entrylist()
563 memcpy(it->buffer + it->buffer_ofs, prefix, prefix_len); in xattr_entrylist()
564 it->buffer_ofs += prefix_len; in xattr_entrylist()
571 struct listxattr_iter *it = in xattr_namelist() local
572 container_of(_it, struct listxattr_iter, it); in xattr_namelist()
574 memcpy(it->buffer + it->buffer_ofs, buf, len); in xattr_namelist()
575 it->buffer_ofs += len; in xattr_namelist()
582 struct listxattr_iter *it = in xattr_skipvalue() local
583 container_of(_it, struct listxattr_iter, it); in xattr_skipvalue()
585 it->buffer[it->buffer_ofs++] = '\0'; in xattr_skipvalue()
596 static int inline_listxattr(struct listxattr_iter *it) in inline_listxattr() argument
601 ret = inline_xattr_iter_begin(&it->it, d_inode(it->dentry)); in inline_listxattr()
607 ret = xattr_foreach(&it->it, &list_xattr_handlers, &remaining); in inline_listxattr()
611 xattr_iter_end_final(&it->it); in inline_listxattr()
612 return ret ? ret : it->buffer_ofs; in inline_listxattr()
615 static int shared_listxattr(struct listxattr_iter *it) in shared_listxattr() argument
617 struct inode *const inode = d_inode(it->dentry); in shared_listxattr()
628 it->it.ofs = xattrblock_offset(sbi, vi->xattr_shared_xattrs[i]); in shared_listxattr()
629 if (!i || blkaddr != it->it.blkaddr) { in shared_listxattr()
631 xattr_iter_end(&it->it, true); in shared_listxattr()
633 it->it.page = erofs_get_meta_page(sb, blkaddr); in shared_listxattr()
634 if (IS_ERR(it->it.page)) in shared_listxattr()
635 return PTR_ERR(it->it.page); in shared_listxattr()
637 it->it.kaddr = kmap_atomic(it->it.page); in shared_listxattr()
638 it->it.blkaddr = blkaddr; in shared_listxattr()
641 ret = xattr_foreach(&it->it, &list_xattr_handlers, NULL); in shared_listxattr()
646 xattr_iter_end_final(&it->it); in shared_listxattr()
648 return ret ? ret : it->buffer_ofs; in shared_listxattr()
655 struct listxattr_iter it; in erofs_listxattr() local
663 it.dentry = dentry; in erofs_listxattr()
664 it.buffer = buffer; in erofs_listxattr()
665 it.buffer_size = buffer_size; in erofs_listxattr()
666 it.buffer_ofs = 0; in erofs_listxattr()
668 it.it.sb = dentry->d_sb; in erofs_listxattr()
670 ret = inline_listxattr(&it); in erofs_listxattr()
673 return shared_listxattr(&it); in erofs_listxattr()