Lines Matching +full:entry +full:- +full:name

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
80 ext2_extattr_name_to_bsd(int attrnamespace, const char *name, int* name_len) in ext2_extattr_name_to_bsd() argument
84 return (name); in ext2_extattr_name_to_bsd()
86 return (name); in ext2_extattr_name_to_bsd()
100 "can not convert ext2fs name to bsd namespace"); in ext2_extattr_name_to_bsd()
106 ext2_extattr_attrnamespace_to_linux(int attrnamespace, const char *name) in ext2_extattr_attrnamespace_to_linux() argument
110 !strcmp(name, POSIX1E_ACL_DEFAULT_EXTATTR_NAME)) in ext2_extattr_attrnamespace_to_linux()
114 !strcmp(name, POSIX1E_ACL_ACCESS_EXTATTR_NAME)) in ext2_extattr_attrnamespace_to_linux()
129 return (-1); in ext2_extattr_attrnamespace_to_linux()
133 ext2_extattr_name_to_linux(int attrnamespace, const char *name) in ext2_extattr_name_to_linux() argument
140 return (name); in ext2_extattr_name_to_linux()
159 ext2_extattr_check(struct ext2fs_extattr_entry *entry, char *end) in ext2_extattr_check() argument
163 while (!EXT2_IS_LAST_ENTRY(entry)) { in ext2_extattr_check()
164 next = EXT2_EXTATTR_NEXT(entry); in ext2_extattr_check()
168 entry = next; in ext2_extattr_check()
180 header = (struct ext2fs_extattr_header *)bp->b_data; in ext2_extattr_block_check()
183 bp->b_data + bp->b_bufsize); in ext2_extattr_block_check()
197 struct ext2fs_extattr_entry *entry; in ext2_extattr_inode_list() local
202 fs = ip->i_e2fs; in ext2_extattr_inode_list()
204 if ((error = bread(ip->i_devvp, in ext2_extattr_inode_list()
205 fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), in ext2_extattr_inode_list()
206 (int)fs->e2fs_bsize, NOCRED, &bp)) != 0) { in ext2_extattr_inode_list()
212 ((char *)bp->b_data + in ext2_extattr_inode_list()
213 EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ip->i_number)); in ext2_extattr_inode_list()
217 E2FS_REV0_INODE_SIZE + le16toh(dinode->e2di_extra_isize)); in ext2_extattr_inode_list()
219 if (le32toh(header->h_magic) != EXTATTR_MAGIC) { in ext2_extattr_inode_list()
231 for (entry = EXT2_IFIRST(header); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_inode_list()
232 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_inode_list()
233 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_inode_list()
237 name_len = entry->e_name_len; in ext2_extattr_inode_list()
238 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_inode_list()
239 entry->e_name, &name_len); in ext2_extattr_inode_list()
249 char *name = malloc(name_len + 1, M_TEMP, M_WAITOK); in ext2_extattr_inode_list() local
250 name[0] = name_len; in ext2_extattr_inode_list()
251 memcpy(&name[1], attr_name, name_len); in ext2_extattr_inode_list()
252 error = uiomove(name, name_len + 1, uio); in ext2_extattr_inode_list()
253 free(name, M_TEMP); in ext2_extattr_inode_list()
271 struct ext2fs_extattr_entry *entry; in ext2_extattr_block_list() local
276 fs = ip->i_e2fs; in ext2_extattr_block_list()
278 error = bread(ip->i_devvp, fsbtodb(fs, ip->i_facl), in ext2_extattr_block_list()
279 fs->e2fs_bsize, NOCRED, &bp); in ext2_extattr_block_list()
286 if (le32toh(header->h_magic) != EXTATTR_MAGIC || in ext2_extattr_block_list()
287 le32toh(header->h_blocks) != 1) { in ext2_extattr_block_list()
298 for (entry = EXT2_FIRST_ENTRY(bp); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_block_list()
299 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_block_list()
300 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_block_list()
304 name_len = entry->e_name_len; in ext2_extattr_block_list()
305 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_block_list()
306 entry->e_name, &name_len); in ext2_extattr_block_list()
316 char *name = malloc(name_len + 1, M_TEMP, M_WAITOK); in ext2_extattr_block_list() local
317 name[0] = name_len; in ext2_extattr_block_list()
318 memcpy(&name[1], attr_name, name_len); in ext2_extattr_block_list()
319 error = uiomove(name, name_len + 1, uio); in ext2_extattr_block_list()
320 free(name, M_TEMP); in ext2_extattr_block_list()
333 const char *name, struct uio *uio, size_t *size) in ext2_extattr_inode_get() argument
338 struct ext2fs_extattr_entry *entry; in ext2_extattr_inode_get() local
343 fs = ip->i_e2fs; in ext2_extattr_inode_get()
345 if ((error = bread(ip->i_devvp, in ext2_extattr_inode_get()
346 fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), in ext2_extattr_inode_get()
347 (int)fs->e2fs_bsize, NOCRED, &bp)) != 0) { in ext2_extattr_inode_get()
353 ((char *)bp->b_data + in ext2_extattr_inode_get()
354 EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ip->i_number)); in ext2_extattr_inode_get()
358 E2FS_REV0_INODE_SIZE + le16toh(dinode->e2di_extra_isize)); in ext2_extattr_inode_get()
360 if (le32toh(header->h_magic) != EXTATTR_MAGIC) { in ext2_extattr_inode_get()
372 for (entry = EXT2_IFIRST(header); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_inode_get()
373 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_inode_get()
374 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_inode_get()
378 name_len = entry->e_name_len; in ext2_extattr_inode_get()
379 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_inode_get()
380 entry->e_name, &name_len); in ext2_extattr_inode_get()
386 if (strlen(name) == name_len && in ext2_extattr_inode_get()
387 0 == strncmp(attr_name, name, name_len)) { in ext2_extattr_inode_get()
389 *size += le32toh(entry->e_value_size); in ext2_extattr_inode_get()
393 le16toh(entry->e_value_offs), in ext2_extattr_inode_get()
394 le32toh(entry->e_value_size), uio); in ext2_extattr_inode_get()
408 const char *name, struct uio *uio, size_t *size) in ext2_extattr_block_get() argument
413 struct ext2fs_extattr_entry *entry; in ext2_extattr_block_get() local
418 fs = ip->i_e2fs; in ext2_extattr_block_get()
420 error = bread(ip->i_devvp, fsbtodb(fs, ip->i_facl), in ext2_extattr_block_get()
421 fs->e2fs_bsize, NOCRED, &bp); in ext2_extattr_block_get()
428 if (le32toh(header->h_magic) != EXTATTR_MAGIC || in ext2_extattr_block_get()
429 le32toh(header->h_blocks) != 1) { in ext2_extattr_block_get()
440 for (entry = EXT2_FIRST_ENTRY(bp); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_block_get()
441 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_block_get()
442 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_block_get()
446 name_len = entry->e_name_len; in ext2_extattr_block_get()
447 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_block_get()
448 entry->e_name, &name_len); in ext2_extattr_block_get()
454 if (strlen(name) == name_len && in ext2_extattr_block_get()
455 0 == strncmp(attr_name, name, name_len)) { in ext2_extattr_block_get()
457 *size += le32toh(entry->e_value_size); in ext2_extattr_block_get()
460 error = uiomove(bp->b_data + in ext2_extattr_block_get()
461 le16toh(entry->e_value_offs), in ext2_extattr_block_get()
462 le32toh(entry->e_value_size), uio); in ext2_extattr_block_get()
477 struct ext2fs_extattr_entry *entry, char *end) in ext2_extattr_delete_value() argument
482 min_offs = end - off; in ext2_extattr_delete_value()
485 if (min_offs > le16toh(next->e_value_offs) && in ext2_extattr_delete_value()
486 le16toh(next->e_value_offs) > 0) in ext2_extattr_delete_value()
487 min_offs = le16toh(next->e_value_offs); in ext2_extattr_delete_value()
492 if (entry->e_value_size == 0) in ext2_extattr_delete_value()
495 memmove(off + min_offs + EXT2_EXTATTR_SIZE(le32toh(entry->e_value_size)), in ext2_extattr_delete_value()
496 off + min_offs, le16toh(entry->e_value_offs) - min_offs); in ext2_extattr_delete_value()
502 if (le16toh(next->e_value_offs) > 0 && in ext2_extattr_delete_value()
503 le16toh(next->e_value_offs) < le16toh(entry->e_value_offs)) in ext2_extattr_delete_value()
504 next->e_value_offs = htole16(le16toh(next->e_value_offs) + in ext2_extattr_delete_value()
505 EXT2_EXTATTR_SIZE(le32toh(entry->e_value_size))); in ext2_extattr_delete_value()
510 min_offs += EXT2_EXTATTR_SIZE(le32toh(entry->e_value_size)); in ext2_extattr_delete_value()
518 struct ext2fs_extattr_entry *entry, char *end) in ext2_extattr_delete_entry() argument
523 /* Clean entry value */ in ext2_extattr_delete_entry()
524 ext2_extattr_delete_value(off, first_entry, entry, end); in ext2_extattr_delete_entry()
526 /* Clean the entry */ in ext2_extattr_delete_entry()
533 memmove(entry, (char *)entry + EXT2_EXTATTR_LEN(entry->e_name_len), in ext2_extattr_delete_entry()
534 pad - ((char *)entry + EXT2_EXTATTR_LEN(entry->e_name_len))); in ext2_extattr_delete_entry()
538 ext2_extattr_inode_delete(struct inode *ip, int attrnamespace, const char *name) in ext2_extattr_inode_delete() argument
543 struct ext2fs_extattr_entry *entry; in ext2_extattr_inode_delete() local
548 fs = ip->i_e2fs; in ext2_extattr_inode_delete()
550 if ((error = bread(ip->i_devvp, in ext2_extattr_inode_delete()
551 fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), in ext2_extattr_inode_delete()
552 (int)fs->e2fs_bsize, NOCRED, &bp)) != 0) { in ext2_extattr_inode_delete()
558 ((char *)bp->b_data + in ext2_extattr_inode_delete()
559 EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ip->i_number)); in ext2_extattr_inode_delete()
563 E2FS_REV0_INODE_SIZE + le16toh(dinode->e2di_extra_isize)); in ext2_extattr_inode_delete()
565 if (le32toh(header->h_magic) != EXTATTR_MAGIC) { in ext2_extattr_inode_delete()
577 /* If I am last entry, just make magic zero */ in ext2_extattr_inode_delete()
578 entry = EXT2_IFIRST(header); in ext2_extattr_inode_delete()
579 if ((EXT2_IS_LAST_ENTRY(EXT2_EXTATTR_NEXT(entry))) && in ext2_extattr_inode_delete()
580 (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) == in ext2_extattr_inode_delete()
582 name_len = entry->e_name_len; in ext2_extattr_inode_delete()
583 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_inode_delete()
584 entry->e_name, &name_len); in ext2_extattr_inode_delete()
590 if (strlen(name) == name_len && in ext2_extattr_inode_delete()
591 0 == strncmp(attr_name, name, name_len)) { in ext2_extattr_inode_delete()
598 for (entry = EXT2_IFIRST(header); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_inode_delete()
599 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_inode_delete()
600 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_inode_delete()
604 name_len = entry->e_name_len; in ext2_extattr_inode_delete()
605 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_inode_delete()
606 entry->e_name, &name_len); in ext2_extattr_inode_delete()
612 if (strlen(name) == name_len && in ext2_extattr_inode_delete()
613 0 == strncmp(attr_name, name, name_len)) { in ext2_extattr_inode_delete()
615 EXT2_IFIRST(header), entry, in ext2_extattr_inode_delete()
636 fs = ip->i_e2fs; in ext2_extattr_block_clone()
640 if (le32toh(header->h_magic) != EXTATTR_MAGIC || in ext2_extattr_block_clone()
641 le32toh(header->h_refcount) == 1) in ext2_extattr_block_clone()
648 cbp = getblk(ip->i_devvp, fsbtodb(fs, facl), fs->e2fs_bsize, 0, 0, 0); in ext2_extattr_block_clone()
650 ext2_blkfree(ip, facl, fs->e2fs_bsize); in ext2_extattr_block_clone()
654 memcpy(cbp->b_data, sbp->b_data, fs->e2fs_bsize); in ext2_extattr_block_clone()
655 header->h_refcount = htole32(le32toh(header->h_refcount) - 1); in ext2_extattr_block_clone()
658 ip->i_facl = facl; in ext2_extattr_block_clone()
659 ext2_update(ip->i_vnode, 1); in ext2_extattr_block_clone()
662 header->h_refcount = htole32(1); in ext2_extattr_block_clone()
670 ext2_extattr_block_delete(struct inode *ip, int attrnamespace, const char *name) in ext2_extattr_block_delete() argument
675 struct ext2fs_extattr_entry *entry; in ext2_extattr_block_delete() local
680 fs = ip->i_e2fs; in ext2_extattr_block_delete()
682 error = bread(ip->i_devvp, fsbtodb(fs, ip->i_facl), in ext2_extattr_block_delete()
683 fs->e2fs_bsize, NOCRED, &bp); in ext2_extattr_block_delete()
690 if (le32toh(header->h_magic) != EXTATTR_MAGIC || in ext2_extattr_block_delete()
691 le32toh(header->h_blocks) != 1) { in ext2_extattr_block_delete()
702 if (le32toh(header->h_refcount) > 1) { in ext2_extattr_block_delete()
710 /* If I am last entry, clean me and free the block */ in ext2_extattr_block_delete()
711 entry = EXT2_FIRST_ENTRY(bp); in ext2_extattr_block_delete()
712 if (EXT2_IS_LAST_ENTRY(EXT2_EXTATTR_NEXT(entry)) && in ext2_extattr_block_delete()
713 (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) == in ext2_extattr_block_delete()
715 name_len = entry->e_name_len; in ext2_extattr_block_delete()
716 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_block_delete()
717 entry->e_name, &name_len); in ext2_extattr_block_delete()
723 if (strlen(name) == name_len && in ext2_extattr_block_delete()
724 0 == strncmp(attr_name, name, name_len)) { in ext2_extattr_block_delete()
725 ip->i_blocks -= btodb(fs->e2fs_bsize); in ext2_extattr_block_delete()
726 ext2_blkfree(ip, ip->i_facl, fs->e2fs_bsize); in ext2_extattr_block_delete()
727 ip->i_facl = 0; in ext2_extattr_block_delete()
728 error = ext2_update(ip->i_vnode, 1); in ext2_extattr_block_delete()
735 for (entry = EXT2_FIRST_ENTRY(bp); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_block_delete()
736 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_block_delete()
737 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_block_delete()
741 name_len = entry->e_name_len; in ext2_extattr_block_delete()
742 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_block_delete()
743 entry->e_name, &name_len); in ext2_extattr_block_delete()
749 if (strlen(name) == name_len && in ext2_extattr_block_delete()
750 0 == strncmp(attr_name, name, name_len)) { in ext2_extattr_block_delete()
751 ext2_extattr_delete_entry(bp->b_data, in ext2_extattr_block_delete()
752 EXT2_FIRST_ENTRY(bp), entry, in ext2_extattr_block_delete()
753 bp->b_data + bp->b_bufsize); in ext2_extattr_block_delete()
765 allocate_entry(const char *name, int attrnamespace, uint16_t offs, in allocate_entry() argument
770 struct ext2fs_extattr_entry *entry; in allocate_entry() local
772 attr_name = ext2_extattr_name_to_linux(attrnamespace, name); in allocate_entry()
775 entry = malloc(sizeof(struct ext2fs_extattr_entry) + name_len, in allocate_entry()
778 entry->e_name_len = name_len; in allocate_entry()
779 entry->e_name_index = ext2_extattr_attrnamespace_to_linux(attrnamespace, name); in allocate_entry()
780 entry->e_value_offs = htole16(offs); in allocate_entry()
781 entry->e_value_block = 0; in allocate_entry()
782 entry->e_value_size = htole32(size); in allocate_entry()
783 entry->e_hash = htole32(hash); in allocate_entry()
784 memcpy(entry->e_name, name, name_len); in allocate_entry()
786 return (entry); in allocate_entry()
790 free_entry(struct ext2fs_extattr_entry *entry) in free_entry() argument
793 free(entry, M_TEMP); in free_entry()
801 struct ext2fs_extattr_entry *entry; in ext2_extattr_get_size() local
813 for (entry = first_entry; !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_get_size()
814 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_get_size()
815 if (entry != exist_entry) in ext2_extattr_get_size()
816 size += EXT2_EXTATTR_LEN(entry->e_name_len) + in ext2_extattr_get_size()
817 EXT2_EXTATTR_SIZE(le32toh(entry->e_value_size)); in ext2_extattr_get_size()
819 size += EXT2_EXTATTR_LEN(entry->e_name_len) + in ext2_extattr_get_size()
829 struct ext2fs_extattr_entry *entry, in ext2_extattr_set_exist_entry() argument
834 min_offs = ext2_extattr_delete_value(off, first_entry, entry, end); in ext2_extattr_set_exist_entry()
836 entry->e_value_size = htole32(uio->uio_resid); in ext2_extattr_set_exist_entry()
837 if (le32toh(entry->e_value_size)) in ext2_extattr_set_exist_entry()
838 entry->e_value_offs = htole16(min_offs - in ext2_extattr_set_exist_entry()
839 EXT2_EXTATTR_SIZE(uio->uio_resid)); in ext2_extattr_set_exist_entry()
841 entry->e_value_offs = 0; in ext2_extattr_set_exist_entry()
843 uiomove(off + le16toh(entry->e_value_offs), in ext2_extattr_set_exist_entry()
844 le32toh(entry->e_value_size), uio); in ext2_extattr_set_exist_entry()
849 const char *name, int attrnamespace, char *end, struct uio *uio) in ext2_extattr_set_new_entry() argument
854 struct ext2fs_extattr_entry *entry; in ext2_extattr_set_new_entry() local
858 min_offs = end - off; in ext2_extattr_set_new_entry()
859 entry = first_entry; in ext2_extattr_set_new_entry()
860 while (!EXT2_IS_LAST_ENTRY(entry)) { in ext2_extattr_set_new_entry()
861 if (min_offs > le16toh(entry->e_value_offs) && in ext2_extattr_set_new_entry()
862 le16toh(entry->e_value_offs) > 0) in ext2_extattr_set_new_entry()
863 min_offs = le16toh(entry->e_value_offs); in ext2_extattr_set_new_entry()
865 entry = EXT2_EXTATTR_NEXT(entry); in ext2_extattr_set_new_entry()
868 pad = (char*)entry + sizeof(uint32_t); in ext2_extattr_set_new_entry()
870 /* Find entry insert position */ in ext2_extattr_set_new_entry()
871 name_len = strlen(name); in ext2_extattr_set_new_entry()
872 entry = first_entry; in ext2_extattr_set_new_entry()
873 while (!EXT2_IS_LAST_ENTRY(entry)) { in ext2_extattr_set_new_entry()
874 if (!(attrnamespace - entry->e_name_index) && in ext2_extattr_set_new_entry()
875 !(name_len - entry->e_name_len)) in ext2_extattr_set_new_entry()
876 if (memcmp(name, entry->e_name, name_len) <= 0) in ext2_extattr_set_new_entry()
879 entry = EXT2_EXTATTR_NEXT(entry); in ext2_extattr_set_new_entry()
882 /* Create new entry and insert it */ in ext2_extattr_set_new_entry()
883 new_entry = allocate_entry(name, attrnamespace, 0, uio->uio_resid, 0); in ext2_extattr_set_new_entry()
884 memmove((char *)entry + EXT2_EXTATTR_LEN(new_entry->e_name_len), entry, in ext2_extattr_set_new_entry()
885 pad - (char*)entry); in ext2_extattr_set_new_entry()
887 memcpy(entry, new_entry, EXT2_EXTATTR_LEN(new_entry->e_name_len)); in ext2_extattr_set_new_entry()
890 new_entry = entry; in ext2_extattr_set_new_entry()
891 if (le32toh(new_entry->e_value_size) > 0) in ext2_extattr_set_new_entry()
892 new_entry->e_value_offs = htole16(min_offs - in ext2_extattr_set_new_entry()
893 EXT2_EXTATTR_SIZE(le32toh(new_entry->e_value_size))); in ext2_extattr_set_new_entry()
895 uiomove(off + le16toh(new_entry->e_value_offs), in ext2_extattr_set_new_entry()
896 le32toh(new_entry->e_value_size), uio); in ext2_extattr_set_new_entry()
903 const char *name, struct uio *uio) in ext2_extattr_inode_set() argument
908 struct ext2fs_extattr_entry *entry; in ext2_extattr_inode_set() local
914 fs = ip->i_e2fs; in ext2_extattr_inode_set()
916 if ((error = bread(ip->i_devvp, in ext2_extattr_inode_set()
917 fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), in ext2_extattr_inode_set()
918 (int)fs->e2fs_bsize, NOCRED, &bp)) != 0) { in ext2_extattr_inode_set()
924 ((char *)bp->b_data + in ext2_extattr_inode_set()
925 EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ip->i_number)); in ext2_extattr_inode_set()
929 E2FS_REV0_INODE_SIZE + le16toh(dinode->e2di_extra_isize)); in ext2_extattr_inode_set()
931 if (le32toh(header->h_magic) != EXTATTR_MAGIC) { in ext2_extattr_inode_set()
943 /* Find if entry exist */ in ext2_extattr_inode_set()
944 for (entry = EXT2_IFIRST(header); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_inode_set()
945 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_inode_set()
946 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_inode_set()
950 name_len = entry->e_name_len; in ext2_extattr_inode_set()
951 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_inode_set()
952 entry->e_name, &name_len); in ext2_extattr_inode_set()
958 if (strlen(name) == name_len && in ext2_extattr_inode_set()
959 0 == strncmp(attr_name, name, name_len)) in ext2_extattr_inode_set()
963 max_size = EXT2_INODE_SIZE(fs) - E2FS_REV0_INODE_SIZE - in ext2_extattr_inode_set()
964 le16toh(dinode->e2di_extra_isize); in ext2_extattr_inode_set()
966 if (!EXT2_IS_LAST_ENTRY(entry)) { in ext2_extattr_inode_set()
967 size = ext2_extattr_get_size(EXT2_IFIRST(header), entry, in ext2_extattr_inode_set()
969 entry->e_name_len, uio->uio_resid); in ext2_extattr_inode_set()
976 EXT2_IFIRST(header), entry, (char *)header + max_size, uio); in ext2_extattr_inode_set()
978 /* Ensure that the same entry does not exist in the block */ in ext2_extattr_inode_set()
979 if (ip->i_facl) { in ext2_extattr_inode_set()
980 error = ext2_extattr_block_get(ip, attrnamespace, name, in ext2_extattr_inode_set()
993 entry->e_name_len, uio->uio_resid); in ext2_extattr_inode_set()
1000 EXT2_IFIRST(header), name, attrnamespace, in ext2_extattr_inode_set()
1009 struct ext2fs_extattr_entry *entry) in ext2_extattr_hash_entry() argument
1012 char *name = entry->e_name; in ext2_extattr_hash_entry() local
1015 for (n=0; n < entry->e_name_len; n++) { in ext2_extattr_hash_entry()
1017 (hash >> (8*sizeof(hash) - EXT2_EXTATTR_NAME_HASH_SHIFT)) ^ in ext2_extattr_hash_entry()
1018 (*name++); in ext2_extattr_hash_entry()
1021 if (entry->e_value_block == 0 && entry->e_value_size != 0) { in ext2_extattr_hash_entry()
1023 le16toh(entry->e_value_offs)); in ext2_extattr_hash_entry()
1024 for (n = (le32toh(entry->e_value_size) + in ext2_extattr_hash_entry()
1025 EXT2_EXTATTR_ROUND) >> EXT2_EXTATTR_PAD_BITS; n; n--) { in ext2_extattr_hash_entry()
1027 (hash >> (8*sizeof(hash) - EXT2_EXTATTR_VALUE_HASH_SHIFT)) ^ in ext2_extattr_hash_entry()
1032 entry->e_hash = htole32(hash); in ext2_extattr_hash_entry()
1037 struct ext2fs_extattr_entry *entry) in ext2_extattr_rehash() argument
1042 ext2_extattr_hash_entry(header, entry); in ext2_extattr_rehash()
1046 if (here->e_hash == 0) { in ext2_extattr_rehash()
1047 /* Block is not shared if an entry's hash value == 0 */ in ext2_extattr_rehash()
1053 (hash >> (8*sizeof(hash) - EXT2_EXTATTR_BLOCK_HASH_SHIFT)) ^ in ext2_extattr_rehash()
1054 le32toh(here->e_hash); in ext2_extattr_rehash()
1059 header->h_hash = htole32(hash); in ext2_extattr_rehash()
1064 const char *name, struct uio *uio) in ext2_extattr_block_set() argument
1069 struct ext2fs_extattr_entry *entry; in ext2_extattr_block_set() local
1075 fs = ip->i_e2fs; in ext2_extattr_block_set()
1077 if (ip->i_facl) { in ext2_extattr_block_set()
1078 error = bread(ip->i_devvp, fsbtodb(fs, ip->i_facl), in ext2_extattr_block_set()
1079 fs->e2fs_bsize, NOCRED, &bp); in ext2_extattr_block_set()
1086 if (le32toh(header->h_magic) != EXTATTR_MAGIC || in ext2_extattr_block_set()
1087 le32toh(header->h_blocks) != 1) { in ext2_extattr_block_set()
1098 if (le32toh(header->h_refcount) > 1) { in ext2_extattr_block_set()
1108 /* Find if entry exist */ in ext2_extattr_block_set()
1109 for (entry = EXT2_FIRST_ENTRY(bp); !EXT2_IS_LAST_ENTRY(entry); in ext2_extattr_block_set()
1110 entry = EXT2_EXTATTR_NEXT(entry)) { in ext2_extattr_block_set()
1111 if (ext2_extattr_attrnamespace_to_bsd(entry->e_name_index) != in ext2_extattr_block_set()
1115 name_len = entry->e_name_len; in ext2_extattr_block_set()
1116 attr_name = ext2_extattr_name_to_bsd(entry->e_name_index, in ext2_extattr_block_set()
1117 entry->e_name, &name_len); in ext2_extattr_block_set()
1123 if (strlen(name) == name_len && in ext2_extattr_block_set()
1124 0 == strncmp(attr_name, name, name_len)) in ext2_extattr_block_set()
1128 if (!EXT2_IS_LAST_ENTRY(entry)) { in ext2_extattr_block_set()
1129 size = ext2_extattr_get_size(EXT2_FIRST_ENTRY(bp), entry, in ext2_extattr_block_set()
1131 entry->e_name_len, uio->uio_resid); in ext2_extattr_block_set()
1132 if (size > bp->b_bufsize) { in ext2_extattr_block_set()
1137 ext2_extattr_set_exist_entry(bp->b_data, EXT2_FIRST_ENTRY(bp), in ext2_extattr_block_set()
1138 entry, bp->b_data + bp->b_bufsize, uio); in ext2_extattr_block_set()
1142 strlen(name), uio->uio_resid); in ext2_extattr_block_set()
1143 if (size > bp->b_bufsize) { in ext2_extattr_block_set()
1148 entry = ext2_extattr_set_new_entry(bp->b_data, EXT2_FIRST_ENTRY(bp), in ext2_extattr_block_set()
1149 name, attrnamespace, bp->b_data + bp->b_bufsize, uio); in ext2_extattr_block_set()
1151 /* Clean the same entry in the inode */ in ext2_extattr_block_set()
1152 error = ext2_extattr_inode_delete(ip, attrnamespace, name); in ext2_extattr_block_set()
1159 ext2_extattr_rehash(header, entry); in ext2_extattr_block_set()
1167 strlen(ext2_extattr_name_to_linux(attrnamespace, name)), uio->uio_resid); in ext2_extattr_block_set()
1168 if (size > fs->e2fs_bsize) in ext2_extattr_block_set()
1171 /* Allocate block, fill EA header and insert entry */ in ext2_extattr_block_set()
1172 ip->i_facl = ext2_alloc_meta(ip); in ext2_extattr_block_set()
1173 if (0 == ip->i_facl) in ext2_extattr_block_set()
1176 ip->i_blocks += btodb(fs->e2fs_bsize); in ext2_extattr_block_set()
1177 ext2_update(ip->i_vnode, 1); in ext2_extattr_block_set()
1179 bp = getblk(ip->i_devvp, fsbtodb(fs, ip->i_facl), fs->e2fs_bsize, 0, 0, 0); in ext2_extattr_block_set()
1181 ext2_blkfree(ip, ip->i_facl, fs->e2fs_bsize); in ext2_extattr_block_set()
1182 ip->i_blocks -= btodb(fs->e2fs_bsize); in ext2_extattr_block_set()
1183 ip->i_facl = 0; in ext2_extattr_block_set()
1184 ext2_update(ip->i_vnode, 1); in ext2_extattr_block_set()
1189 header->h_magic = htole32(EXTATTR_MAGIC); in ext2_extattr_block_set()
1190 header->h_refcount = htole32(1); in ext2_extattr_block_set()
1191 header->h_blocks = htole32(1); in ext2_extattr_block_set()
1192 header->h_hash = 0; in ext2_extattr_block_set()
1193 memset(header->h_reserved, 0, sizeof(header->h_reserved)); in ext2_extattr_block_set()
1194 memcpy(bp->b_data, header, sizeof(struct ext2fs_extattr_header)); in ext2_extattr_block_set()
1197 entry = ext2_extattr_set_new_entry(bp->b_data, EXT2_FIRST_ENTRY(bp), in ext2_extattr_block_set()
1198 name, attrnamespace, bp->b_data + bp->b_bufsize, uio); in ext2_extattr_block_set()
1200 /* Clean the same entry in the inode */ in ext2_extattr_block_set()
1201 error = ext2_extattr_inode_delete(ip, attrnamespace, name); in ext2_extattr_block_set()
1207 ext2_extattr_rehash(header, entry); in ext2_extattr_block_set()
1220 fs = ip->i_e2fs; in ext2_extattr_free()
1222 if (!ip->i_facl) in ext2_extattr_free()
1225 error = bread(ip->i_devvp, fsbtodb(fs, ip->i_facl), in ext2_extattr_free()
1226 fs->e2fs_bsize, NOCRED, &bp); in ext2_extattr_free()
1233 if (le32toh(header->h_magic) != EXTATTR_MAGIC || in ext2_extattr_free()
1234 le32toh(header->h_blocks) != 1) { in ext2_extattr_free()
1240 bp->b_data + bp->b_bufsize); in ext2_extattr_free()
1246 if (le32toh(header->h_refcount) > 1) { in ext2_extattr_free()
1247 header->h_refcount = htole32(le32toh(header->h_refcount) - 1); in ext2_extattr_free()
1250 ext2_blkfree(ip, ip->i_facl, ip->i_e2fs->e2fs_bsize); in ext2_extattr_free()
1254 ip->i_blocks -= btodb(ip->i_e2fs->e2fs_bsize); in ext2_extattr_free()
1255 ip->i_facl = 0; in ext2_extattr_free()
1256 ext2_update(ip->i_vnode, 1); in ext2_extattr_free()