Lines Matching +full:loc +full:- +full:code
1 // SPDX-License-Identifier: GPL-2.0-only
8 * Lots of code in this file is copy from linux/fs/ext3/xattr.c.
9 * Copyright (C) 2001-2003 Andreas Gruenbacher, <agruen@suse.de>
79 - sizeof(struct ocfs2_xattr_header) \
80 - OCFS2_XATTR_HEADER_GAP)
81 #define OCFS2_XATTR_FREE_IN_BLOCK(ptr) ((ptr)->i_sb->s_blocksize \
82 - sizeof(struct ocfs2_xattr_block) \
83 - sizeof(struct ocfs2_xattr_header) \
84 - OCFS2_XATTR_HEADER_GAP)
134 int (*xlo_journal_access)(handle_t *handle, struct ocfs2_xa_loc *loc,
136 void (*xlo_journal_dirty)(handle_t *handle, struct ocfs2_xa_loc *loc);
139 * Return a pointer to the appropriate buffer in loc->xl_storage
140 * at the given offset from loc->xl_header.
142 void *(*xlo_offset_pointer)(struct ocfs2_xa_loc *loc, int offset);
145 int (*xlo_can_reuse)(struct ocfs2_xa_loc *loc,
149 int (*xlo_check_space)(struct ocfs2_xa_loc *loc,
154 * the start of our downward-filling free space.
156 int (*xlo_get_free_start)(struct ocfs2_xa_loc *loc);
162 void (*xlo_wipe_namevalue)(struct ocfs2_xa_loc *loc);
165 void (*xlo_add_entry)(struct ocfs2_xa_loc *loc, u32 name_hash);
168 void (*xlo_add_namevalue)(struct ocfs2_xa_loc *loc, int size);
174 void (*xlo_fill_value_buf)(struct ocfs2_xa_loc *loc,
180 * tracking the on-disk structure.
186 /* The ocfs2_xattr_header inside the on-disk storage. Not NULL. */
194 * NULL, this location describes the on-disk structure where it
224 return namevalue_size(xi->xi_name_len, xi->xi_value_len); in namevalue_size_xi()
229 u64 value_len = le64_to_cpu(xe->xe_value_size); in namevalue_size_xe()
233 return namevalue_size(xe->xe_name_len, value_len); in namevalue_size_xe()
304 return (1 << osb->s_clustersize_bits) / OCFS2_XATTR_BUCKET_SIZE; in ocfs2_xattr_buckets_per_cluster()
309 return OCFS2_XATTR_BUCKET_SIZE / (1 << sb->s_blocksize_bits); in ocfs2_blocks_per_xattr_bucket()
312 #define bucket_blkno(_b) ((_b)->bu_bhs[0]->b_blocknr)
313 #define bucket_block(_b, _n) ((_b)->bu_bhs[(_n)]->b_data)
319 int blks = ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_xattr_bucket_new()
325 bucket->bu_inode = inode; in ocfs2_xattr_bucket_new()
326 bucket->bu_blocks = blks; in ocfs2_xattr_bucket_new()
336 for (i = 0; i < bucket->bu_blocks; i++) { in ocfs2_xattr_bucket_relse()
337 brelse(bucket->bu_bhs[i]); in ocfs2_xattr_bucket_relse()
338 bucket->bu_bhs[i] = NULL; in ocfs2_xattr_bucket_relse()
346 bucket->bu_inode = NULL; in ocfs2_xattr_bucket_free()
362 for (i = 0; i < bucket->bu_blocks; i++) { in ocfs2_init_xattr_bucket()
363 bucket->bu_bhs[i] = sb_getblk(bucket->bu_inode->i_sb, in ocfs2_init_xattr_bucket()
365 if (!bucket->bu_bhs[i]) { in ocfs2_init_xattr_bucket()
366 rc = -ENOMEM; in ocfs2_init_xattr_bucket()
371 if (!ocfs2_buffer_uptodate(INODE_CACHE(bucket->bu_inode), in ocfs2_init_xattr_bucket()
372 bucket->bu_bhs[i])) { in ocfs2_init_xattr_bucket()
374 ocfs2_set_new_buffer_uptodate(INODE_CACHE(bucket->bu_inode), in ocfs2_init_xattr_bucket()
375 bucket->bu_bhs[i]); in ocfs2_init_xattr_bucket()
377 set_buffer_uptodate(bucket->bu_bhs[i]); in ocfs2_init_xattr_bucket()
378 ocfs2_set_buffer_uptodate(INODE_CACHE(bucket->bu_inode), in ocfs2_init_xattr_bucket()
379 bucket->bu_bhs[i]); in ocfs2_init_xattr_bucket()
395 rc = ocfs2_read_blocks(INODE_CACHE(bucket->bu_inode), xb_blkno, in ocfs2_read_xattr_bucket()
396 bucket->bu_blocks, bucket->bu_bhs, 0, in ocfs2_read_xattr_bucket()
399 spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock); in ocfs2_read_xattr_bucket()
400 rc = ocfs2_validate_meta_ecc_bhs(bucket->bu_inode->i_sb, in ocfs2_read_xattr_bucket()
401 bucket->bu_bhs, in ocfs2_read_xattr_bucket()
402 bucket->bu_blocks, in ocfs2_read_xattr_bucket()
403 &bucket_xh(bucket)->xh_check); in ocfs2_read_xattr_bucket()
404 spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock); in ocfs2_read_xattr_bucket()
420 for (i = 0; i < bucket->bu_blocks; i++) { in ocfs2_xattr_bucket_journal_access()
422 INODE_CACHE(bucket->bu_inode), in ocfs2_xattr_bucket_journal_access()
423 bucket->bu_bhs[i], type); in ocfs2_xattr_bucket_journal_access()
438 spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock); in ocfs2_xattr_bucket_journal_dirty()
439 ocfs2_compute_meta_ecc_bhs(bucket->bu_inode->i_sb, in ocfs2_xattr_bucket_journal_dirty()
440 bucket->bu_bhs, bucket->bu_blocks, in ocfs2_xattr_bucket_journal_dirty()
441 &bucket_xh(bucket)->xh_check); in ocfs2_xattr_bucket_journal_dirty()
442 spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock); in ocfs2_xattr_bucket_journal_dirty()
444 for (i = 0; i < bucket->bu_blocks; i++) in ocfs2_xattr_bucket_journal_dirty()
445 ocfs2_journal_dirty(handle, bucket->bu_bhs[i]); in ocfs2_xattr_bucket_journal_dirty()
452 int blocksize = src->bu_inode->i_sb->s_blocksize; in ocfs2_xattr_bucket_copy_data()
454 BUG_ON(dest->bu_blocks != src->bu_blocks); in ocfs2_xattr_bucket_copy_data()
455 BUG_ON(dest->bu_inode != src->bu_inode); in ocfs2_xattr_bucket_copy_data()
457 for (i = 0; i < src->bu_blocks; i++) { in ocfs2_xattr_bucket_copy_data()
468 (struct ocfs2_xattr_block *)bh->b_data; in ocfs2_validate_xattr_block()
470 trace_ocfs2_validate_xattr_block((unsigned long long)bh->b_blocknr); in ocfs2_validate_xattr_block()
479 rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &xb->xb_check); in ocfs2_validate_xattr_block()
490 (unsigned long long)bh->b_blocknr, 7, in ocfs2_validate_xattr_block()
491 xb->xb_signature); in ocfs2_validate_xattr_block()
494 if (le64_to_cpu(xb->xb_blkno) != bh->b_blocknr) { in ocfs2_validate_xattr_block()
497 (unsigned long long)bh->b_blocknr, in ocfs2_validate_xattr_block()
498 (unsigned long long)le64_to_cpu(xb->xb_blkno)); in ocfs2_validate_xattr_block()
501 if (le32_to_cpu(xb->xb_fs_generation) != OCFS2_SB(sb)->fs_generation) { in ocfs2_validate_xattr_block()
504 (unsigned long long)bh->b_blocknr, in ocfs2_validate_xattr_block()
505 le32_to_cpu(xb->xb_fs_generation)); in ocfs2_validate_xattr_block()
541 u32 hash = OCFS2_SB(inode->i_sb)->uuid_hash; in ocfs2_xattr_name_hash()
547 (hash >> (8*sizeof(hash) - OCFS2_HASH_SHIFT)) ^ in ocfs2_xattr_name_hash()
579 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_calc_security_init()
580 int s_size = ocfs2_xattr_entry_real_size(strlen(si->name), in ocfs2_calc_security_init()
581 si->value_len); in ocfs2_calc_security_init()
588 if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE || in ocfs2_calc_security_init()
599 if (si->value_len > OCFS2_XATTR_INLINE_SIZE) { in ocfs2_calc_security_init()
600 int new_clusters = ocfs2_clusters_for_bytes(dir->i_sb, in ocfs2_calc_security_init()
601 si->value_len); in ocfs2_calc_security_init()
603 *xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb, in ocfs2_calc_security_init()
619 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_calc_xattr_init()
622 if (si->enable) in ocfs2_calc_xattr_init()
623 s_size = ocfs2_xattr_entry_real_size(strlen(si->name), in ocfs2_calc_xattr_init()
624 si->value_len); in ocfs2_calc_xattr_init()
626 if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) { in ocfs2_calc_xattr_init()
627 down_read(&OCFS2_I(dir)->ip_xattr_sem); in ocfs2_calc_xattr_init()
631 up_read(&OCFS2_I(dir)->ip_xattr_sem); in ocfs2_calc_xattr_init()
636 } else if (acl_len != 0 && acl_len != -ENODATA) { in ocfs2_calc_xattr_init()
658 if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE || in ocfs2_calc_xattr_init()
665 if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE && in ocfs2_calc_xattr_init()
668 *xattr_credits += ocfs2_blocks_per_xattr_bucket(dir->i_sb); in ocfs2_calc_xattr_init()
675 if (si->enable && si->value_len > OCFS2_XATTR_INLINE_SIZE) { in ocfs2_calc_xattr_init()
676 new_clusters = ocfs2_clusters_for_bytes(dir->i_sb, in ocfs2_calc_xattr_init()
677 si->value_len); in ocfs2_calc_xattr_init()
678 *xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb, in ocfs2_calc_xattr_init()
682 if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL && in ocfs2_calc_xattr_init()
686 ocfs2_clusters_for_bytes(dir->i_sb, acl_len); in ocfs2_calc_xattr_init()
687 *xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb, in ocfs2_calc_xattr_init()
701 handle_t *handle = ctxt->handle; in ocfs2_xattr_extend_allocation()
703 u32 prev_clusters, logical_start = le32_to_cpu(vb->vb_xv->xr_clusters); in ocfs2_xattr_extend_allocation()
711 status = vb->vb_access(handle, INODE_CACHE(inode), vb->vb_bh, in ocfs2_xattr_extend_allocation()
718 prev_clusters = le32_to_cpu(vb->vb_xv->xr_clusters); in ocfs2_xattr_extend_allocation()
724 ctxt->data_ac, in ocfs2_xattr_extend_allocation()
725 ctxt->meta_ac, in ocfs2_xattr_extend_allocation()
727 if ((status < 0) && (status != -EAGAIN)) { in ocfs2_xattr_extend_allocation()
728 if (status != -ENOSPC) in ocfs2_xattr_extend_allocation()
733 ocfs2_journal_dirty(handle, vb->vb_bh); in ocfs2_xattr_extend_allocation()
735 clusters_to_add -= le32_to_cpu(vb->vb_xv->xr_clusters) - in ocfs2_xattr_extend_allocation()
745 credits = ocfs2_calc_extend_credits(inode->i_sb, in ocfs2_xattr_extend_allocation()
746 &vb->vb_xv->xr_list); in ocfs2_xattr_extend_allocation()
749 status = -ENOMEM; in ocfs2_xattr_extend_allocation()
766 u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos); in __ocfs2_remove_xattr_range()
767 handle_t *handle = ctxt->handle; in __ocfs2_remove_xattr_range()
772 ret = vb->vb_access(handle, INODE_CACHE(inode), vb->vb_bh, in __ocfs2_remove_xattr_range()
779 ret = ocfs2_remove_extent(handle, &et, cpos, len, ctxt->meta_ac, in __ocfs2_remove_xattr_range()
780 &ctxt->dealloc); in __ocfs2_remove_xattr_range()
786 le32_add_cpu(&vb->vb_xv->xr_clusters, -len); in __ocfs2_remove_xattr_range()
787 ocfs2_journal_dirty(handle, vb->vb_bh); in __ocfs2_remove_xattr_range()
791 ocfs2_blocks_to_clusters(inode->i_sb, in __ocfs2_remove_xattr_range()
793 len, ctxt->meta_ac, &ctxt->dealloc, 1); in __ocfs2_remove_xattr_range()
795 ret = ocfs2_cache_cluster_dealloc(&ctxt->dealloc, in __ocfs2_remove_xattr_range()
819 trunc_len = old_clusters - new_clusters; in ocfs2_xattr_shrink_size()
823 &vb->vb_xv->xr_list, &ext_flags); in ocfs2_xattr_shrink_size()
840 block = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos); in ocfs2_xattr_shrink_size()
844 trunc_len -= alloc_size; in ocfs2_xattr_shrink_size()
857 u32 new_clusters = ocfs2_clusters_for_bytes(inode->i_sb, len); in ocfs2_xattr_value_truncate()
858 u32 old_clusters = le32_to_cpu(vb->vb_xv->xr_clusters); in ocfs2_xattr_value_truncate()
865 new_clusters - old_clusters, in ocfs2_xattr_value_truncate()
887 if (OCFS2_SB(sb)->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR) in ocfs2_xattr_list_entry()
893 if (!(sb->s_flags & SB_POSIXACL)) in ocfs2_xattr_list_entry()
915 return -ERANGE; in ocfs2_xattr_list_entry()
932 for (i = 0 ; i < le16_to_cpu(header->xh_count); i++) { in ocfs2_xattr_list_entries()
933 struct ocfs2_xattr_entry *entry = &header->xh_entries[i]; in ocfs2_xattr_list_entries()
936 le16_to_cpu(entry->xe_name_offset); in ocfs2_xattr_list_entries()
938 ret = ocfs2_xattr_list_entry(inode->i_sb, in ocfs2_xattr_list_entries()
941 entry->xe_name_len); in ocfs2_xattr_list_entries()
956 ((void *)di + inode->i_sb->s_blocksize - in ocfs2_has_inline_xattr_value_outside()
957 le16_to_cpu(di->i_xattr_inline_size)); in ocfs2_has_inline_xattr_value_outside()
959 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) in ocfs2_has_inline_xattr_value_outside()
960 if (!ocfs2_xattr_is_local(&xh->xh_entries[i])) in ocfs2_has_inline_xattr_value_outside()
975 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) in ocfs2_xattr_ibody_list()
979 ((void *)di + inode->i_sb->s_blocksize - in ocfs2_xattr_ibody_list()
980 le16_to_cpu(di->i_xattr_inline_size)); in ocfs2_xattr_ibody_list()
996 if (!di->i_xattr_loc) in ocfs2_xattr_block_list()
999 ret = ocfs2_read_xattr_block(inode, le64_to_cpu(di->i_xattr_loc), in ocfs2_xattr_block_list()
1006 xb = (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_xattr_block_list()
1007 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { in ocfs2_xattr_block_list()
1008 struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header; in ocfs2_xattr_block_list()
1029 if (!ocfs2_supports_xattr(OCFS2_SB(dentry->d_sb))) in ocfs2_listxattr()
1030 return -EOPNOTSUPP; in ocfs2_listxattr()
1032 if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) in ocfs2_listxattr()
1041 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_listxattr()
1043 down_read(&oi->ip_xattr_sem); in ocfs2_listxattr()
1050 size -= i_ret; in ocfs2_listxattr()
1057 up_read(&oi->ip_xattr_sem); in ocfs2_listxattr()
1074 return -EINVAL; in ocfs2_xattr_find_entry()
1077 entry = xs->here; in ocfs2_xattr_find_entry()
1078 for (i = 0; i < le16_to_cpu(xs->header->xh_count); i++) { in ocfs2_xattr_find_entry()
1079 if ((void *)entry >= xs->end) { in ocfs2_xattr_find_entry()
1080 ocfs2_error(inode->i_sb, "corrupted xattr entries"); in ocfs2_xattr_find_entry()
1081 return -EFSCORRUPTED; in ocfs2_xattr_find_entry()
1083 cmp = name_index - ocfs2_xattr_get_type(entry); in ocfs2_xattr_find_entry()
1085 cmp = name_len - entry->xe_name_len; in ocfs2_xattr_find_entry()
1087 name_offset = le16_to_cpu(entry->xe_name_offset); in ocfs2_xattr_find_entry()
1088 if ((xs->base + name_offset + name_len) > xs->end) { in ocfs2_xattr_find_entry()
1089 ocfs2_error(inode->i_sb, in ocfs2_xattr_find_entry()
1091 return -EFSCORRUPTED; in ocfs2_xattr_find_entry()
1093 cmp = memcmp(name, (xs->base + name_offset), name_len); in ocfs2_xattr_find_entry()
1099 xs->here = entry; in ocfs2_xattr_find_entry()
1101 return cmp ? -ENODATA : 0; in ocfs2_xattr_find_entry()
1116 el = &xv->xr_list; in ocfs2_xattr_get_value_outside()
1117 clusters = le32_to_cpu(xv->xr_clusters); in ocfs2_xattr_get_value_outside()
1118 bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1); in ocfs2_xattr_get_value_outside()
1119 blocksize = inode->i_sb->s_blocksize; in ocfs2_xattr_get_value_outside()
1130 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster); in ocfs2_xattr_get_value_outside()
1141 memcpy(buffer, bh->b_data, cplen); in ocfs2_xattr_get_value_outside()
1142 len -= cplen; in ocfs2_xattr_get_value_outside()
1164 struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data; in ocfs2_xattr_ibody_get()
1169 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) in ocfs2_xattr_ibody_get()
1170 return -ENODATA; in ocfs2_xattr_ibody_get()
1172 xs->end = (void *)di + inode->i_sb->s_blocksize; in ocfs2_xattr_ibody_get()
1173 xs->header = (struct ocfs2_xattr_header *) in ocfs2_xattr_ibody_get()
1174 (xs->end - le16_to_cpu(di->i_xattr_inline_size)); in ocfs2_xattr_ibody_get()
1175 xs->base = (void *)xs->header; in ocfs2_xattr_ibody_get()
1176 xs->here = xs->header->xh_entries; in ocfs2_xattr_ibody_get()
1181 size = le64_to_cpu(xs->here->xe_value_size); in ocfs2_xattr_ibody_get()
1184 return -ERANGE; in ocfs2_xattr_ibody_get()
1185 if (ocfs2_xattr_is_local(xs->here)) { in ocfs2_xattr_ibody_get()
1186 memcpy(buffer, (void *)xs->base + in ocfs2_xattr_ibody_get()
1187 le16_to_cpu(xs->here->xe_name_offset) + in ocfs2_xattr_ibody_get()
1188 OCFS2_XATTR_SIZE(xs->here->xe_name_len), size); in ocfs2_xattr_ibody_get()
1191 (xs->base + le16_to_cpu( in ocfs2_xattr_ibody_get()
1192 xs->here->xe_name_offset) + in ocfs2_xattr_ibody_get()
1193 OCFS2_XATTR_SIZE(xs->here->xe_name_len)); in ocfs2_xattr_ibody_get()
1216 int ret = -ENODATA, name_offset, name_len, i; in ocfs2_xattr_block_get()
1219 xs->bucket = ocfs2_xattr_bucket_new(inode); in ocfs2_xattr_block_get()
1220 if (!xs->bucket) { in ocfs2_xattr_block_get()
1221 ret = -ENOMEM; in ocfs2_xattr_block_get()
1232 if (xs->not_found) { in ocfs2_xattr_block_get()
1233 ret = -ENODATA; in ocfs2_xattr_block_get()
1237 xb = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data; in ocfs2_xattr_block_get()
1238 size = le64_to_cpu(xs->here->xe_value_size); in ocfs2_xattr_block_get()
1240 ret = -ERANGE; in ocfs2_xattr_block_get()
1244 name_offset = le16_to_cpu(xs->here->xe_name_offset); in ocfs2_xattr_block_get()
1245 name_len = OCFS2_XATTR_SIZE(xs->here->xe_name_len); in ocfs2_xattr_block_get()
1246 i = xs->here - xs->header->xh_entries; in ocfs2_xattr_block_get()
1248 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) { in ocfs2_xattr_block_get()
1249 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb, in ocfs2_xattr_block_get()
1250 bucket_xh(xs->bucket), in ocfs2_xattr_block_get()
1258 xs->base = bucket_block(xs->bucket, block_off); in ocfs2_xattr_block_get()
1260 if (ocfs2_xattr_is_local(xs->here)) { in ocfs2_xattr_block_get()
1261 memcpy(buffer, (void *)xs->base + in ocfs2_xattr_block_get()
1265 (xs->base + name_offset + name_len); in ocfs2_xattr_block_get()
1276 ocfs2_xattr_bucket_free(xs->bucket); in ocfs2_xattr_block_get()
1278 brelse(xs->xattr_bh); in ocfs2_xattr_block_get()
1279 xs->xattr_bh = NULL; in ocfs2_xattr_block_get()
1294 .not_found = -ENODATA, in ocfs2_xattr_get_nolock()
1297 .not_found = -ENODATA, in ocfs2_xattr_get_nolock()
1300 if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb))) in ocfs2_xattr_get_nolock()
1301 return -EOPNOTSUPP; in ocfs2_xattr_get_nolock()
1303 if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) in ocfs2_xattr_get_nolock()
1304 return -ENODATA; in ocfs2_xattr_get_nolock()
1307 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_xattr_get_nolock()
1311 if (ret == -ENODATA && di->i_xattr_loc) in ocfs2_xattr_get_nolock()
1338 down_read(&OCFS2_I(inode)->ip_xattr_sem); in ocfs2_xattr_get()
1341 up_read(&OCFS2_I(inode)->ip_xattr_sem); in ocfs2_xattr_get()
1357 u16 blocksize = inode->i_sb->s_blocksize; in __ocfs2_xattr_set_value_outside()
1359 u32 cpos = 0, bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1); in __ocfs2_xattr_set_value_outside()
1360 u32 clusters = ocfs2_clusters_for_bytes(inode->i_sb, value_len); in __ocfs2_xattr_set_value_outside()
1364 struct ocfs2_xattr_value_root *xv = vb->vb_xv; in __ocfs2_xattr_set_value_outside()
1366 BUG_ON(clusters > le32_to_cpu(xv->xr_clusters)); in __ocfs2_xattr_set_value_outside()
1370 &num_clusters, &xv->xr_list, in __ocfs2_xattr_set_value_outside()
1379 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster); in __ocfs2_xattr_set_value_outside()
1399 memcpy(bh->b_data, value, cp_len); in __ocfs2_xattr_set_value_outside()
1400 value_len -= cp_len; in __ocfs2_xattr_set_value_outside()
1403 memset(bh->b_data + cp_len, 0, in __ocfs2_xattr_set_value_outside()
1404 blocksize - cp_len); in __ocfs2_xattr_set_value_outside()
1433 free_space = free_start - in ocfs2_xa_check_space_helper()
1434 sizeof(struct ocfs2_xattr_header) - in ocfs2_xa_check_space_helper()
1435 (num_entries * sizeof(struct ocfs2_xattr_entry)) - in ocfs2_xa_check_space_helper()
1438 return -EIO; in ocfs2_xa_check_space_helper()
1440 return -ENOSPC; in ocfs2_xa_check_space_helper()
1445 static int ocfs2_xa_journal_access(handle_t *handle, struct ocfs2_xa_loc *loc, in ocfs2_xa_journal_access() argument
1448 return loc->xl_ops->xlo_journal_access(handle, loc, type); in ocfs2_xa_journal_access()
1451 static void ocfs2_xa_journal_dirty(handle_t *handle, struct ocfs2_xa_loc *loc) in ocfs2_xa_journal_dirty() argument
1453 loc->xl_ops->xlo_journal_dirty(handle, loc); in ocfs2_xa_journal_dirty()
1457 static void *ocfs2_xa_offset_pointer(struct ocfs2_xa_loc *loc, int offset) in ocfs2_xa_offset_pointer() argument
1459 BUG_ON(offset >= loc->xl_size); in ocfs2_xa_offset_pointer()
1460 return loc->xl_ops->xlo_offset_pointer(loc, offset); in ocfs2_xa_offset_pointer()
1468 static void ocfs2_xa_wipe_namevalue(struct ocfs2_xa_loc *loc) in ocfs2_xa_wipe_namevalue() argument
1470 loc->xl_ops->xlo_wipe_namevalue(loc); in ocfs2_xa_wipe_namevalue()
1475 * downward-growing free space.
1477 static int ocfs2_xa_get_free_start(struct ocfs2_xa_loc *loc) in ocfs2_xa_get_free_start() argument
1479 return loc->xl_ops->xlo_get_free_start(loc); in ocfs2_xa_get_free_start()
1482 /* Can we reuse loc->xl_entry for xi? */
1483 static int ocfs2_xa_can_reuse_entry(struct ocfs2_xa_loc *loc, in ocfs2_xa_can_reuse_entry() argument
1486 return loc->xl_ops->xlo_can_reuse(loc, xi); in ocfs2_xa_can_reuse_entry()
1490 static int ocfs2_xa_check_space(struct ocfs2_xa_loc *loc, in ocfs2_xa_check_space() argument
1493 return loc->xl_ops->xlo_check_space(loc, xi); in ocfs2_xa_check_space()
1496 static void ocfs2_xa_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash) in ocfs2_xa_add_entry() argument
1498 loc->xl_ops->xlo_add_entry(loc, name_hash); in ocfs2_xa_add_entry()
1499 loc->xl_entry->xe_name_hash = cpu_to_le32(name_hash); in ocfs2_xa_add_entry()
1505 loc->xl_entry->xe_name_offset = cpu_to_le16(loc->xl_size); in ocfs2_xa_add_entry()
1508 static void ocfs2_xa_add_namevalue(struct ocfs2_xa_loc *loc, in ocfs2_xa_add_namevalue() argument
1515 loc->xl_ops->xlo_add_namevalue(loc, size); in ocfs2_xa_add_namevalue()
1516 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len); in ocfs2_xa_add_namevalue()
1517 loc->xl_entry->xe_name_len = xi->xi_name_len; in ocfs2_xa_add_namevalue()
1518 ocfs2_xattr_set_type(loc->xl_entry, xi->xi_name_index); in ocfs2_xa_add_namevalue()
1519 ocfs2_xattr_set_local(loc->xl_entry, in ocfs2_xa_add_namevalue()
1520 xi->xi_value_len <= OCFS2_XATTR_INLINE_SIZE); in ocfs2_xa_add_namevalue()
1522 nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset); in ocfs2_xa_add_namevalue()
1523 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset); in ocfs2_xa_add_namevalue()
1525 memcpy(nameval_buf, xi->xi_name, xi->xi_name_len); in ocfs2_xa_add_namevalue()
1528 static void ocfs2_xa_fill_value_buf(struct ocfs2_xa_loc *loc, in ocfs2_xa_fill_value_buf() argument
1531 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset); in ocfs2_xa_fill_value_buf()
1532 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len); in ocfs2_xa_fill_value_buf()
1535 BUG_ON(ocfs2_xattr_is_local(loc->xl_entry)); in ocfs2_xa_fill_value_buf()
1536 BUG_ON(namevalue_size_xe(loc->xl_entry) != in ocfs2_xa_fill_value_buf()
1539 loc->xl_ops->xlo_fill_value_buf(loc, vb); in ocfs2_xa_fill_value_buf()
1540 vb->vb_xv = in ocfs2_xa_fill_value_buf()
1541 (struct ocfs2_xattr_value_root *)ocfs2_xa_offset_pointer(loc, in ocfs2_xa_fill_value_buf()
1547 struct ocfs2_xa_loc *loc, int type) in ocfs2_xa_block_journal_access() argument
1549 struct buffer_head *bh = loc->xl_storage; in ocfs2_xa_block_journal_access()
1552 if (loc->xl_size == (bh->b_size - in ocfs2_xa_block_journal_access()
1558 return access(handle, INODE_CACHE(loc->xl_inode), bh, type); in ocfs2_xa_block_journal_access()
1562 struct ocfs2_xa_loc *loc) in ocfs2_xa_block_journal_dirty() argument
1564 struct buffer_head *bh = loc->xl_storage; in ocfs2_xa_block_journal_dirty()
1569 static void *ocfs2_xa_block_offset_pointer(struct ocfs2_xa_loc *loc, in ocfs2_xa_block_offset_pointer() argument
1572 return (char *)loc->xl_header + offset; in ocfs2_xa_block_offset_pointer()
1575 static int ocfs2_xa_block_can_reuse(struct ocfs2_xa_loc *loc, in ocfs2_xa_block_can_reuse() argument
1582 return namevalue_size_xe(loc->xl_entry) == in ocfs2_xa_block_can_reuse()
1586 static int ocfs2_xa_block_get_free_start(struct ocfs2_xa_loc *loc) in ocfs2_xa_block_get_free_start() argument
1588 struct ocfs2_xattr_header *xh = loc->xl_header; in ocfs2_xa_block_get_free_start()
1589 int i, count = le16_to_cpu(xh->xh_count); in ocfs2_xa_block_get_free_start()
1590 int offset, free_start = loc->xl_size; in ocfs2_xa_block_get_free_start()
1593 offset = le16_to_cpu(xh->xh_entries[i].xe_name_offset); in ocfs2_xa_block_get_free_start()
1601 static int ocfs2_xa_block_check_space(struct ocfs2_xa_loc *loc, in ocfs2_xa_block_check_space() argument
1604 int count = le16_to_cpu(loc->xl_header->xh_count); in ocfs2_xa_block_check_space()
1605 int free_start = ocfs2_xa_get_free_start(loc); in ocfs2_xa_block_check_space()
1613 if (loc->xl_entry) { in ocfs2_xa_block_check_space()
1615 if (ocfs2_xa_can_reuse_entry(loc, xi)) in ocfs2_xa_block_check_space()
1618 needed_space -= ocfs2_xe_entry_usage(loc->xl_entry); in ocfs2_xa_block_check_space()
1629 static void ocfs2_xa_block_wipe_namevalue(struct ocfs2_xa_loc *loc) in ocfs2_xa_block_wipe_namevalue() argument
1633 struct ocfs2_xattr_entry *entry = loc->xl_entry; in ocfs2_xa_block_wipe_namevalue()
1634 struct ocfs2_xattr_header *xh = loc->xl_header; in ocfs2_xa_block_wipe_namevalue()
1635 int count = le16_to_cpu(xh->xh_count); in ocfs2_xa_block_wipe_namevalue()
1637 namevalue_offset = le16_to_cpu(entry->xe_name_offset); in ocfs2_xa_block_wipe_namevalue()
1639 first_namevalue_offset = ocfs2_xa_get_free_start(loc); in ocfs2_xa_block_wipe_namevalue()
1644 namevalue_offset - first_namevalue_offset); in ocfs2_xa_block_wipe_namevalue()
1647 /* Now tell xh->xh_entries about it */ in ocfs2_xa_block_wipe_namevalue()
1649 offset = le16_to_cpu(xh->xh_entries[i].xe_name_offset); in ocfs2_xa_block_wipe_namevalue()
1651 le16_add_cpu(&xh->xh_entries[i].xe_name_offset, in ocfs2_xa_block_wipe_namevalue()
1657 * because they're not used in block-stored xattrs. in ocfs2_xa_block_wipe_namevalue()
1661 static void ocfs2_xa_block_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash) in ocfs2_xa_block_add_entry() argument
1663 int count = le16_to_cpu(loc->xl_header->xh_count); in ocfs2_xa_block_add_entry()
1664 loc->xl_entry = &(loc->xl_header->xh_entries[count]); in ocfs2_xa_block_add_entry()
1665 le16_add_cpu(&loc->xl_header->xh_count, 1); in ocfs2_xa_block_add_entry()
1666 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry)); in ocfs2_xa_block_add_entry()
1669 static void ocfs2_xa_block_add_namevalue(struct ocfs2_xa_loc *loc, int size) in ocfs2_xa_block_add_namevalue() argument
1671 int free_start = ocfs2_xa_get_free_start(loc); in ocfs2_xa_block_add_namevalue()
1673 loc->xl_entry->xe_name_offset = cpu_to_le16(free_start - size); in ocfs2_xa_block_add_namevalue()
1676 static void ocfs2_xa_block_fill_value_buf(struct ocfs2_xa_loc *loc, in ocfs2_xa_block_fill_value_buf() argument
1679 struct buffer_head *bh = loc->xl_storage; in ocfs2_xa_block_fill_value_buf()
1681 if (loc->xl_size == (bh->b_size - in ocfs2_xa_block_fill_value_buf()
1684 vb->vb_access = ocfs2_journal_access_xb; in ocfs2_xa_block_fill_value_buf()
1686 vb->vb_access = ocfs2_journal_access_di; in ocfs2_xa_block_fill_value_buf()
1687 vb->vb_bh = bh; in ocfs2_xa_block_fill_value_buf()
1708 struct ocfs2_xa_loc *loc, int type) in ocfs2_xa_bucket_journal_access() argument
1710 struct ocfs2_xattr_bucket *bucket = loc->xl_storage; in ocfs2_xa_bucket_journal_access()
1716 struct ocfs2_xa_loc *loc) in ocfs2_xa_bucket_journal_dirty() argument
1718 struct ocfs2_xattr_bucket *bucket = loc->xl_storage; in ocfs2_xa_bucket_journal_dirty()
1723 static void *ocfs2_xa_bucket_offset_pointer(struct ocfs2_xa_loc *loc, in ocfs2_xa_bucket_offset_pointer() argument
1726 struct ocfs2_xattr_bucket *bucket = loc->xl_storage; in ocfs2_xa_bucket_offset_pointer()
1730 block = offset >> loc->xl_inode->i_sb->s_blocksize_bits; in ocfs2_xa_bucket_offset_pointer()
1731 block_offset = offset % loc->xl_inode->i_sb->s_blocksize; in ocfs2_xa_bucket_offset_pointer()
1736 static int ocfs2_xa_bucket_can_reuse(struct ocfs2_xa_loc *loc, in ocfs2_xa_bucket_can_reuse() argument
1739 return namevalue_size_xe(loc->xl_entry) >= in ocfs2_xa_bucket_can_reuse()
1743 static int ocfs2_xa_bucket_get_free_start(struct ocfs2_xa_loc *loc) in ocfs2_xa_bucket_get_free_start() argument
1745 struct ocfs2_xattr_bucket *bucket = loc->xl_storage; in ocfs2_xa_bucket_get_free_start()
1746 return le16_to_cpu(bucket_xh(bucket)->xh_free_start); in ocfs2_xa_bucket_get_free_start()
1756 if (((free_start - size) >> sb->s_blocksize_bits) != in ocfs2_bucket_align_free_start()
1757 ((free_start - 1) >> sb->s_blocksize_bits)) in ocfs2_bucket_align_free_start()
1758 free_start -= free_start % sb->s_blocksize; in ocfs2_bucket_align_free_start()
1763 static int ocfs2_xa_bucket_check_space(struct ocfs2_xa_loc *loc, in ocfs2_xa_bucket_check_space() argument
1767 int count = le16_to_cpu(loc->xl_header->xh_count); in ocfs2_xa_bucket_check_space()
1768 int free_start = ocfs2_xa_get_free_start(loc); in ocfs2_xa_bucket_check_space()
1771 struct super_block *sb = loc->xl_inode->i_sb; in ocfs2_xa_bucket_check_space()
1779 if (loc->xl_entry) { in ocfs2_xa_bucket_check_space()
1781 if (ocfs2_xa_can_reuse_entry(loc, xi)) in ocfs2_xa_bucket_check_space()
1784 needed_space -= sizeof(struct ocfs2_xattr_entry); in ocfs2_xa_bucket_check_space()
1790 return -ENOSPC; in ocfs2_xa_bucket_check_space()
1808 static void ocfs2_xa_bucket_wipe_namevalue(struct ocfs2_xa_loc *loc) in ocfs2_xa_bucket_wipe_namevalue() argument
1810 le16_add_cpu(&loc->xl_header->xh_name_value_len, in ocfs2_xa_bucket_wipe_namevalue()
1811 -namevalue_size_xe(loc->xl_entry)); in ocfs2_xa_bucket_wipe_namevalue()
1814 static void ocfs2_xa_bucket_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash) in ocfs2_xa_bucket_add_entry() argument
1816 struct ocfs2_xattr_header *xh = loc->xl_header; in ocfs2_xa_bucket_add_entry()
1817 int count = le16_to_cpu(xh->xh_count); in ocfs2_xa_bucket_add_entry()
1818 int low = 0, high = count - 1, tmp; in ocfs2_xa_bucket_add_entry()
1827 tmp_xe = &xh->xh_entries[tmp]; in ocfs2_xa_bucket_add_entry()
1829 if (name_hash > le32_to_cpu(tmp_xe->xe_name_hash)) in ocfs2_xa_bucket_add_entry()
1831 else if (name_hash < le32_to_cpu(tmp_xe->xe_name_hash)) in ocfs2_xa_bucket_add_entry()
1832 high = tmp - 1; in ocfs2_xa_bucket_add_entry()
1840 memmove(&xh->xh_entries[low + 1], in ocfs2_xa_bucket_add_entry()
1841 &xh->xh_entries[low], in ocfs2_xa_bucket_add_entry()
1842 ((count - low) * sizeof(struct ocfs2_xattr_entry))); in ocfs2_xa_bucket_add_entry()
1844 le16_add_cpu(&xh->xh_count, 1); in ocfs2_xa_bucket_add_entry()
1845 loc->xl_entry = &xh->xh_entries[low]; in ocfs2_xa_bucket_add_entry()
1846 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry)); in ocfs2_xa_bucket_add_entry()
1849 static void ocfs2_xa_bucket_add_namevalue(struct ocfs2_xa_loc *loc, int size) in ocfs2_xa_bucket_add_namevalue() argument
1851 int free_start = ocfs2_xa_get_free_start(loc); in ocfs2_xa_bucket_add_namevalue()
1852 struct ocfs2_xattr_header *xh = loc->xl_header; in ocfs2_xa_bucket_add_namevalue()
1853 struct super_block *sb = loc->xl_inode->i_sb; in ocfs2_xa_bucket_add_namevalue()
1857 nameval_offset = free_start - size; in ocfs2_xa_bucket_add_namevalue()
1858 loc->xl_entry->xe_name_offset = cpu_to_le16(nameval_offset); in ocfs2_xa_bucket_add_namevalue()
1859 xh->xh_free_start = cpu_to_le16(nameval_offset); in ocfs2_xa_bucket_add_namevalue()
1860 le16_add_cpu(&xh->xh_name_value_len, size); in ocfs2_xa_bucket_add_namevalue()
1864 static void ocfs2_xa_bucket_fill_value_buf(struct ocfs2_xa_loc *loc, in ocfs2_xa_bucket_fill_value_buf() argument
1867 struct ocfs2_xattr_bucket *bucket = loc->xl_storage; in ocfs2_xa_bucket_fill_value_buf()
1868 struct super_block *sb = loc->xl_inode->i_sb; in ocfs2_xa_bucket_fill_value_buf()
1869 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset); in ocfs2_xa_bucket_fill_value_buf()
1870 int size = namevalue_size_xe(loc->xl_entry); in ocfs2_xa_bucket_fill_value_buf()
1871 int block_offset = nameval_offset >> sb->s_blocksize_bits; in ocfs2_xa_bucket_fill_value_buf()
1875 ((nameval_offset + size - 1) >> sb->s_blocksize_bits)); in ocfs2_xa_bucket_fill_value_buf()
1877 BUG_ON(!bucket->bu_bhs[block_offset]); in ocfs2_xa_bucket_fill_value_buf()
1879 vb->vb_access = ocfs2_journal_access; in ocfs2_xa_bucket_fill_value_buf()
1880 vb->vb_bh = bucket->bu_bhs[block_offset]; in ocfs2_xa_bucket_fill_value_buf()
1897 static unsigned int ocfs2_xa_value_clusters(struct ocfs2_xa_loc *loc) in ocfs2_xa_value_clusters() argument
1901 if (ocfs2_xattr_is_local(loc->xl_entry)) in ocfs2_xa_value_clusters()
1904 ocfs2_xa_fill_value_buf(loc, &vb); in ocfs2_xa_value_clusters()
1905 return le32_to_cpu(vb.vb_xv->xr_clusters); in ocfs2_xa_value_clusters()
1908 static int ocfs2_xa_value_truncate(struct ocfs2_xa_loc *loc, u64 bytes, in ocfs2_xa_value_truncate() argument
1914 ocfs2_xa_fill_value_buf(loc, &vb); in ocfs2_xa_value_truncate()
1915 trunc_rc = ocfs2_xattr_value_truncate(loc->xl_inode, &vb, bytes, in ocfs2_xa_value_truncate()
1920 * ocfs2_xa_journal_access on the loc. However, The truncate code in ocfs2_xa_value_truncate()
1923 * could leave only vb->vb_bh set up for journaling. Meanwhile, in ocfs2_xa_value_truncate()
1928 access_rc = ocfs2_xa_journal_access(ctxt->handle, loc, in ocfs2_xa_value_truncate()
1935 static void ocfs2_xa_remove_entry(struct ocfs2_xa_loc *loc) in ocfs2_xa_remove_entry() argument
1938 struct ocfs2_xattr_header *xh = loc->xl_header; in ocfs2_xa_remove_entry()
1939 struct ocfs2_xattr_entry *entry = loc->xl_entry; in ocfs2_xa_remove_entry()
1941 ocfs2_xa_wipe_namevalue(loc); in ocfs2_xa_remove_entry()
1942 loc->xl_entry = NULL; in ocfs2_xa_remove_entry()
1944 le16_add_cpu(&xh->xh_count, -1); in ocfs2_xa_remove_entry()
1945 count = le16_to_cpu(xh->xh_count); in ocfs2_xa_remove_entry()
1953 index = ((char *)entry - (char *)&xh->xh_entries) / in ocfs2_xa_remove_entry()
1955 memmove(&xh->xh_entries[index], &xh->xh_entries[index + 1], in ocfs2_xa_remove_entry()
1956 (count - index) * sizeof(struct ocfs2_xattr_entry)); in ocfs2_xa_remove_entry()
1957 memset(&xh->xh_entries[count], 0, in ocfs2_xa_remove_entry()
1986 static void ocfs2_xa_cleanup_value_truncate(struct ocfs2_xa_loc *loc, in ocfs2_xa_cleanup_value_truncate() argument
1990 unsigned int new_clusters = ocfs2_xa_value_clusters(loc); in ocfs2_xa_cleanup_value_truncate()
1991 char *nameval_buf = ocfs2_xa_offset_pointer(loc, in ocfs2_xa_cleanup_value_truncate()
1992 le16_to_cpu(loc->xl_entry->xe_name_offset)); in ocfs2_xa_cleanup_value_truncate()
1998 what, loc->xl_entry->xe_name_len, nameval_buf, in ocfs2_xa_cleanup_value_truncate()
1999 orig_clusters - new_clusters); in ocfs2_xa_cleanup_value_truncate()
2000 ocfs2_xa_remove_entry(loc); in ocfs2_xa_cleanup_value_truncate()
2006 loc->xl_entry->xe_name_len, nameval_buf, in ocfs2_xa_cleanup_value_truncate()
2007 new_clusters - orig_clusters); in ocfs2_xa_cleanup_value_truncate()
2008 ocfs2_xa_remove_entry(loc); in ocfs2_xa_cleanup_value_truncate()
2014 loc->xl_entry->xe_name_len, nameval_buf, in ocfs2_xa_cleanup_value_truncate()
2015 new_clusters - orig_clusters); in ocfs2_xa_cleanup_value_truncate()
2018 static int ocfs2_xa_remove(struct ocfs2_xa_loc *loc, in ocfs2_xa_remove() argument
2024 if (!ocfs2_xattr_is_local(loc->xl_entry)) { in ocfs2_xa_remove()
2025 orig_clusters = ocfs2_xa_value_clusters(loc); in ocfs2_xa_remove()
2026 rc = ocfs2_xa_value_truncate(loc, 0, ctxt); in ocfs2_xa_remove()
2035 if (orig_clusters != ocfs2_xa_value_clusters(loc)) in ocfs2_xa_remove()
2037 ocfs2_xa_cleanup_value_truncate(loc, "removing", in ocfs2_xa_remove()
2043 ocfs2_xa_remove_entry(loc); in ocfs2_xa_remove()
2049 static void ocfs2_xa_install_value_root(struct ocfs2_xa_loc *loc) in ocfs2_xa_install_value_root() argument
2051 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len); in ocfs2_xa_install_value_root()
2054 nameval_buf = ocfs2_xa_offset_pointer(loc, in ocfs2_xa_install_value_root()
2055 le16_to_cpu(loc->xl_entry->xe_name_offset)); in ocfs2_xa_install_value_root()
2064 static int ocfs2_xa_reuse_entry(struct ocfs2_xa_loc *loc, in ocfs2_xa_reuse_entry() argument
2069 int name_size = OCFS2_XATTR_SIZE(xi->xi_name_len); in ocfs2_xa_reuse_entry()
2072 int xe_local = ocfs2_xattr_is_local(loc->xl_entry); in ocfs2_xa_reuse_entry()
2073 int xi_local = xi->xi_value_len <= OCFS2_XATTR_INLINE_SIZE; in ocfs2_xa_reuse_entry()
2075 BUG_ON(OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len) != in ocfs2_xa_reuse_entry()
2078 nameval_buf = ocfs2_xa_offset_pointer(loc, in ocfs2_xa_reuse_entry()
2079 le16_to_cpu(loc->xl_entry->xe_name_offset)); in ocfs2_xa_reuse_entry()
2082 namevalue_size_xe(loc->xl_entry) - name_size); in ocfs2_xa_reuse_entry()
2084 ocfs2_xa_install_value_root(loc); in ocfs2_xa_reuse_entry()
2086 orig_clusters = ocfs2_xa_value_clusters(loc); in ocfs2_xa_reuse_entry()
2088 rc = ocfs2_xa_value_truncate(loc, 0, ctxt); in ocfs2_xa_reuse_entry()
2093 namevalue_size_xe(loc->xl_entry) - in ocfs2_xa_reuse_entry()
2095 } else if (le64_to_cpu(loc->xl_entry->xe_value_size) > in ocfs2_xa_reuse_entry()
2096 xi->xi_value_len) { in ocfs2_xa_reuse_entry()
2097 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, in ocfs2_xa_reuse_entry()
2104 ocfs2_xa_cleanup_value_truncate(loc, "reusing", in ocfs2_xa_reuse_entry()
2110 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len); in ocfs2_xa_reuse_entry()
2111 ocfs2_xattr_set_local(loc->xl_entry, xi_local); in ocfs2_xa_reuse_entry()
2118 * Prepares loc->xl_entry to receive the new xattr. This includes
2119 * properly setting up the name+value pair region. If loc->xl_entry
2125 static int ocfs2_xa_prepare_entry(struct ocfs2_xa_loc *loc, in ocfs2_xa_prepare_entry() argument
2134 rc = ocfs2_xa_check_space(loc, xi); in ocfs2_xa_prepare_entry()
2138 if (loc->xl_entry) { in ocfs2_xa_prepare_entry()
2139 if (ocfs2_xa_can_reuse_entry(loc, xi)) { in ocfs2_xa_prepare_entry()
2140 orig_value_size = loc->xl_entry->xe_value_size; in ocfs2_xa_prepare_entry()
2141 rc = ocfs2_xa_reuse_entry(loc, xi, ctxt); in ocfs2_xa_prepare_entry()
2147 if (!ocfs2_xattr_is_local(loc->xl_entry)) { in ocfs2_xa_prepare_entry()
2148 orig_clusters = ocfs2_xa_value_clusters(loc); in ocfs2_xa_prepare_entry()
2149 rc = ocfs2_xa_value_truncate(loc, 0, ctxt); in ocfs2_xa_prepare_entry()
2152 ocfs2_xa_cleanup_value_truncate(loc, in ocfs2_xa_prepare_entry()
2158 ocfs2_xa_wipe_namevalue(loc); in ocfs2_xa_prepare_entry()
2160 ocfs2_xa_add_entry(loc, name_hash); in ocfs2_xa_prepare_entry()
2166 ocfs2_xa_add_namevalue(loc, xi); in ocfs2_xa_prepare_entry()
2167 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) in ocfs2_xa_prepare_entry()
2168 ocfs2_xa_install_value_root(loc); in ocfs2_xa_prepare_entry()
2171 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) { in ocfs2_xa_prepare_entry()
2172 orig_clusters = ocfs2_xa_value_clusters(loc); in ocfs2_xa_prepare_entry()
2173 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, ctxt); in ocfs2_xa_prepare_entry()
2175 ctxt->set_abort = 1; in ocfs2_xa_prepare_entry()
2176 ocfs2_xa_cleanup_value_truncate(loc, "growing", in ocfs2_xa_prepare_entry()
2184 if (loc->xl_entry) { in ocfs2_xa_prepare_entry()
2186 loc->xl_entry->xe_value_size = orig_value_size; in ocfs2_xa_prepare_entry()
2201 static int ocfs2_xa_store_value(struct ocfs2_xa_loc *loc, in ocfs2_xa_store_value() argument
2206 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset); in ocfs2_xa_store_value()
2207 int name_size = OCFS2_XATTR_SIZE(xi->xi_name_len); in ocfs2_xa_store_value()
2211 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset); in ocfs2_xa_store_value()
2212 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) { in ocfs2_xa_store_value()
2213 ocfs2_xa_fill_value_buf(loc, &vb); in ocfs2_xa_store_value()
2214 rc = __ocfs2_xattr_set_value_outside(loc->xl_inode, in ocfs2_xa_store_value()
2215 ctxt->handle, &vb, in ocfs2_xa_store_value()
2216 xi->xi_value, in ocfs2_xa_store_value()
2217 xi->xi_value_len); in ocfs2_xa_store_value()
2219 memcpy(nameval_buf + name_size, xi->xi_value, xi->xi_value_len); in ocfs2_xa_store_value()
2224 static int ocfs2_xa_set(struct ocfs2_xa_loc *loc, in ocfs2_xa_set() argument
2229 u32 name_hash = ocfs2_xattr_name_hash(loc->xl_inode, xi->xi_name, in ocfs2_xa_set()
2230 xi->xi_name_len); in ocfs2_xa_set()
2232 ret = ocfs2_xa_journal_access(ctxt->handle, loc, in ocfs2_xa_set()
2246 if (!xi->xi_value) { in ocfs2_xa_set()
2247 ret = ocfs2_xa_remove(loc, ctxt); in ocfs2_xa_set()
2251 ret = ocfs2_xa_prepare_entry(loc, xi, name_hash, ctxt); in ocfs2_xa_set()
2253 if (ret != -ENOSPC) in ocfs2_xa_set()
2258 ret = ocfs2_xa_store_value(loc, xi, ctxt); in ocfs2_xa_set()
2263 ocfs2_xa_journal_dirty(ctxt->handle, loc); in ocfs2_xa_set()
2269 static void ocfs2_init_dinode_xa_loc(struct ocfs2_xa_loc *loc, in ocfs2_init_dinode_xa_loc() argument
2274 struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data; in ocfs2_init_dinode_xa_loc()
2276 BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_XATTR_FL)); in ocfs2_init_dinode_xa_loc()
2278 loc->xl_inode = inode; in ocfs2_init_dinode_xa_loc()
2279 loc->xl_ops = &ocfs2_xa_block_loc_ops; in ocfs2_init_dinode_xa_loc()
2280 loc->xl_storage = bh; in ocfs2_init_dinode_xa_loc()
2281 loc->xl_entry = entry; in ocfs2_init_dinode_xa_loc()
2282 loc->xl_size = le16_to_cpu(di->i_xattr_inline_size); in ocfs2_init_dinode_xa_loc()
2283 loc->xl_header = in ocfs2_init_dinode_xa_loc()
2284 (struct ocfs2_xattr_header *)(bh->b_data + bh->b_size - in ocfs2_init_dinode_xa_loc()
2285 loc->xl_size); in ocfs2_init_dinode_xa_loc()
2288 static void ocfs2_init_xattr_block_xa_loc(struct ocfs2_xa_loc *loc, in ocfs2_init_xattr_block_xa_loc() argument
2294 (struct ocfs2_xattr_block *)bh->b_data; in ocfs2_init_xattr_block_xa_loc()
2296 BUG_ON(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED); in ocfs2_init_xattr_block_xa_loc()
2298 loc->xl_inode = inode; in ocfs2_init_xattr_block_xa_loc()
2299 loc->xl_ops = &ocfs2_xa_block_loc_ops; in ocfs2_init_xattr_block_xa_loc()
2300 loc->xl_storage = bh; in ocfs2_init_xattr_block_xa_loc()
2301 loc->xl_header = &(xb->xb_attrs.xb_header); in ocfs2_init_xattr_block_xa_loc()
2302 loc->xl_entry = entry; in ocfs2_init_xattr_block_xa_loc()
2303 loc->xl_size = bh->b_size - offsetof(struct ocfs2_xattr_block, in ocfs2_init_xattr_block_xa_loc()
2307 static void ocfs2_init_xattr_bucket_xa_loc(struct ocfs2_xa_loc *loc, in ocfs2_init_xattr_bucket_xa_loc() argument
2311 loc->xl_inode = bucket->bu_inode; in ocfs2_init_xattr_bucket_xa_loc()
2312 loc->xl_ops = &ocfs2_xa_bucket_loc_ops; in ocfs2_init_xattr_bucket_xa_loc()
2313 loc->xl_storage = bucket; in ocfs2_init_xattr_bucket_xa_loc()
2314 loc->xl_header = bucket_xh(bucket); in ocfs2_init_xattr_bucket_xa_loc()
2315 loc->xl_entry = entry; in ocfs2_init_xattr_bucket_xa_loc()
2316 loc->xl_size = OCFS2_XATTR_BUCKET_SIZE; in ocfs2_init_xattr_bucket_xa_loc()
2337 &xv->xr_list, in ocfs2_lock_xattr_remove_allocators()
2355 ret = ocfs2_reserve_new_metadata_blocks(OCFS2_SB(inode->i_sb), in ocfs2_lock_xattr_remove_allocators()
2371 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_remove_value_outside()
2377 for (i = 0; i < le16_to_cpu(header->xh_count); i++) { in ocfs2_remove_value_outside()
2378 struct ocfs2_xattr_entry *entry = &header->xh_entries[i]; in ocfs2_remove_value_outside()
2384 le16_to_cpu(entry->xe_name_offset); in ocfs2_remove_value_outside()
2385 vb->vb_xv = (struct ocfs2_xattr_value_root *) in ocfs2_remove_value_outside()
2386 (val + OCFS2_XATTR_SIZE(entry->xe_name_len)); in ocfs2_remove_value_outside()
2388 ret = ocfs2_lock_xattr_remove_allocators(inode, vb->vb_xv, in ocfs2_remove_value_outside()
2394 ocfs2_remove_extent_credits(osb->sb)); in ocfs2_remove_value_outside()
2429 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_xattr_ibody_remove()
2438 ((void *)di + inode->i_sb->s_blocksize - in ocfs2_xattr_ibody_remove()
2439 le16_to_cpu(di->i_xattr_inline_size)); in ocfs2_xattr_ibody_remove()
2468 xb = (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_xattr_block_remove()
2469 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { in ocfs2_xattr_block_remove()
2470 struct ocfs2_xattr_header *header = &(xb->xb_attrs.xb_header); in ocfs2_xattr_block_remove()
2491 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_xattr_free_block()
2509 xb = (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_xattr_free_block()
2510 blk = le64_to_cpu(xb->xb_blkno); in ocfs2_xattr_free_block()
2511 bit = le16_to_cpu(xb->xb_suballoc_bit); in ocfs2_xattr_free_block()
2512 if (xb->xb_suballoc_loc) in ocfs2_xattr_free_block()
2513 bg_blkno = le64_to_cpu(xb->xb_suballoc_loc); in ocfs2_xattr_free_block()
2519 le16_to_cpu(xb->xb_suballoc_slot)); in ocfs2_xattr_free_block()
2521 ret = -ENOMEM; in ocfs2_xattr_free_block()
2565 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_xattr_remove()
2572 if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb))) in ocfs2_xattr_remove()
2575 if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) in ocfs2_xattr_remove()
2579 ret = ocfs2_lock_refcount_tree(OCFS2_SB(inode->i_sb), in ocfs2_xattr_remove()
2580 le64_to_cpu(di->i_refcount_loc), in ocfs2_xattr_remove()
2586 ref_ci = &ref_tree->rf_ci; in ocfs2_xattr_remove()
2590 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) { in ocfs2_xattr_remove()
2599 if (di->i_xattr_loc) { in ocfs2_xattr_remove()
2601 le64_to_cpu(di->i_xattr_loc), in ocfs2_xattr_remove()
2609 handle = ocfs2_start_trans((OCFS2_SB(inode->i_sb)), in ocfs2_xattr_remove()
2623 di->i_xattr_loc = 0; in ocfs2_xattr_remove()
2625 spin_lock(&oi->ip_lock); in ocfs2_xattr_remove()
2626 oi->ip_dyn_features &= ~(OCFS2_INLINE_XATTR_FL | OCFS2_HAS_XATTR_FL); in ocfs2_xattr_remove()
2627 di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features); in ocfs2_xattr_remove()
2628 spin_unlock(&oi->ip_lock); in ocfs2_xattr_remove()
2633 ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle); in ocfs2_xattr_remove()
2636 ocfs2_unlock_refcount_tree(OCFS2_SB(inode->i_sb), ref_tree, 1); in ocfs2_xattr_remove()
2645 unsigned int xattrsize = OCFS2_SB(inode->i_sb)->s_xattr_inline_size; in ocfs2_xattr_has_space_inline()
2651 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_xattr_has_space_inline()
2652 struct ocfs2_inline_data *idata = &di->id2.i_data; in ocfs2_xattr_has_space_inline()
2653 free = le16_to_cpu(idata->id_count) - le64_to_cpu(di->i_size); in ocfs2_xattr_has_space_inline()
2655 free = ocfs2_fast_symlink_chars(inode->i_sb) - in ocfs2_xattr_has_space_inline()
2656 le64_to_cpu(di->i_size); in ocfs2_xattr_has_space_inline()
2658 struct ocfs2_extent_list *el = &di->id2.i_list; in ocfs2_xattr_has_space_inline()
2659 free = (le16_to_cpu(el->l_count) - in ocfs2_xattr_has_space_inline()
2660 le16_to_cpu(el->l_next_free_rec)) * in ocfs2_xattr_has_space_inline()
2681 struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data; in ocfs2_xattr_ibody_find()
2685 if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE) in ocfs2_xattr_ibody_find()
2688 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) { in ocfs2_xattr_ibody_find()
2689 down_read(&oi->ip_alloc_sem); in ocfs2_xattr_ibody_find()
2691 up_read(&oi->ip_alloc_sem); in ocfs2_xattr_ibody_find()
2696 xs->xattr_bh = xs->inode_bh; in ocfs2_xattr_ibody_find()
2697 xs->end = (void *)di + inode->i_sb->s_blocksize; in ocfs2_xattr_ibody_find()
2698 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) in ocfs2_xattr_ibody_find()
2699 xs->header = (struct ocfs2_xattr_header *) in ocfs2_xattr_ibody_find()
2700 (xs->end - le16_to_cpu(di->i_xattr_inline_size)); in ocfs2_xattr_ibody_find()
2702 xs->header = (struct ocfs2_xattr_header *) in ocfs2_xattr_ibody_find()
2703 (xs->end - OCFS2_SB(inode->i_sb)->s_xattr_inline_size); in ocfs2_xattr_ibody_find()
2704 xs->base = (void *)xs->header; in ocfs2_xattr_ibody_find()
2705 xs->here = xs->header->xh_entries; in ocfs2_xattr_ibody_find()
2708 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) { in ocfs2_xattr_ibody_find()
2710 if (ret && ret != -ENODATA) in ocfs2_xattr_ibody_find()
2712 xs->not_found = ret; in ocfs2_xattr_ibody_find()
2724 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_xattr_ibody_init()
2725 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_xattr_ibody_init()
2726 unsigned int xattrsize = osb->s_xattr_inline_size; in ocfs2_xattr_ibody_init()
2729 ret = -ENOSPC; in ocfs2_xattr_ibody_init()
2733 ret = ocfs2_journal_access_di(ctxt->handle, INODE_CACHE(inode), di_bh, in ocfs2_xattr_ibody_init()
2744 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_xattr_ibody_init()
2745 struct ocfs2_inline_data *idata = &di->id2.i_data; in ocfs2_xattr_ibody_init()
2746 le16_add_cpu(&idata->id_count, -xattrsize); in ocfs2_xattr_ibody_init()
2748 struct ocfs2_extent_list *el = &di->id2.i_list; in ocfs2_xattr_ibody_init()
2749 le16_add_cpu(&el->l_count, -(xattrsize / in ocfs2_xattr_ibody_init()
2752 di->i_xattr_inline_size = cpu_to_le16(xattrsize); in ocfs2_xattr_ibody_init()
2754 spin_lock(&oi->ip_lock); in ocfs2_xattr_ibody_init()
2755 oi->ip_dyn_features |= OCFS2_INLINE_XATTR_FL|OCFS2_HAS_XATTR_FL; in ocfs2_xattr_ibody_init()
2756 di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features); in ocfs2_xattr_ibody_init()
2757 spin_unlock(&oi->ip_lock); in ocfs2_xattr_ibody_init()
2759 ocfs2_journal_dirty(ctxt->handle, di_bh); in ocfs2_xattr_ibody_init()
2778 struct ocfs2_xa_loc loc; in ocfs2_xattr_ibody_set() local
2780 if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE) in ocfs2_xattr_ibody_set()
2781 return -ENOSPC; in ocfs2_xattr_ibody_set()
2783 down_write(&oi->ip_alloc_sem); in ocfs2_xattr_ibody_set()
2784 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) { in ocfs2_xattr_ibody_set()
2785 ret = ocfs2_xattr_ibody_init(inode, xs->inode_bh, ctxt); in ocfs2_xattr_ibody_set()
2787 if (ret != -ENOSPC) in ocfs2_xattr_ibody_set()
2793 ocfs2_init_dinode_xa_loc(&loc, inode, xs->inode_bh, in ocfs2_xattr_ibody_set()
2794 xs->not_found ? NULL : xs->here); in ocfs2_xattr_ibody_set()
2795 ret = ocfs2_xa_set(&loc, xi, ctxt); in ocfs2_xattr_ibody_set()
2797 if (ret != -ENOSPC) in ocfs2_xattr_ibody_set()
2801 xs->here = loc.xl_entry; in ocfs2_xattr_ibody_set()
2804 up_write(&oi->ip_alloc_sem); in ocfs2_xattr_ibody_set()
2820 struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data; in ocfs2_xattr_block_find()
2825 if (!di->i_xattr_loc) in ocfs2_xattr_block_find()
2828 ret = ocfs2_read_xattr_block(inode, le64_to_cpu(di->i_xattr_loc), in ocfs2_xattr_block_find()
2835 xs->xattr_bh = blk_bh; in ocfs2_xattr_block_find()
2836 xb = (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_xattr_block_find()
2838 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { in ocfs2_xattr_block_find()
2839 xs->header = &xb->xb_attrs.xb_header; in ocfs2_xattr_block_find()
2840 xs->base = (void *)xs->header; in ocfs2_xattr_block_find()
2841 xs->end = (void *)(blk_bh->b_data) + blk_bh->b_size; in ocfs2_xattr_block_find()
2842 xs->here = xs->header->xh_entries; in ocfs2_xattr_block_find()
2850 if (ret && ret != -ENODATA) { in ocfs2_xattr_block_find()
2851 xs->xattr_bh = NULL; in ocfs2_xattr_block_find()
2854 xs->not_found = ret; in ocfs2_xattr_block_find()
2872 struct ocfs2_dinode *di = (struct ocfs2_dinode *)inode_bh->b_data; in ocfs2_create_xattr_block()
2876 ret = ocfs2_journal_access_di(ctxt->handle, INODE_CACHE(inode), in ocfs2_create_xattr_block()
2883 ret = ocfs2_claim_metadata(ctxt->handle, ctxt->meta_ac, 1, in ocfs2_create_xattr_block()
2891 new_bh = sb_getblk(inode->i_sb, first_blkno); in ocfs2_create_xattr_block()
2893 ret = -ENOMEM; in ocfs2_create_xattr_block()
2900 ret = ocfs2_journal_access_xb(ctxt->handle, INODE_CACHE(inode), in ocfs2_create_xattr_block()
2909 xblk = (struct ocfs2_xattr_block *)new_bh->b_data; in ocfs2_create_xattr_block()
2910 memset(xblk, 0, inode->i_sb->s_blocksize); in ocfs2_create_xattr_block()
2912 xblk->xb_suballoc_slot = cpu_to_le16(ctxt->meta_ac->ac_alloc_slot); in ocfs2_create_xattr_block()
2913 xblk->xb_suballoc_loc = cpu_to_le64(suballoc_loc); in ocfs2_create_xattr_block()
2914 xblk->xb_suballoc_bit = cpu_to_le16(suballoc_bit_start); in ocfs2_create_xattr_block()
2915 xblk->xb_fs_generation = in ocfs2_create_xattr_block()
2916 cpu_to_le32(OCFS2_SB(inode->i_sb)->fs_generation); in ocfs2_create_xattr_block()
2917 xblk->xb_blkno = cpu_to_le64(first_blkno); in ocfs2_create_xattr_block()
2919 struct ocfs2_xattr_tree_root *xr = &xblk->xb_attrs.xb_root; in ocfs2_create_xattr_block()
2920 xr->xt_clusters = cpu_to_le32(1); in ocfs2_create_xattr_block()
2921 xr->xt_last_eb_blk = 0; in ocfs2_create_xattr_block()
2922 xr->xt_list.l_tree_depth = 0; in ocfs2_create_xattr_block()
2923 xr->xt_list.l_count = cpu_to_le16( in ocfs2_create_xattr_block()
2924 ocfs2_xattr_recs_per_xb(inode->i_sb)); in ocfs2_create_xattr_block()
2925 xr->xt_list.l_next_free_rec = cpu_to_le16(1); in ocfs2_create_xattr_block()
2926 xblk->xb_flags = cpu_to_le16(OCFS2_XATTR_INDEXED); in ocfs2_create_xattr_block()
2928 ocfs2_journal_dirty(ctxt->handle, new_bh); in ocfs2_create_xattr_block()
2931 di->i_xattr_loc = cpu_to_le64(first_blkno); in ocfs2_create_xattr_block()
2933 spin_lock(&OCFS2_I(inode)->ip_lock); in ocfs2_create_xattr_block()
2934 OCFS2_I(inode)->ip_dyn_features |= OCFS2_HAS_XATTR_FL; in ocfs2_create_xattr_block()
2935 di->i_dyn_features = cpu_to_le16(OCFS2_I(inode)->ip_dyn_features); in ocfs2_create_xattr_block()
2936 spin_unlock(&OCFS2_I(inode)->ip_lock); in ocfs2_create_xattr_block()
2938 ocfs2_journal_dirty(ctxt->handle, inode_bh); in ocfs2_create_xattr_block()
2962 struct ocfs2_xa_loc loc; in ocfs2_xattr_block_set() local
2964 if (!xs->xattr_bh) { in ocfs2_xattr_block_set()
2965 ret = ocfs2_create_xattr_block(inode, xs->inode_bh, ctxt, in ocfs2_xattr_block_set()
2972 xs->xattr_bh = new_bh; in ocfs2_xattr_block_set()
2973 xblk = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data; in ocfs2_xattr_block_set()
2974 xs->header = &xblk->xb_attrs.xb_header; in ocfs2_xattr_block_set()
2975 xs->base = (void *)xs->header; in ocfs2_xattr_block_set()
2976 xs->end = (void *)xblk + inode->i_sb->s_blocksize; in ocfs2_xattr_block_set()
2977 xs->here = xs->header->xh_entries; in ocfs2_xattr_block_set()
2979 xblk = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data; in ocfs2_xattr_block_set()
2981 if (!(le16_to_cpu(xblk->xb_flags) & OCFS2_XATTR_INDEXED)) { in ocfs2_xattr_block_set()
2982 ocfs2_init_xattr_block_xa_loc(&loc, inode, xs->xattr_bh, in ocfs2_xattr_block_set()
2983 xs->not_found ? NULL : xs->here); in ocfs2_xattr_block_set()
2985 ret = ocfs2_xa_set(&loc, xi, ctxt); in ocfs2_xattr_block_set()
2987 xs->here = loc.xl_entry; in ocfs2_xattr_block_set()
2988 else if ((ret != -ENOSPC) || ctxt->set_abort) in ocfs2_xattr_block_set()
2997 if (le16_to_cpu(xblk->xb_flags) & OCFS2_XATTR_INDEXED) in ocfs2_xattr_block_set()
3011 size_t min_offs = xs->end - xs->base; in ocfs2_xattr_can_be_in_inode()
3013 if (!xs->header) in ocfs2_xattr_can_be_in_inode()
3016 last = xs->header->xh_entries; in ocfs2_xattr_can_be_in_inode()
3018 for (i = 0; i < le16_to_cpu(xs->header->xh_count); i++) { in ocfs2_xattr_can_be_in_inode()
3019 size_t offs = le16_to_cpu(last->xe_name_offset); in ocfs2_xattr_can_be_in_inode()
3025 free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP; in ocfs2_xattr_can_be_in_inode()
3029 BUG_ON(!xs->not_found); in ocfs2_xattr_can_be_in_inode()
3054 u32 new_clusters = ocfs2_clusters_for_bytes(inode->i_sb, in ocfs2_calc_xattr_set_need()
3055 xi->xi_value_len); in ocfs2_calc_xattr_set_need()
3063 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) in ocfs2_calc_xattr_set_need()
3065 ocfs2_clusters_to_blocks(inode->i_sb, 1); in ocfs2_calc_xattr_set_need()
3067 if (xis->not_found && xbs->not_found) { in ocfs2_calc_xattr_set_need()
3068 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_calc_xattr_set_need()
3070 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) { in ocfs2_calc_xattr_set_need()
3072 credits += ocfs2_calc_extend_credits(inode->i_sb, in ocfs2_calc_xattr_set_need()
3079 if (!xis->not_found) { in ocfs2_calc_xattr_set_need()
3080 xe = xis->here; in ocfs2_calc_xattr_set_need()
3081 name_offset = le16_to_cpu(xe->xe_name_offset); in ocfs2_calc_xattr_set_need()
3082 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len); in ocfs2_calc_xattr_set_need()
3083 base = xis->base; in ocfs2_calc_xattr_set_need()
3087 xb = (struct ocfs2_xattr_block *)xbs->xattr_bh->b_data; in ocfs2_calc_xattr_set_need()
3088 xe = xbs->here; in ocfs2_calc_xattr_set_need()
3089 name_offset = le16_to_cpu(xe->xe_name_offset); in ocfs2_calc_xattr_set_need()
3090 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len); in ocfs2_calc_xattr_set_need()
3091 i = xbs->here - xbs->header->xh_entries; in ocfs2_calc_xattr_set_need()
3094 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) { in ocfs2_calc_xattr_set_need()
3095 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb, in ocfs2_calc_xattr_set_need()
3096 bucket_xh(xbs->bucket), in ocfs2_calc_xattr_set_need()
3099 base = bucket_block(xbs->bucket, block_off); in ocfs2_calc_xattr_set_need()
3100 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_calc_xattr_set_need()
3102 base = xbs->base; in ocfs2_calc_xattr_set_need()
3114 if (!xi->xi_value) { in ocfs2_calc_xattr_set_need()
3116 credits += ocfs2_remove_extent_credits(inode->i_sb); in ocfs2_calc_xattr_set_need()
3122 value_size = le64_to_cpu(xe->xe_value_size); in ocfs2_calc_xattr_set_need()
3133 credits += ocfs2_remove_extent_credits(inode->i_sb) + in ocfs2_calc_xattr_set_need()
3137 inode->i_sb, in ocfs2_calc_xattr_set_need()
3143 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) { in ocfs2_calc_xattr_set_need()
3148 old_clusters = ocfs2_clusters_for_bytes(inode->i_sb, in ocfs2_calc_xattr_set_need()
3157 credits += ocfs2_remove_extent_credits(inode->i_sb); in ocfs2_calc_xattr_set_need()
3160 meta_add += ocfs2_extend_meta_needed(&xv->xr_list); in ocfs2_calc_xattr_set_need()
3161 clusters_add += new_clusters - old_clusters; in ocfs2_calc_xattr_set_need()
3162 credits += ocfs2_calc_extend_credits(inode->i_sb, in ocfs2_calc_xattr_set_need()
3163 &xv->xr_list); in ocfs2_calc_xattr_set_need()
3175 (value_size >= xi->xi_value_len)) || in ocfs2_calc_xattr_set_need()
3177 OCFS2_XATTR_ROOT_SIZE >= xi->xi_value_len)) in ocfs2_calc_xattr_set_need()
3183 if (di->i_xattr_loc) { in ocfs2_calc_xattr_set_need()
3184 if (!xbs->xattr_bh) { in ocfs2_calc_xattr_set_need()
3186 le64_to_cpu(di->i_xattr_loc), in ocfs2_calc_xattr_set_need()
3193 xb = (struct ocfs2_xattr_block *)bh->b_data; in ocfs2_calc_xattr_set_need()
3195 xb = (struct ocfs2_xattr_block *)xbs->xattr_bh->b_data; in ocfs2_calc_xattr_set_need()
3199 * like other b-trees. Otherwise we may have the chance of in ocfs2_calc_xattr_set_need()
3204 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) { in ocfs2_calc_xattr_set_need()
3206 &xb->xb_attrs.xb_root.xt_list; in ocfs2_calc_xattr_set_need()
3208 credits += ocfs2_calc_extend_credits(inode->i_sb, in ocfs2_calc_xattr_set_need()
3221 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_calc_xattr_set_need()
3223 OCFS2_SB(inode->i_sb)->s_clustersize) { in ocfs2_calc_xattr_set_need()
3224 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_calc_xattr_set_need()
3229 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) { in ocfs2_calc_xattr_set_need()
3232 credits += ocfs2_calc_extend_credits(inode->i_sb, in ocfs2_calc_xattr_set_need()
3259 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_init_xattr_set_ctxt()
3263 ocfs2_init_dealloc_ctxt(&ctxt->dealloc); in ocfs2_init_xattr_set_ctxt()
3273 trace_ocfs2_init_xattr_set_ctxt(xi->xi_name, meta_add, in ocfs2_init_xattr_set_ctxt()
3278 &ctxt->meta_ac); in ocfs2_init_xattr_set_ctxt()
3286 ret = ocfs2_reserve_clusters(osb, clusters_add, &ctxt->data_ac); in ocfs2_init_xattr_set_ctxt()
3292 if (ctxt->meta_ac) { in ocfs2_init_xattr_set_ctxt()
3293 ocfs2_free_alloc_context(ctxt->meta_ac); in ocfs2_init_xattr_set_ctxt()
3294 ctxt->meta_ac = NULL; in ocfs2_init_xattr_set_ctxt()
3298 * We cannot have an error and a non null ctxt->data_ac. in ocfs2_init_xattr_set_ctxt()
3314 if (!xi->xi_value) { in __ocfs2_xattr_set_handle()
3316 if (!xis->not_found) in __ocfs2_xattr_set_handle()
3318 else if (!xbs->not_found) in __ocfs2_xattr_set_handle()
3323 if (!ret && !xbs->not_found) { in __ocfs2_xattr_set_handle()
3328 xi->xi_value = NULL; in __ocfs2_xattr_set_handle()
3329 xi->xi_value_len = 0; in __ocfs2_xattr_set_handle()
3331 old_found = xis->not_found; in __ocfs2_xattr_set_handle()
3332 xis->not_found = -ENODATA; in __ocfs2_xattr_set_handle()
3341 xis->not_found = old_found; in __ocfs2_xattr_set_handle()
3347 ret = ocfs2_extend_trans(ctxt->handle, credits); in __ocfs2_xattr_set_handle()
3353 } else if ((ret == -ENOSPC) && !ctxt->set_abort) { in __ocfs2_xattr_set_handle()
3354 if (di->i_xattr_loc && !xbs->xattr_bh) { in __ocfs2_xattr_set_handle()
3356 xi->xi_name_index, in __ocfs2_xattr_set_handle()
3357 xi->xi_name, xbs); in __ocfs2_xattr_set_handle()
3361 old_found = xis->not_found; in __ocfs2_xattr_set_handle()
3362 xis->not_found = -ENODATA; in __ocfs2_xattr_set_handle()
3371 xis->not_found = old_found; in __ocfs2_xattr_set_handle()
3377 ret = ocfs2_extend_trans(ctxt->handle, credits); in __ocfs2_xattr_set_handle()
3390 if (!xis->not_found) { in __ocfs2_xattr_set_handle()
3395 xi->xi_value = NULL; in __ocfs2_xattr_set_handle()
3396 xi->xi_value_len = 0; in __ocfs2_xattr_set_handle()
3397 xbs->not_found = -ENODATA; in __ocfs2_xattr_set_handle()
3411 ret = ocfs2_extend_trans(ctxt->handle, credits); in __ocfs2_xattr_set_handle()
3424 ret = ocfs2_journal_access_di(ctxt->handle, INODE_CACHE(inode), in __ocfs2_xattr_set_handle()
3425 xis->inode_bh, in __ocfs2_xattr_set_handle()
3433 di->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); in __ocfs2_xattr_set_handle()
3434 di->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); in __ocfs2_xattr_set_handle()
3435 ocfs2_journal_dirty(ctxt->handle, xis->inode_bh); in __ocfs2_xattr_set_handle()
3469 .not_found = -ENODATA, in ocfs2_xattr_set_handle()
3473 .not_found = -ENODATA, in ocfs2_xattr_set_handle()
3482 if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb))) in ocfs2_xattr_set_handle()
3483 return -EOPNOTSUPP; in ocfs2_xattr_set_handle()
3490 if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE) { in ocfs2_xattr_set_handle()
3493 mlog_errno(-ENOMEM); in ocfs2_xattr_set_handle()
3494 return -ENOMEM; in ocfs2_xattr_set_handle()
3499 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_xattr_set_handle()
3501 down_write(&OCFS2_I(inode)->ip_xattr_sem); in ocfs2_xattr_set_handle()
3515 up_write(&OCFS2_I(inode)->ip_xattr_sem); in ocfs2_xattr_set_handle()
3539 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_xattr_set()
3540 struct inode *tl_inode = osb->osb_tl_inode; in ocfs2_xattr_set()
3554 .not_found = -ENODATA, in ocfs2_xattr_set()
3558 .not_found = -ENODATA, in ocfs2_xattr_set()
3562 return -EOPNOTSUPP; in ocfs2_xattr_set()
3570 mlog_errno(-ENOMEM); in ocfs2_xattr_set()
3571 return -ENOMEM; in ocfs2_xattr_set()
3581 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_xattr_set()
3583 down_write(&OCFS2_I(inode)->ip_xattr_sem); in ocfs2_xattr_set()
3598 ret = -ENODATA; in ocfs2_xattr_set()
3605 ret = -EEXIST; in ocfs2_xattr_set()
3667 up_write(&OCFS2_I(inode)->ip_xattr_sem); in ocfs2_xattr_set()
3700 if (el->l_tree_depth) { in ocfs2_xattr_get_rec()
3708 eb = (struct ocfs2_extent_block *) eb_bh->b_data; in ocfs2_xattr_get_rec()
3709 el = &eb->h_list; in ocfs2_xattr_get_rec()
3711 if (el->l_tree_depth) { in ocfs2_xattr_get_rec()
3712 ret = ocfs2_error(inode->i_sb, in ocfs2_xattr_get_rec()
3714 inode->i_ino, in ocfs2_xattr_get_rec()
3715 (unsigned long long)eb_bh->b_blocknr); in ocfs2_xattr_get_rec()
3720 for (i = le16_to_cpu(el->l_next_free_rec) - 1; i >= 0; i--) { in ocfs2_xattr_get_rec()
3721 rec = &el->l_recs[i]; in ocfs2_xattr_get_rec()
3723 if (le32_to_cpu(rec->e_cpos) <= name_hash) { in ocfs2_xattr_get_rec()
3724 e_blkno = le64_to_cpu(rec->e_blkno); in ocfs2_xattr_get_rec()
3730 ret = ocfs2_error(inode->i_sb, "Inode %lu has bad extent record (%u, %u, 0) in xattr\n", in ocfs2_xattr_get_rec()
3731 inode->i_ino, in ocfs2_xattr_get_rec()
3732 le32_to_cpu(rec->e_cpos), in ocfs2_xattr_get_rec()
3737 *p_blkno = le64_to_cpu(rec->e_blkno); in ocfs2_xattr_get_rec()
3738 *num_clusters = le16_to_cpu(rec->e_leaf_clusters); in ocfs2_xattr_get_rec()
3740 *e_cpos = le32_to_cpu(rec->e_cpos); in ocfs2_xattr_get_rec()
3768 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) { in ocfs2_find_xe_in_bucket()
3769 xe = &xh->xh_entries[i]; in ocfs2_find_xe_in_bucket()
3771 if (name_hash > le32_to_cpu(xe->xe_name_hash)) in ocfs2_find_xe_in_bucket()
3773 else if (name_hash < le32_to_cpu(xe->xe_name_hash)) in ocfs2_find_xe_in_bucket()
3776 cmp = name_index - ocfs2_xattr_get_type(xe); in ocfs2_find_xe_in_bucket()
3778 cmp = name_len - xe->xe_name_len; in ocfs2_find_xe_in_bucket()
3782 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb, in ocfs2_find_xe_in_bucket()
3827 u16 blk_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_xattr_bucket_find()
3834 ret = -ENOMEM; in ocfs2_xattr_bucket_find()
3846 high_bucket = le16_to_cpu(xh->xh_num_buckets) - 1; in ocfs2_xattr_bucket_find()
3859 xe = &xh->xh_entries[0]; in ocfs2_xattr_bucket_find()
3860 if (name_hash < le32_to_cpu(xe->xe_name_hash)) { in ocfs2_xattr_bucket_find()
3861 high_bucket = bucket - 1; in ocfs2_xattr_bucket_find()
3870 if (xh->xh_count) in ocfs2_xattr_bucket_find()
3871 xe = &xh->xh_entries[le16_to_cpu(xh->xh_count) - 1]; in ocfs2_xattr_bucket_find()
3876 if (name_hash > le32_to_cpu(xe->xe_name_hash)) { in ocfs2_xattr_bucket_find()
3900 /* This should be in cache - we just read it during the search */ in ocfs2_xattr_bucket_find()
3901 ret = ocfs2_read_xattr_bucket(xs->bucket, lower_blkno); in ocfs2_xattr_bucket_find()
3907 xs->header = bucket_xh(xs->bucket); in ocfs2_xattr_bucket_find()
3908 xs->base = bucket_block(xs->bucket, 0); in ocfs2_xattr_bucket_find()
3909 xs->end = xs->base + inode->i_sb->s_blocksize; in ocfs2_xattr_bucket_find()
3912 xs->here = &xs->header->xh_entries[index]; in ocfs2_xattr_bucket_find()
3913 trace_ocfs2_xattr_bucket_find(OCFS2_I(inode)->ip_blkno, in ocfs2_xattr_bucket_find()
3915 (unsigned long long)bucket_blkno(xs->bucket), in ocfs2_xattr_bucket_find()
3918 ret = -ENODATA; in ocfs2_xattr_bucket_find()
3933 (struct ocfs2_xattr_block *)root_bh->b_data; in ocfs2_xattr_index_block_find()
3934 struct ocfs2_xattr_tree_root *xb_root = &xb->xb_attrs.xb_root; in ocfs2_xattr_index_block_find()
3935 struct ocfs2_extent_list *el = &xb_root->xt_list; in ocfs2_xattr_index_block_find()
3940 if (le16_to_cpu(el->l_next_free_rec) == 0) in ocfs2_xattr_index_block_find()
3941 return -ENODATA; in ocfs2_xattr_index_block_find()
3943 trace_ocfs2_xattr_index_block_find(OCFS2_I(inode)->ip_blkno, in ocfs2_xattr_index_block_find()
3945 (unsigned long long)root_bh->b_blocknr, in ocfs2_xattr_index_block_find()
3946 -1); in ocfs2_xattr_index_block_find()
3957 trace_ocfs2_xattr_index_block_find_rec(OCFS2_I(inode)->ip_blkno, in ocfs2_xattr_index_block_find()
3976 u32 bpc = ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb)); in ocfs2_iterate_xattr_buckets()
3982 mlog_errno(-ENOMEM); in ocfs2_iterate_xattr_buckets()
3983 return -ENOMEM; in ocfs2_iterate_xattr_buckets()
3987 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_iterate_xattr_buckets()
3990 for (i = 0; i < num_buckets; i++, blkno += bucket->bu_blocks) { in ocfs2_iterate_xattr_buckets()
4002 num_buckets = le16_to_cpu(bucket_xh(bucket)->xh_num_buckets); in ocfs2_iterate_xattr_buckets()
4005 le32_to_cpu(bucket_xh(bucket)->xh_entries[0].xe_name_hash)); in ocfs2_iterate_xattr_buckets()
4008 if (ret && ret != -ERANGE) in ocfs2_iterate_xattr_buckets()
4036 if (index < 0 || index >= le16_to_cpu(xh->xh_count)) in ocfs2_xattr_bucket_get_name_value()
4037 return -EINVAL; in ocfs2_xattr_bucket_get_name_value()
4039 name_offset = le16_to_cpu(xh->xh_entries[index].xe_name_offset); in ocfs2_xattr_bucket_get_name_value()
4041 *block_off = name_offset >> sb->s_blocksize_bits; in ocfs2_xattr_bucket_get_name_value()
4042 *new_offset = name_offset % sb->s_blocksize; in ocfs2_xattr_bucket_get_name_value()
4056 for (i = 0 ; i < le16_to_cpu(bucket_xh(bucket)->xh_count); i++) { in ocfs2_list_xattr_bucket()
4057 struct ocfs2_xattr_entry *entry = &bucket_xh(bucket)->xh_entries[i]; in ocfs2_list_xattr_bucket()
4060 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb, in ocfs2_list_xattr_bucket()
4070 ret = ocfs2_xattr_list_entry(inode->i_sb, in ocfs2_list_xattr_bucket()
4071 xl->buffer, in ocfs2_list_xattr_bucket()
4072 xl->buffer_size, in ocfs2_list_xattr_bucket()
4073 &xl->result, in ocfs2_list_xattr_bucket()
4075 entry->xe_name_len); in ocfs2_list_xattr_bucket()
4089 (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_iterate_xattr_index_block()
4090 struct ocfs2_extent_list *el = &xb->xb_attrs.xb_root.xt_list; in ocfs2_iterate_xattr_index_block()
4095 if (!el->l_next_free_rec || !rec_func) in ocfs2_iterate_xattr_index_block()
4109 if (ret != -ERANGE) in ocfs2_iterate_xattr_index_block()
4117 name_hash = e_cpos - 1; in ocfs2_iterate_xattr_index_block()
4159 u32 l_hash = le32_to_cpu(l->xe_name_hash); in cmp_xe()
4160 u32 r_hash = le32_to_cpu(r->xe_name_hash); in cmp_xe()
4165 return -1; in cmp_xe()
4181 int i, blocksize = inode->i_sb->s_blocksize; in ocfs2_cp_xattr_block_to_bucket()
4182 int blks = ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_cp_xattr_block_to_bucket()
4186 (struct ocfs2_xattr_block *)xb_bh->b_data; in ocfs2_cp_xattr_block_to_bucket()
4187 struct ocfs2_xattr_header *xb_xh = &xb->xb_attrs.xb_header; in ocfs2_cp_xattr_block_to_bucket()
4189 u16 count = le16_to_cpu(xb_xh->xh_count); in ocfs2_cp_xattr_block_to_bucket()
4190 char *src = xb_bh->b_data; in ocfs2_cp_xattr_block_to_bucket()
4191 char *target = bucket_block(bucket, blks - 1); in ocfs2_cp_xattr_block_to_bucket()
4194 (unsigned long long)xb_bh->b_blocknr, in ocfs2_cp_xattr_block_to_bucket()
4206 xe = &xb_xh->xh_entries[count - 1]; in ocfs2_cp_xattr_block_to_bucket()
4207 offset = le16_to_cpu(xe->xe_name_offset) + off_change; in ocfs2_cp_xattr_block_to_bucket()
4208 size = blocksize - offset; in ocfs2_cp_xattr_block_to_bucket()
4214 xh->xh_count = xb_xh->xh_count; in ocfs2_cp_xattr_block_to_bucket()
4215 xh->xh_num_buckets = cpu_to_le16(1); in ocfs2_cp_xattr_block_to_bucket()
4216 xh->xh_name_value_len = cpu_to_le16(size); in ocfs2_cp_xattr_block_to_bucket()
4217 xh->xh_free_start = cpu_to_le16(OCFS2_XATTR_BUCKET_SIZE - size); in ocfs2_cp_xattr_block_to_bucket()
4226 off_change = OCFS2_XATTR_BUCKET_SIZE - blocksize + in ocfs2_cp_xattr_block_to_bucket()
4229 le16_add_cpu(&xh->xh_entries[i].xe_name_offset, off_change); in ocfs2_cp_xattr_block_to_bucket()
4242 * While if the entry is in index b-tree, "bucket" indicates the
4249 char *buf = old_bh->b_data; in ocfs2_xattr_update_xattr_search()
4251 struct ocfs2_xattr_header *old_xh = &old_xb->xb_attrs.xb_header; in ocfs2_xattr_update_xattr_search()
4254 xs->header = bucket_xh(xs->bucket); in ocfs2_xattr_update_xattr_search()
4255 xs->base = bucket_block(xs->bucket, 0); in ocfs2_xattr_update_xattr_search()
4256 xs->end = xs->base + inode->i_sb->s_blocksize; in ocfs2_xattr_update_xattr_search()
4258 if (xs->not_found) in ocfs2_xattr_update_xattr_search()
4261 i = xs->here - old_xh->xh_entries; in ocfs2_xattr_update_xattr_search()
4262 xs->here = &xs->header->xh_entries[i]; in ocfs2_xattr_update_xattr_search()
4272 handle_t *handle = ctxt->handle; in ocfs2_xattr_create_index_block()
4274 struct buffer_head *xb_bh = xs->xattr_bh; in ocfs2_xattr_create_index_block()
4276 (struct ocfs2_xattr_block *)xb_bh->b_data; in ocfs2_xattr_create_index_block()
4278 u16 xb_flags = le16_to_cpu(xb->xb_flags); in ocfs2_xattr_create_index_block()
4281 (unsigned long long)xb_bh->b_blocknr); in ocfs2_xattr_create_index_block()
4284 BUG_ON(!xs->bucket); in ocfs2_xattr_create_index_block()
4291 down_write(&oi->ip_alloc_sem); in ocfs2_xattr_create_index_block()
4300 ret = __ocfs2_claim_clusters(handle, ctxt->data_ac, in ocfs2_xattr_create_index_block()
4312 blkno = ocfs2_clusters_to_blocks(inode->i_sb, bit_off); in ocfs2_xattr_create_index_block()
4316 ret = ocfs2_init_xattr_bucket(xs->bucket, blkno, 1); in ocfs2_xattr_create_index_block()
4322 ret = ocfs2_xattr_bucket_journal_access(handle, xs->bucket, in ocfs2_xattr_create_index_block()
4329 ocfs2_cp_xattr_block_to_bucket(inode, xb_bh, xs->bucket); in ocfs2_xattr_create_index_block()
4330 ocfs2_xattr_bucket_journal_dirty(handle, xs->bucket); in ocfs2_xattr_create_index_block()
4335 memset(&xb->xb_attrs, 0, inode->i_sb->s_blocksize - in ocfs2_xattr_create_index_block()
4338 xr = &xb->xb_attrs.xb_root; in ocfs2_xattr_create_index_block()
4339 xr->xt_clusters = cpu_to_le32(1); in ocfs2_xattr_create_index_block()
4340 xr->xt_last_eb_blk = 0; in ocfs2_xattr_create_index_block()
4341 xr->xt_list.l_tree_depth = 0; in ocfs2_xattr_create_index_block()
4342 xr->xt_list.l_count = cpu_to_le16(ocfs2_xattr_recs_per_xb(inode->i_sb)); in ocfs2_xattr_create_index_block()
4343 xr->xt_list.l_next_free_rec = cpu_to_le16(1); in ocfs2_xattr_create_index_block()
4345 xr->xt_list.l_recs[0].e_cpos = 0; in ocfs2_xattr_create_index_block()
4346 xr->xt_list.l_recs[0].e_blkno = cpu_to_le64(blkno); in ocfs2_xattr_create_index_block()
4347 xr->xt_list.l_recs[0].e_leaf_clusters = cpu_to_le16(1); in ocfs2_xattr_create_index_block()
4349 xb->xb_flags = cpu_to_le16(xb_flags | OCFS2_XATTR_INDEXED); in ocfs2_xattr_create_index_block()
4354 up_write(&oi->ip_alloc_sem); in ocfs2_xattr_create_index_block()
4362 u32 l_name_offset = le16_to_cpu(l->xe_name_offset); in cmp_xe_offset()
4363 u32 r_name_offset = le16_to_cpu(r->xe_name_offset); in cmp_xe_offset()
4368 return -1; in cmp_xe_offset()
4388 size_t blocksize = inode->i_sb->s_blocksize; in ocfs2_defrag_xattr_bucket()
4399 ret = -EIO; in ocfs2_defrag_xattr_bucket()
4404 for (i = 0; i < bucket->bu_blocks; i++, buf += blocksize) in ocfs2_defrag_xattr_bucket()
4415 entries = (char *)xh->xh_entries; in ocfs2_defrag_xattr_bucket()
4416 xh_free_start = le16_to_cpu(xh->xh_free_start); in ocfs2_defrag_xattr_bucket()
4419 (unsigned long long)blkno, le16_to_cpu(xh->xh_count), in ocfs2_defrag_xattr_bucket()
4420 xh_free_start, le16_to_cpu(xh->xh_name_value_len)); in ocfs2_defrag_xattr_bucket()
4427 sort(entries, le16_to_cpu(xh->xh_count), in ocfs2_defrag_xattr_bucket()
4432 xe = xh->xh_entries; in ocfs2_defrag_xattr_bucket()
4434 for (i = 0; i < le16_to_cpu(xh->xh_count); i++, xe++) { in ocfs2_defrag_xattr_bucket()
4435 offset = le16_to_cpu(xe->xe_name_offset); in ocfs2_defrag_xattr_bucket()
4443 if (((end - len) / blocksize != in ocfs2_defrag_xattr_bucket()
4444 (end - 1) / blocksize)) in ocfs2_defrag_xattr_bucket()
4445 end = end - end % blocksize; in ocfs2_defrag_xattr_bucket()
4448 memmove(bucket_buf + end - len, in ocfs2_defrag_xattr_bucket()
4450 xe->xe_name_offset = cpu_to_le16(end - len); in ocfs2_defrag_xattr_bucket()
4456 end -= len; in ocfs2_defrag_xattr_bucket()
4465 memset(bucket_buf + xh_free_start, 0, end - xh_free_start); in ocfs2_defrag_xattr_bucket()
4466 xh->xh_free_start = cpu_to_le16(end); in ocfs2_defrag_xattr_bucket()
4469 sort(entries, le16_to_cpu(xh->xh_count), in ocfs2_defrag_xattr_bucket()
4474 for (i = 0; i < bucket->bu_blocks; i++, buf += blocksize) in ocfs2_defrag_xattr_bucket()
4509 struct super_block *sb = inode->i_sb; in ocfs2_mv_xattr_bucket_cross_cluster()
4515 ((num_clusters - 1) * ocfs2_clusters_to_blocks(sb, 1)); in ocfs2_mv_xattr_bucket_cross_cluster()
4517 BUG_ON(le16_to_cpu(bucket_xh(first)->xh_num_buckets) < num_buckets); in ocfs2_mv_xattr_bucket_cross_cluster()
4518 BUG_ON(OCFS2_XATTR_BUCKET_SIZE == OCFS2_SB(sb)->s_clustersize); in ocfs2_mv_xattr_bucket_cross_cluster()
4542 (bucket_blkno(target) - src_blkno); in ocfs2_mv_xattr_bucket_cross_cluster()
4548 * These shouldn't fail - the buffers are in the in ocfs2_mv_xattr_bucket_cross_cluster()
4578 struct ocfs2_xattr_entry *entries = xh->xh_entries; in ocfs2_xattr_find_divide_pos()
4579 int count = le16_to_cpu(xh->xh_count); in ocfs2_xattr_find_divide_pos()
4590 if (cmp_xe(&entries[middle - delta - 1], in ocfs2_xattr_find_divide_pos()
4591 &entries[middle - delta])) in ocfs2_xattr_find_divide_pos()
4592 return middle - delta; in ocfs2_xattr_find_divide_pos()
4630 int blocksize = inode->i_sb->s_blocksize; in ocfs2_divide_xattr_bucket()
4638 ret = -ENOMEM; in ocfs2_divide_xattr_bucket()
4681 count = le16_to_cpu(xh->xh_count); in ocfs2_divide_xattr_bucket()
4685 xe = &xh->xh_entries[start-1]; in ocfs2_divide_xattr_bucket()
4692 for (i = 0; i < t_bucket->bu_blocks; i++) in ocfs2_divide_xattr_bucket()
4696 xh->xh_free_start = cpu_to_le16(blocksize); in ocfs2_divide_xattr_bucket()
4697 xh->xh_entries[0].xe_name_hash = xe->xe_name_hash; in ocfs2_divide_xattr_bucket()
4698 le32_add_cpu(&xh->xh_entries[0].xe_name_hash, 1); in ocfs2_divide_xattr_bucket()
4716 xe = &xh->xh_entries[i]; in ocfs2_divide_xattr_bucket()
4718 if (le16_to_cpu(xe->xe_name_offset) < name_offset) in ocfs2_divide_xattr_bucket()
4719 name_offset = le16_to_cpu(xe->xe_name_offset); in ocfs2_divide_xattr_bucket()
4730 xe = &xh->xh_entries[start]; in ocfs2_divide_xattr_bucket()
4731 len = sizeof(struct ocfs2_xattr_entry) * (count - start); in ocfs2_divide_xattr_bucket()
4733 (int)((char *)xe - (char *)xh), in ocfs2_divide_xattr_bucket()
4734 (int)((char *)xh->xh_entries - (char *)xh)); in ocfs2_divide_xattr_bucket()
4735 memmove((char *)xh->xh_entries, (char *)xe, len); in ocfs2_divide_xattr_bucket()
4736 xe = &xh->xh_entries[count - start]; in ocfs2_divide_xattr_bucket()
4740 le16_add_cpu(&xh->xh_count, -start); in ocfs2_divide_xattr_bucket()
4741 le16_add_cpu(&xh->xh_name_value_len, -name_value_len); in ocfs2_divide_xattr_bucket()
4744 xh->xh_free_start = cpu_to_le16(OCFS2_XATTR_BUCKET_SIZE); in ocfs2_divide_xattr_bucket()
4745 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) { in ocfs2_divide_xattr_bucket()
4746 xe = &xh->xh_entries[i]; in ocfs2_divide_xattr_bucket()
4747 if (le16_to_cpu(xe->xe_name_offset) < in ocfs2_divide_xattr_bucket()
4748 le16_to_cpu(xh->xh_free_start)) in ocfs2_divide_xattr_bucket()
4749 xh->xh_free_start = xe->xe_name_offset; in ocfs2_divide_xattr_bucket()
4753 /* set xh->xh_num_buckets for the new xh. */ in ocfs2_divide_xattr_bucket()
4755 xh->xh_num_buckets = cpu_to_le16(1); in ocfs2_divide_xattr_bucket()
4757 xh->xh_num_buckets = 0; in ocfs2_divide_xattr_bucket()
4763 *first_hash = le32_to_cpu(xh->xh_entries[0].xe_name_hash); in ocfs2_divide_xattr_bucket()
4774 memset(&xh->xh_entries[start], 0, in ocfs2_divide_xattr_bucket()
4775 sizeof(struct ocfs2_xattr_entry) * (count - start)); in ocfs2_divide_xattr_bucket()
4776 xh->xh_count = cpu_to_le16(start); in ocfs2_divide_xattr_bucket()
4777 xh->xh_free_start = cpu_to_le16(name_offset); in ocfs2_divide_xattr_bucket()
4778 xh->xh_name_value_len = cpu_to_le16(name_value_len); in ocfs2_divide_xattr_bucket()
4813 ret = -ENOMEM; in ocfs2_cp_xattr_bucket()
4834 * ocfs2_mv_xattr_buckets(), and it is really new - in ocfs2_cp_xattr_bucket()
4837 * ocfs2_add_new_xattr_bucket() can do this - its call to in ocfs2_cp_xattr_bucket()
4839 * and copied out the end of the old extent. Then it re-extends in ocfs2_cp_xattr_bucket()
4864 * extent. If start_bucket is non-zero, we skip that many buckets before
4875 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_mv_xattr_buckets()
4876 int blks_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_mv_xattr_buckets()
4885 num_buckets -= start_bucket; in ocfs2_mv_xattr_buckets()
4894 ret = -ENOMEM; in ocfs2_mv_xattr_buckets()
4952 le16_add_cpu(&bucket_xh(old_first)->xh_num_buckets, -num_buckets); in ocfs2_mv_xattr_buckets()
4955 bucket_xh(new_first)->xh_num_buckets = cpu_to_le16(num_buckets); in ocfs2_mv_xattr_buckets()
4959 *first_hash = le32_to_cpu(bucket_xh(new_first)->xh_entries[0].xe_name_hash); in ocfs2_mv_xattr_buckets()
4978 u16 blk_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_divide_xattr_cluster()
4981 BUG_ON(OCFS2_XATTR_BUCKET_SIZE < OCFS2_SB(inode->i_sb)->s_clustersize); in ocfs2_divide_xattr_cluster()
5001 * don't collide with our original b-tree operations. first_bh and header_bh
5035 if (ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb)) > 1) { in ocfs2_adjust_xattr_cross_cluster()
5047 ((prev_clusters - 1) * in ocfs2_adjust_xattr_cross_cluster()
5048 ocfs2_clusters_to_blocks(inode->i_sb, 1)); in ocfs2_adjust_xattr_cross_cluster()
5098 u16 bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1); in ocfs2_add_new_xattr_cluster()
5102 handle_t *handle = ctxt->handle; in ocfs2_add_new_xattr_cluster()
5103 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_add_new_xattr_cluster()
5107 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_add_new_xattr_cluster()
5120 ret = __ocfs2_claim_clusters(handle, ctxt->data_ac, 1, in ocfs2_add_new_xattr_cluster()
5123 if (ret != -ENOSPC) in ocfs2_add_new_xattr_cluster()
5130 block = ocfs2_clusters_to_blocks(osb->sb, bit_off); in ocfs2_add_new_xattr_cluster()
5134 (prev_clusters + num_bits) << osb->s_clustersize_bits <= in ocfs2_add_new_xattr_cluster()
5165 num_bits, 0, ctxt->meta_ac); in ocfs2_add_new_xattr_cluster()
5180 * bucket_xh(first)->xh_num_buckets. 'target_blkno' is the block number
5183 * target, we split the target between itself and the now-empty bucket
5193 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_extend_xattr_bucket()
5194 u16 blk_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_extend_xattr_bucket()
5196 u16 new_bucket = le16_to_cpu(bucket_xh(first)->xh_num_buckets); in ocfs2_extend_xattr_bucket()
5207 end_blk = bucket_blkno(first) + ((new_bucket - 1) * blk_per_bucket); in ocfs2_extend_xattr_bucket()
5211 * Thus, (end_blk - target_blk) covers the target bucket and in ocfs2_extend_xattr_bucket()
5216 credits = (end_blk - target_blk) + (3 * blk_per_bucket); in ocfs2_extend_xattr_bucket()
5235 end_blk -= blk_per_bucket; in ocfs2_extend_xattr_bucket()
5242 le16_add_cpu(&bucket_xh(first)->xh_num_buckets, 1); in ocfs2_extend_xattr_bucket()
5268 (struct ocfs2_xattr_block *)xb_bh->b_data; in ocfs2_add_new_xattr_bucket()
5269 struct ocfs2_xattr_tree_root *xb_root = &xb->xb_attrs.xb_root; in ocfs2_add_new_xattr_bucket()
5270 struct ocfs2_extent_list *el = &xb_root->xt_list; in ocfs2_add_new_xattr_bucket()
5272 le32_to_cpu(bucket_xh(target)->xh_entries[0].xe_name_hash); in ocfs2_add_new_xattr_bucket()
5273 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_add_new_xattr_bucket()
5286 ret = -ENOMEM; in ocfs2_add_new_xattr_bucket()
5305 if (num_buckets == le16_to_cpu(bucket_xh(first)->xh_num_buckets)) { in ocfs2_add_new_xattr_bucket()
5326 ctxt->handle, in ocfs2_add_new_xattr_bucket()
5357 size_t blocksize = inode->i_sb->s_blocksize; in ocfs2_xattr_bucket_value_truncate()
5362 xe = &xh->xh_entries[xe_off]; in ocfs2_xattr_bucket_value_truncate()
5366 offset = le16_to_cpu(xe->xe_name_offset) + in ocfs2_xattr_bucket_value_truncate()
5367 OCFS2_XATTR_SIZE(xe->xe_name_len); in ocfs2_xattr_bucket_value_truncate()
5372 BUG_ON(value_blk != (offset + OCFS2_XATTR_ROOT_SIZE - 1) / blocksize); in ocfs2_xattr_bucket_value_truncate()
5374 vb.vb_bh = bucket->bu_bhs[value_blk]; in ocfs2_xattr_bucket_value_truncate()
5378 (vb.vb_bh->b_data + offset % blocksize); in ocfs2_xattr_bucket_value_truncate()
5395 ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket, in ocfs2_xattr_bucket_value_truncate()
5402 xe->xe_value_size = cpu_to_le64(len); in ocfs2_xattr_bucket_value_truncate()
5404 ocfs2_xattr_bucket_journal_dirty(ctxt->handle, bucket); in ocfs2_xattr_bucket_value_truncate()
5418 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_rm_xattr_cluster()
5419 struct inode *tl_inode = osb->osb_tl_inode; in ocfs2_rm_xattr_cluster()
5422 (struct ocfs2_xattr_block *)root_bh->b_data; in ocfs2_rm_xattr_cluster()
5439 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_rm_xattr_cluster()
5461 handle = ocfs2_start_trans(osb, ocfs2_remove_extent_credits(osb->sb)); in ocfs2_rm_xattr_cluster()
5463 ret = -ENOMEM; in ocfs2_rm_xattr_cluster()
5482 le32_add_cpu(&xb->xb_attrs.xb_root.xt_clusters, -len); in ocfs2_rm_xattr_cluster()
5507 * If we want to insert the xattr with the same hash, return -ENOSPC.
5518 if (name_hash != le32_to_cpu(xh->xh_entries[0].xe_name_hash)) in ocfs2_check_xattr_bucket_collision()
5521 if (xh->xh_entries[le16_to_cpu(xh->xh_count) - 1].xe_name_hash == in ocfs2_check_xattr_bucket_collision()
5522 xh->xh_entries[0].xe_name_hash) { in ocfs2_check_xattr_bucket_collision()
5526 le32_to_cpu(xh->xh_entries[0].xe_name_hash)); in ocfs2_check_xattr_bucket_collision()
5527 return -ENOSPC; in ocfs2_check_xattr_bucket_collision()
5543 struct ocfs2_xa_loc loc; in ocfs2_xattr_set_entry_bucket() local
5545 trace_ocfs2_xattr_set_entry_bucket(xi->xi_name); in ocfs2_xattr_set_entry_bucket()
5547 ocfs2_init_xattr_bucket_xa_loc(&loc, xs->bucket, in ocfs2_xattr_set_entry_bucket()
5548 xs->not_found ? NULL : xs->here); in ocfs2_xattr_set_entry_bucket()
5549 ret = ocfs2_xa_set(&loc, xi, ctxt); in ocfs2_xattr_set_entry_bucket()
5551 xs->here = loc.xl_entry; in ocfs2_xattr_set_entry_bucket()
5554 if (ret != -ENOSPC) { in ocfs2_xattr_set_entry_bucket()
5560 ret = ocfs2_defrag_xattr_bucket(inode, ctxt->handle, in ocfs2_xattr_set_entry_bucket()
5561 xs->bucket); in ocfs2_xattr_set_entry_bucket()
5567 ret = ocfs2_xa_set(&loc, xi, ctxt); in ocfs2_xattr_set_entry_bucket()
5569 xs->here = loc.xl_entry; in ocfs2_xattr_set_entry_bucket()
5572 if (ret != -ENOSPC) in ocfs2_xattr_set_entry_bucket()
5587 trace_ocfs2_xattr_set_entry_index_block(xi->xi_name); in ocfs2_xattr_set_entry_index_block()
5592 if (ret != -ENOSPC) { in ocfs2_xattr_set_entry_index_block()
5606 xs->bucket, in ocfs2_xattr_set_entry_index_block()
5607 xi->xi_name); in ocfs2_xattr_set_entry_index_block()
5614 xs->xattr_bh, in ocfs2_xattr_set_entry_index_block()
5615 xs->bucket, in ocfs2_xattr_set_entry_index_block()
5624 * xs->bucket if it moved, but it will not have updated in ocfs2_xattr_set_entry_index_block()
5626 * re-search. Everything should be cached, so it'll be in ocfs2_xattr_set_entry_index_block()
5629 ocfs2_xattr_bucket_relse(xs->bucket); in ocfs2_xattr_set_entry_index_block()
5630 ret = ocfs2_xattr_index_block_find(inode, xs->xattr_bh, in ocfs2_xattr_set_entry_index_block()
5631 xi->xi_name_index, in ocfs2_xattr_set_entry_index_block()
5632 xi->xi_name, xs); in ocfs2_xattr_set_entry_index_block()
5633 if (ret && ret != -ENODATA) in ocfs2_xattr_set_entry_index_block()
5635 xs->not_found = ret; in ocfs2_xattr_set_entry_index_block()
5639 if (ret && (ret != -ENOSPC)) in ocfs2_xattr_set_entry_index_block()
5654 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_delete_xattr_in_bucket()
5656 int credits = ocfs2_remove_extent_credits(osb->sb) + in ocfs2_delete_xattr_in_bucket()
5657 ocfs2_blocks_per_xattr_bucket(inode->i_sb); in ocfs2_delete_xattr_in_bucket()
5664 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) { in ocfs2_delete_xattr_in_bucket()
5665 xe = &xh->xh_entries[i]; in ocfs2_delete_xattr_in_bucket()
5669 ret = ocfs2_get_xattr_tree_value_root(inode->i_sb, bucket, in ocfs2_delete_xattr_in_bucket()
5677 args->ref_ci, in ocfs2_delete_xattr_in_bucket()
5678 args->ref_root_bh, in ocfs2_delete_xattr_in_bucket()
5770 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_prepare_refcount_xattr()
5775 if (!xis->not_found) { in ocfs2_prepare_refcount_xattr()
5776 xe = xis->here; in ocfs2_prepare_refcount_xattr()
5777 name_offset = le16_to_cpu(xe->xe_name_offset); in ocfs2_prepare_refcount_xattr()
5778 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len); in ocfs2_prepare_refcount_xattr()
5779 base = xis->base; in ocfs2_prepare_refcount_xattr()
5780 vb.vb_bh = xis->inode_bh; in ocfs2_prepare_refcount_xattr()
5784 xb = (struct ocfs2_xattr_block *)xbs->xattr_bh->b_data; in ocfs2_prepare_refcount_xattr()
5785 xe = xbs->here; in ocfs2_prepare_refcount_xattr()
5786 name_offset = le16_to_cpu(xe->xe_name_offset); in ocfs2_prepare_refcount_xattr()
5787 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len); in ocfs2_prepare_refcount_xattr()
5788 i = xbs->here - xbs->header->xh_entries; in ocfs2_prepare_refcount_xattr()
5790 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) { in ocfs2_prepare_refcount_xattr()
5791 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb, in ocfs2_prepare_refcount_xattr()
5792 bucket_xh(xbs->bucket), in ocfs2_prepare_refcount_xattr()
5799 base = bucket_block(xbs->bucket, block_off); in ocfs2_prepare_refcount_xattr()
5800 vb.vb_bh = xbs->bucket->bu_bhs[block_off]; in ocfs2_prepare_refcount_xattr()
5805 bucket = xbs->bucket; in ocfs2_prepare_refcount_xattr()
5806 refcount.credits = bucket->bu_blocks; in ocfs2_prepare_refcount_xattr()
5813 base = xbs->base; in ocfs2_prepare_refcount_xattr()
5814 vb.vb_bh = xbs->xattr_bh; in ocfs2_prepare_refcount_xattr()
5826 &num_clusters, &vb.vb_xv->xr_list, in ocfs2_prepare_refcount_xattr()
5841 ret = ocfs2_lock_refcount_tree(osb, le64_to_cpu(di->i_refcount_loc), in ocfs2_prepare_refcount_xattr()
5856 if (!xi->xi_value || xi->xi_value_len <= OCFS2_XATTR_INLINE_SIZE) { in ocfs2_prepare_refcount_xattr()
5859 &(*ref_tree)->rf_ci, in ocfs2_prepare_refcount_xattr()
5869 le32_to_cpu(vb.vb_xv->xr_clusters), p); in ocfs2_prepare_refcount_xattr()
5891 u32 clusters = le32_to_cpu(xv->xr_clusters); in ocfs2_xattr_value_attach_refcount()
5893 struct ocfs2_extent_list *el = &xv->xr_list; in ocfs2_xattr_value_attach_refcount()
5913 cpos - num_clusters, in ocfs2_xattr_value_attach_refcount()
5943 for (i = 0; i < le16_to_cpu(header->xh_count); i++) { in ocfs2_xattr_attach_refcount_normal()
5944 xe = &header->xh_entries[i]; in ocfs2_xattr_attach_refcount_normal()
5950 le16_to_cpu(xe->xe_name_offset) + in ocfs2_xattr_attach_refcount_normal()
5951 OCFS2_XATTR_SIZE(xe->xe_name_len)); in ocfs2_xattr_attach_refcount_normal()
5953 vb->vb_xv = xv; in ocfs2_xattr_attach_refcount_normal()
5974 struct ocfs2_dinode *di = (struct ocfs2_dinode *)fe_bh->b_data; in ocfs2_xattr_inline_attach_refcount()
5976 (fe_bh->b_data + inode->i_sb->s_blocksize - in ocfs2_xattr_inline_attach_refcount()
5977 le16_to_cpu(di->i_xattr_inline_size)); in ocfs2_xattr_inline_attach_refcount()
6001 struct ocfs2_xattr_entry *xe = &xh->xh_entries[offset]; in ocfs2_get_xattr_tree_value_root()
6017 OCFS2_XATTR_SIZE(xe->xe_name_len)); in ocfs2_get_xattr_tree_value_root()
6020 *bh = bucket->bu_bhs[block_off]; in ocfs2_get_xattr_tree_value_root()
6038 (struct ocfs2_xattr_header *)bucket->bu_bhs[0]->b_data; in ocfs2_xattr_bucket_value_refcount()
6044 .credits = bucket->bu_blocks, in ocfs2_xattr_bucket_value_refcount()
6051 if (ocfs2_meta_ecc(OCFS2_SB(inode->i_sb))) in ocfs2_xattr_bucket_value_refcount()
6056 le16_to_cpu(xh->xh_count)); in ocfs2_xattr_bucket_value_refcount()
6057 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) { in ocfs2_xattr_bucket_value_refcount()
6058 xe = &xh->xh_entries[i]; in ocfs2_xattr_bucket_value_refcount()
6063 ret = ocfs2_get_xattr_tree_value_root(inode->i_sb, bucket, i, in ocfs2_xattr_bucket_value_refcount()
6074 &et, ref->ref_ci, in ocfs2_xattr_bucket_value_refcount()
6075 ref->ref_root_bh, in ocfs2_xattr_bucket_value_refcount()
6076 ref->dealloc, p); in ocfs2_xattr_bucket_value_refcount()
6104 (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_xattr_block_attach_refcount()
6106 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { in ocfs2_xattr_block_attach_refcount()
6107 struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header; in ocfs2_xattr_block_attach_refcount()
6139 struct ocfs2_dinode *di = (struct ocfs2_dinode *)fe_bh->b_data; in ocfs2_xattr_attach_refcount_tree()
6142 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) { in ocfs2_xattr_attach_refcount_tree()
6152 if (!di->i_xattr_loc) in ocfs2_xattr_attach_refcount_tree()
6155 ret = ocfs2_read_xattr_block(inode, le64_to_cpu(di->i_xattr_loc), in ocfs2_xattr_attach_refcount_tree()
6219 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) { in ocfs2_value_metas_in_xattr_header()
6220 xe = &xh->xh_entries[i]; in ocfs2_value_metas_in_xattr_header()
6230 *metas += le16_to_cpu(xv->xr_list.l_tree_depth) * in ocfs2_value_metas_in_xattr_header()
6231 le16_to_cpu(xv->xr_list.l_next_free_rec); in ocfs2_value_metas_in_xattr_header()
6240 if (!xv->xr_list.l_tree_depth) in ocfs2_value_metas_in_xattr_header()
6241 *num_recs += le16_to_cpu(xv->xr_list.l_next_free_rec); in ocfs2_value_metas_in_xattr_header()
6259 struct ocfs2_xattr_entry *xe = &xh->xh_entries[offset]; in ocfs2_get_xattr_value_root()
6262 le16_to_cpu(xe->xe_name_offset) + in ocfs2_get_xattr_value_root()
6263 OCFS2_XATTR_SIZE(xe->xe_name_len)); in ocfs2_get_xattr_value_root()
6283 (struct ocfs2_refcount_block *)ref_root_bh->b_data; in ocfs2_reflink_lock_xattr_allocators()
6287 ret = ocfs2_value_metas_in_xattr_header(osb->sb, NULL, xh, in ocfs2_reflink_lock_xattr_allocators()
6303 num_recs = num_recs / ocfs2_refcount_recs_per_rb(osb->sb) * 2; in ocfs2_reflink_lock_xattr_allocators()
6306 if (le32_to_cpu(rb->rf_flags) & OCFS2_REFCOUNT_TREE_FL) in ocfs2_reflink_lock_xattr_allocators()
6307 *credits += le16_to_cpu(rb->rf_list.l_tree_depth) * in ocfs2_reflink_lock_xattr_allocators()
6308 le16_to_cpu(rb->rf_list.l_next_free_rec) + 1; in ocfs2_reflink_lock_xattr_allocators()
6343 struct super_block *sb = args->old_inode->i_sb; in ocfs2_reflink_xattr_header()
6351 trace_ocfs2_reflink_xattr_header((unsigned long long)old_bh->b_blocknr, in ocfs2_reflink_xattr_header()
6352 le16_to_cpu(xh->xh_count)); in ocfs2_reflink_xattr_header()
6354 last = &new_xh->xh_entries[le16_to_cpu(new_xh->xh_count)]; in ocfs2_reflink_xattr_header()
6355 for (i = 0, j = 0; i < le16_to_cpu(xh->xh_count); i++, j++) { in ocfs2_reflink_xattr_header()
6356 xe = &xh->xh_entries[i]; in ocfs2_reflink_xattr_header()
6358 if (args->xattr_reflinked && !args->xattr_reflinked(xe)) { in ocfs2_reflink_xattr_header()
6359 xe = &new_xh->xh_entries[j]; in ocfs2_reflink_xattr_header()
6361 le16_add_cpu(&new_xh->xh_count, -1); in ocfs2_reflink_xattr_header()
6362 if (new_xh->xh_count) { in ocfs2_reflink_xattr_header()
6364 (void *)last - (void *)xe); in ocfs2_reflink_xattr_header()
6373 j--; in ocfs2_reflink_xattr_header()
6402 if (xv->xr_list.l_tree_depth) { in ocfs2_reflink_xattr_header()
6404 vb->vb_xv = new_xv; in ocfs2_reflink_xattr_header()
6405 vb->vb_bh = value_bh; in ocfs2_reflink_xattr_header()
6407 INODE_CACHE(args->new_inode), vb); in ocfs2_reflink_xattr_header()
6410 clusters = le32_to_cpu(xv->xr_clusters); in ocfs2_reflink_xattr_header()
6413 ret = ocfs2_xattr_get_clusters(args->old_inode, in ocfs2_reflink_xattr_header()
6417 &xv->xr_list, in ocfs2_reflink_xattr_header()
6426 if (xv->xr_list.l_tree_depth) { in ocfs2_reflink_xattr_header()
6430 args->old_inode->i_sb, in ocfs2_reflink_xattr_header()
6440 ret = ocfs2_increase_refcount(handle, args->ref_ci, in ocfs2_reflink_xattr_header()
6441 args->ref_root_bh, in ocfs2_reflink_xattr_header()
6443 meta_ac, args->dealloc); in ocfs2_reflink_xattr_header()
6461 struct ocfs2_super *osb = OCFS2_SB(args->old_inode->i_sb); in ocfs2_reflink_xattr_inline()
6462 struct ocfs2_dinode *di = (struct ocfs2_dinode *)args->old_bh->b_data; in ocfs2_reflink_xattr_inline()
6463 int inline_size = le16_to_cpu(di->i_xattr_inline_size); in ocfs2_reflink_xattr_inline()
6464 int header_off = osb->sb->s_blocksize - inline_size; in ocfs2_reflink_xattr_inline()
6466 (args->old_bh->b_data + header_off); in ocfs2_reflink_xattr_inline()
6468 (args->new_bh->b_data + header_off); in ocfs2_reflink_xattr_inline()
6473 .vb_bh = args->new_bh, in ocfs2_reflink_xattr_inline()
6477 ret = ocfs2_reflink_lock_xattr_allocators(osb, xh, args->ref_root_bh, in ocfs2_reflink_xattr_inline()
6491 ret = ocfs2_journal_access_di(handle, INODE_CACHE(args->new_inode), in ocfs2_reflink_xattr_inline()
6492 args->new_bh, OCFS2_JOURNAL_ACCESS_WRITE); in ocfs2_reflink_xattr_inline()
6498 memcpy(args->new_bh->b_data + header_off, in ocfs2_reflink_xattr_inline()
6499 args->old_bh->b_data + header_off, inline_size); in ocfs2_reflink_xattr_inline()
6501 new_di = (struct ocfs2_dinode *)args->new_bh->b_data; in ocfs2_reflink_xattr_inline()
6502 new_di->i_xattr_inline_size = cpu_to_le16(inline_size); in ocfs2_reflink_xattr_inline()
6504 ret = ocfs2_reflink_xattr_header(handle, args, args->old_bh, xh, in ocfs2_reflink_xattr_inline()
6505 args->new_bh, new_xh, &vb, meta_ac, in ocfs2_reflink_xattr_inline()
6512 new_oi = OCFS2_I(args->new_inode); in ocfs2_reflink_xattr_inline()
6514 spin_lock(&new_oi->ip_lock); in ocfs2_reflink_xattr_inline()
6515 new_oi->ip_dyn_features |= OCFS2_HAS_XATTR_FL | OCFS2_INLINE_XATTR_FL; in ocfs2_reflink_xattr_inline()
6516 new_di->i_dyn_features = cpu_to_le16(new_oi->ip_dyn_features); in ocfs2_reflink_xattr_inline()
6517 spin_unlock(&new_oi->ip_lock); in ocfs2_reflink_xattr_inline()
6519 ocfs2_journal_dirty(handle, args->new_bh); in ocfs2_reflink_xattr_inline()
6536 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_create_empty_xattr_block()
6554 (unsigned long long)fe_bh->b_blocknr, indexed); in ocfs2_create_empty_xattr_block()
6572 struct ocfs2_inode_info *new_oi = OCFS2_I(args->new_inode); in ocfs2_reflink_xattr_block()
6574 struct ocfs2_super *osb = OCFS2_SB(args->new_inode->i_sb); in ocfs2_reflink_xattr_block()
6577 (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_reflink_xattr_block()
6578 struct ocfs2_xattr_header *xh = &xb->xb_attrs.xb_header; in ocfs2_reflink_xattr_block()
6580 (struct ocfs2_xattr_block *)new_blk_bh->b_data; in ocfs2_reflink_xattr_block()
6581 struct ocfs2_xattr_header *new_xh = &new_xb->xb_attrs.xb_header; in ocfs2_reflink_xattr_block()
6588 ret = ocfs2_reflink_lock_xattr_allocators(osb, xh, args->ref_root_bh, in ocfs2_reflink_xattr_block()
6603 if (!(new_oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) { in ocfs2_reflink_xattr_block()
6605 INODE_CACHE(args->new_inode), in ocfs2_reflink_xattr_block()
6606 args->new_bh, in ocfs2_reflink_xattr_block()
6614 ret = ocfs2_journal_access_xb(handle, INODE_CACHE(args->new_inode), in ocfs2_reflink_xattr_block()
6621 memcpy(new_blk_bh->b_data + header_off, blk_bh->b_data + header_off, in ocfs2_reflink_xattr_block()
6622 osb->sb->s_blocksize - header_off); in ocfs2_reflink_xattr_block()
6634 if (!(new_oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) { in ocfs2_reflink_xattr_block()
6635 new_di = (struct ocfs2_dinode *)args->new_bh->b_data; in ocfs2_reflink_xattr_block()
6636 spin_lock(&new_oi->ip_lock); in ocfs2_reflink_xattr_block()
6637 new_oi->ip_dyn_features |= OCFS2_HAS_XATTR_FL; in ocfs2_reflink_xattr_block()
6638 new_di->i_dyn_features = cpu_to_le16(new_oi->ip_dyn_features); in ocfs2_reflink_xattr_block()
6639 spin_unlock(&new_oi->ip_lock); in ocfs2_reflink_xattr_block()
6641 ocfs2_journal_dirty(handle, args->new_bh); in ocfs2_reflink_xattr_block()
6678 if (bh == args->old_bucket->bu_bhs[0]) in ocfs2_get_reflink_xattr_value_root()
6679 bucket = args->old_bucket; in ocfs2_get_reflink_xattr_value_root()
6681 bucket = args->new_bucket; in ocfs2_get_reflink_xattr_value_root()
6715 (struct ocfs2_xattr_header *)bucket->bu_bhs[0]->b_data; in ocfs2_calc_value_tree_metas()
6718 metas->credits += bucket->bu_blocks; in ocfs2_calc_value_tree_metas()
6719 return ocfs2_value_metas_in_xattr_header(inode->i_sb, bucket->bu_bhs[0], in ocfs2_calc_value_tree_metas()
6720 xh, &metas->num_metas, in ocfs2_calc_value_tree_metas()
6721 &metas->credits, &metas->num_recs, in ocfs2_calc_value_tree_metas()
6740 struct ocfs2_super *osb = OCFS2_SB(args->reflink->old_inode->i_sb); in ocfs2_lock_reflink_xattr_rec_allocators()
6745 ret = ocfs2_iterate_xattr_buckets(args->reflink->old_inode, blkno, len, in ocfs2_lock_reflink_xattr_rec_allocators()
6765 rb = (struct ocfs2_refcount_block *)args->reflink->ref_root_bh->b_data; in ocfs2_lock_reflink_xattr_rec_allocators()
6767 (metas.num_recs + ocfs2_refcount_recs_per_rb(osb->sb) - 1) / in ocfs2_lock_reflink_xattr_rec_allocators()
6768 ocfs2_refcount_recs_per_rb(osb->sb) * 2; in ocfs2_lock_reflink_xattr_rec_allocators()
6772 if (le32_to_cpu(rb->rf_flags) & OCFS2_REFCOUNT_TREE_FL) in ocfs2_lock_reflink_xattr_rec_allocators()
6773 *credits += le16_to_cpu(rb->rf_list.l_tree_depth) * in ocfs2_lock_reflink_xattr_rec_allocators()
6774 le16_to_cpu(rb->rf_list.l_next_free_rec) + 1; in ocfs2_lock_reflink_xattr_rec_allocators()
6787 metas.num_metas += ocfs2_extend_meta_needed(xt_et->et_root_el); in ocfs2_lock_reflink_xattr_rec_allocators()
6789 *credits += ocfs2_calc_extend_credits(osb->sb, in ocfs2_lock_reflink_xattr_rec_allocators()
6790 xt_et->et_root_el); in ocfs2_lock_reflink_xattr_rec_allocators()
6825 struct super_block *sb = args->reflink->old_inode->i_sb; in ocfs2_reflink_xattr_bucket()
6826 int bpb = args->old_bucket->bu_blocks; in ocfs2_reflink_xattr_bucket()
6832 ret = ocfs2_read_xattr_bucket(args->old_bucket, blkno); in ocfs2_reflink_xattr_bucket()
6838 ret = ocfs2_init_xattr_bucket(args->new_bucket, new_blkno, 1); in ocfs2_reflink_xattr_bucket()
6845 args->new_bucket, in ocfs2_reflink_xattr_bucket()
6853 memcpy(bucket_block(args->new_bucket, j), in ocfs2_reflink_xattr_bucket()
6854 bucket_block(args->old_bucket, j), in ocfs2_reflink_xattr_bucket()
6855 sb->s_blocksize); in ocfs2_reflink_xattr_bucket()
6863 *cpos = le32_to_cpu(bucket_xh(args->new_bucket)-> in ocfs2_reflink_xattr_bucket()
6865 bucket_xh(args->new_bucket)->xh_num_buckets = in ocfs2_reflink_xattr_bucket()
6869 ocfs2_xattr_bucket_journal_dirty(handle, args->new_bucket); in ocfs2_reflink_xattr_bucket()
6871 ret = ocfs2_reflink_xattr_header(handle, args->reflink, in ocfs2_reflink_xattr_bucket()
6872 args->old_bucket->bu_bhs[0], in ocfs2_reflink_xattr_bucket()
6873 bucket_xh(args->old_bucket), in ocfs2_reflink_xattr_bucket()
6874 args->new_bucket->bu_bhs[0], in ocfs2_reflink_xattr_bucket()
6875 bucket_xh(args->new_bucket), in ocfs2_reflink_xattr_bucket()
6885 * Re-access and dirty the bucket to calculate metaecc. in ocfs2_reflink_xattr_bucket()
6890 args->new_bucket, in ocfs2_reflink_xattr_bucket()
6897 ocfs2_xattr_bucket_journal_dirty(handle, args->new_bucket); in ocfs2_reflink_xattr_bucket()
6899 ocfs2_xattr_bucket_relse(args->old_bucket); in ocfs2_reflink_xattr_bucket()
6900 ocfs2_xattr_bucket_relse(args->new_bucket); in ocfs2_reflink_xattr_bucket()
6903 ocfs2_xattr_bucket_relse(args->old_bucket); in ocfs2_reflink_xattr_bucket()
6904 ocfs2_xattr_bucket_relse(args->new_bucket); in ocfs2_reflink_xattr_bucket()
6921 ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb)); in ocfs2_reflink_xattr_buckets()
6923 ret = ocfs2_read_xattr_bucket(args->old_bucket, blkno); in ocfs2_reflink_xattr_buckets()
6928 num_buckets = le16_to_cpu(bucket_xh(args->old_bucket)->xh_num_buckets); in ocfs2_reflink_xattr_buckets()
6929 ocfs2_xattr_bucket_relse(args->old_bucket); in ocfs2_reflink_xattr_buckets()
6939 new_blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster); in ocfs2_reflink_xattr_buckets()
6968 len -= num_clusters; in ocfs2_reflink_xattr_buckets()
6969 blkno += ocfs2_clusters_to_blocks(inode->i_sb, num_clusters); in ocfs2_reflink_xattr_buckets()
6970 num_buckets -= reflink_buckets; in ocfs2_reflink_xattr_buckets()
6990 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_reflink_xattr_rec()
6998 INODE_CACHE(args->reflink->new_inode), in ocfs2_reflink_xattr_rec()
6999 args->new_blk_bh); in ocfs2_reflink_xattr_rec()
7049 para.old_bucket = ocfs2_xattr_bucket_new(args->old_inode); in ocfs2_reflink_xattr_tree()
7051 mlog_errno(-ENOMEM); in ocfs2_reflink_xattr_tree()
7052 return -ENOMEM; in ocfs2_reflink_xattr_tree()
7055 para.new_bucket = ocfs2_xattr_bucket_new(args->new_inode); in ocfs2_reflink_xattr_tree()
7057 ret = -ENOMEM; in ocfs2_reflink_xattr_tree()
7062 ret = ocfs2_iterate_xattr_index_block(args->old_inode, blk_bh, in ocfs2_reflink_xattr_tree()
7080 (struct ocfs2_xattr_block *)blk_bh->b_data; in ocfs2_reflink_xattr_in_block()
7083 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) in ocfs2_reflink_xattr_in_block()
7086 ret = ocfs2_create_empty_xattr_block(args->new_inode, args->new_bh, in ocfs2_reflink_xattr_in_block()
7123 struct ocfs2_dinode *di = (struct ocfs2_dinode *)old_bh->b_data; in ocfs2_reflink_xattrs()
7129 ret = ocfs2_lock_refcount_tree(OCFS2_SB(old_inode->i_sb), in ocfs2_reflink_xattrs()
7130 le64_to_cpu(di->i_refcount_loc), in ocfs2_reflink_xattrs()
7143 args.ref_ci = &ref_tree->rf_ci; in ocfs2_reflink_xattrs()
7151 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) { in ocfs2_reflink_xattrs()
7159 if (!di->i_xattr_loc) in ocfs2_reflink_xattrs()
7162 ret = ocfs2_read_xattr_block(old_inode, le64_to_cpu(di->i_xattr_loc), in ocfs2_reflink_xattrs()
7176 ocfs2_unlock_refcount_tree(OCFS2_SB(old_inode->i_sb), in ocfs2_reflink_xattrs()
7181 ocfs2_schedule_truncate_log_flush(OCFS2_SB(old_inode->i_sb), 1); in ocfs2_reflink_xattrs()
7182 ocfs2_run_deallocs(OCFS2_SB(old_inode->i_sb), &dealloc); in ocfs2_reflink_xattrs()
7191 * Used for reflink a non-preserve-security file.
7253 si->value = kmemdup(xattr_array->value, xattr_array->value_len, in ocfs2_initxattrs()
7255 if (!si->value) in ocfs2_initxattrs()
7256 return -ENOMEM; in ocfs2_initxattrs()
7258 si->name = xattr_array->name; in ocfs2_initxattrs()
7259 si->value_len = xattr_array->value_len; in ocfs2_initxattrs()
7263 for (xattr = xattr_array; xattr->name != NULL; xattr++) { in ocfs2_initxattrs()
7265 xattr->name, xattr->value, in ocfs2_initxattrs()
7266 xattr->value_len, XATTR_CREATE); in ocfs2_initxattrs()
7281 if (!ocfs2_supports_xattr(OCFS2_SB(dir->i_sb))) in ocfs2_init_security_get()
7282 return -EOPNOTSUPP; in ocfs2_init_security_get()
7287 * security_inode_init_security() does not return -EOPNOTSUPP, in ocfs2_init_security_get()
7290 if (!ret && !si->name) in ocfs2_init_security_get()
7291 si->enable = 0; in ocfs2_init_security_get()
7309 si->name, si->value, si->value_len, 0, in ocfs2_init_security_set()
7353 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_xattr_user_get()
7355 if (osb->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR) in ocfs2_xattr_user_get()
7356 return -EOPNOTSUPP; in ocfs2_xattr_user_get()
7367 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_xattr_user_set()
7369 if (osb->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR) in ocfs2_xattr_user_set()
7370 return -EOPNOTSUPP; in ocfs2_xattr_user_set()