0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/capability.h>
0013 #include <linux/fs.h>
0014 #include <linux/types.h>
0015 #include <linux/slab.h>
0016 #include <linux/highmem.h>
0017 #include <linux/pagemap.h>
0018 #include <linux/uio.h>
0019 #include <linux/sched.h>
0020 #include <linux/splice.h>
0021 #include <linux/mount.h>
0022 #include <linux/writeback.h>
0023 #include <linux/falloc.h>
0024 #include <linux/sort.h>
0025 #include <linux/init.h>
0026 #include <linux/module.h>
0027 #include <linux/string.h>
0028 #include <linux/security.h>
0029
0030 #include <cluster/masklog.h>
0031
0032 #include "ocfs2.h"
0033 #include "alloc.h"
0034 #include "blockcheck.h"
0035 #include "dlmglue.h"
0036 #include "file.h"
0037 #include "symlink.h"
0038 #include "sysfile.h"
0039 #include "inode.h"
0040 #include "journal.h"
0041 #include "ocfs2_fs.h"
0042 #include "suballoc.h"
0043 #include "uptodate.h"
0044 #include "buffer_head_io.h"
0045 #include "super.h"
0046 #include "xattr.h"
0047 #include "refcounttree.h"
0048 #include "acl.h"
0049 #include "ocfs2_trace.h"
0050
0051 struct ocfs2_xattr_def_value_root {
0052 struct ocfs2_xattr_value_root xv;
0053 struct ocfs2_extent_rec er;
0054 };
0055
0056 struct ocfs2_xattr_bucket {
0057
0058 struct inode *bu_inode;
0059
0060
0061 struct buffer_head *bu_bhs[OCFS2_XATTR_MAX_BLOCKS_PER_BUCKET];
0062
0063
0064 int bu_blocks;
0065 };
0066
0067 struct ocfs2_xattr_set_ctxt {
0068 handle_t *handle;
0069 struct ocfs2_alloc_context *meta_ac;
0070 struct ocfs2_alloc_context *data_ac;
0071 struct ocfs2_cached_dealloc_ctxt dealloc;
0072 int set_abort;
0073 };
0074
0075 #define OCFS2_XATTR_ROOT_SIZE (sizeof(struct ocfs2_xattr_def_value_root))
0076 #define OCFS2_XATTR_INLINE_SIZE 80
0077 #define OCFS2_XATTR_HEADER_GAP 4
0078 #define OCFS2_XATTR_FREE_IN_IBODY (OCFS2_MIN_XATTR_INLINE_SIZE \
0079 - sizeof(struct ocfs2_xattr_header) \
0080 - OCFS2_XATTR_HEADER_GAP)
0081 #define OCFS2_XATTR_FREE_IN_BLOCK(ptr) ((ptr)->i_sb->s_blocksize \
0082 - sizeof(struct ocfs2_xattr_block) \
0083 - sizeof(struct ocfs2_xattr_header) \
0084 - OCFS2_XATTR_HEADER_GAP)
0085
0086 static struct ocfs2_xattr_def_value_root def_xv = {
0087 .xv.xr_list.l_count = cpu_to_le16(1),
0088 };
0089
0090 const struct xattr_handler *ocfs2_xattr_handlers[] = {
0091 &ocfs2_xattr_user_handler,
0092 &posix_acl_access_xattr_handler,
0093 &posix_acl_default_xattr_handler,
0094 &ocfs2_xattr_trusted_handler,
0095 &ocfs2_xattr_security_handler,
0096 NULL
0097 };
0098
0099 static const struct xattr_handler *ocfs2_xattr_handler_map[OCFS2_XATTR_MAX] = {
0100 [OCFS2_XATTR_INDEX_USER] = &ocfs2_xattr_user_handler,
0101 [OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS]
0102 = &posix_acl_access_xattr_handler,
0103 [OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT]
0104 = &posix_acl_default_xattr_handler,
0105 [OCFS2_XATTR_INDEX_TRUSTED] = &ocfs2_xattr_trusted_handler,
0106 [OCFS2_XATTR_INDEX_SECURITY] = &ocfs2_xattr_security_handler,
0107 };
0108
0109 struct ocfs2_xattr_info {
0110 int xi_name_index;
0111 const char *xi_name;
0112 int xi_name_len;
0113 const void *xi_value;
0114 size_t xi_value_len;
0115 };
0116
0117 struct ocfs2_xattr_search {
0118 struct buffer_head *inode_bh;
0119
0120
0121
0122
0123 struct buffer_head *xattr_bh;
0124 struct ocfs2_xattr_header *header;
0125 struct ocfs2_xattr_bucket *bucket;
0126 void *base;
0127 void *end;
0128 struct ocfs2_xattr_entry *here;
0129 int not_found;
0130 };
0131
0132
0133 struct ocfs2_xa_loc;
0134 struct ocfs2_xa_loc_operations {
0135
0136
0137
0138 int (*xlo_journal_access)(handle_t *handle, struct ocfs2_xa_loc *loc,
0139 int type);
0140 void (*xlo_journal_dirty)(handle_t *handle, struct ocfs2_xa_loc *loc);
0141
0142
0143
0144
0145
0146 void *(*xlo_offset_pointer)(struct ocfs2_xa_loc *loc, int offset);
0147
0148
0149 int (*xlo_can_reuse)(struct ocfs2_xa_loc *loc,
0150 struct ocfs2_xattr_info *xi);
0151
0152
0153 int (*xlo_check_space)(struct ocfs2_xa_loc *loc,
0154 struct ocfs2_xattr_info *xi);
0155
0156
0157
0158
0159
0160 int (*xlo_get_free_start)(struct ocfs2_xa_loc *loc);
0161
0162
0163
0164
0165
0166 void (*xlo_wipe_namevalue)(struct ocfs2_xa_loc *loc);
0167
0168
0169 void (*xlo_add_entry)(struct ocfs2_xa_loc *loc, u32 name_hash);
0170
0171
0172 void (*xlo_add_namevalue)(struct ocfs2_xa_loc *loc, int size);
0173
0174
0175
0176
0177
0178 void (*xlo_fill_value_buf)(struct ocfs2_xa_loc *loc,
0179 struct ocfs2_xattr_value_buf *vb);
0180 };
0181
0182
0183
0184
0185
0186 struct ocfs2_xa_loc {
0187
0188 struct inode *xl_inode;
0189
0190
0191 struct ocfs2_xattr_header *xl_header;
0192
0193
0194 int xl_size;
0195
0196
0197
0198
0199
0200
0201 struct ocfs2_xattr_entry *xl_entry;
0202
0203
0204
0205
0206
0207
0208 void *xl_storage;
0209
0210
0211 const struct ocfs2_xa_loc_operations *xl_ops;
0212 };
0213
0214
0215
0216
0217
0218 static int namevalue_size(int name_len, uint64_t value_len)
0219 {
0220 if (value_len > OCFS2_XATTR_INLINE_SIZE)
0221 return OCFS2_XATTR_SIZE(name_len) + OCFS2_XATTR_ROOT_SIZE;
0222 else
0223 return OCFS2_XATTR_SIZE(name_len) + OCFS2_XATTR_SIZE(value_len);
0224 }
0225
0226 static int namevalue_size_xi(struct ocfs2_xattr_info *xi)
0227 {
0228 return namevalue_size(xi->xi_name_len, xi->xi_value_len);
0229 }
0230
0231 static int namevalue_size_xe(struct ocfs2_xattr_entry *xe)
0232 {
0233 u64 value_len = le64_to_cpu(xe->xe_value_size);
0234
0235 BUG_ON((value_len > OCFS2_XATTR_INLINE_SIZE) &&
0236 ocfs2_xattr_is_local(xe));
0237 return namevalue_size(xe->xe_name_len, value_len);
0238 }
0239
0240
0241 static int ocfs2_xattr_bucket_get_name_value(struct super_block *sb,
0242 struct ocfs2_xattr_header *xh,
0243 int index,
0244 int *block_off,
0245 int *new_offset);
0246
0247 static int ocfs2_xattr_block_find(struct inode *inode,
0248 int name_index,
0249 const char *name,
0250 struct ocfs2_xattr_search *xs);
0251 static int ocfs2_xattr_index_block_find(struct inode *inode,
0252 struct buffer_head *root_bh,
0253 int name_index,
0254 const char *name,
0255 struct ocfs2_xattr_search *xs);
0256
0257 static int ocfs2_xattr_tree_list_index_block(struct inode *inode,
0258 struct buffer_head *blk_bh,
0259 char *buffer,
0260 size_t buffer_size);
0261
0262 static int ocfs2_xattr_create_index_block(struct inode *inode,
0263 struct ocfs2_xattr_search *xs,
0264 struct ocfs2_xattr_set_ctxt *ctxt);
0265
0266 static int ocfs2_xattr_set_entry_index_block(struct inode *inode,
0267 struct ocfs2_xattr_info *xi,
0268 struct ocfs2_xattr_search *xs,
0269 struct ocfs2_xattr_set_ctxt *ctxt);
0270
0271 typedef int (xattr_tree_rec_func)(struct inode *inode,
0272 struct buffer_head *root_bh,
0273 u64 blkno, u32 cpos, u32 len, void *para);
0274 static int ocfs2_iterate_xattr_index_block(struct inode *inode,
0275 struct buffer_head *root_bh,
0276 xattr_tree_rec_func *rec_func,
0277 void *para);
0278 static int ocfs2_delete_xattr_in_bucket(struct inode *inode,
0279 struct ocfs2_xattr_bucket *bucket,
0280 void *para);
0281 static int ocfs2_rm_xattr_cluster(struct inode *inode,
0282 struct buffer_head *root_bh,
0283 u64 blkno,
0284 u32 cpos,
0285 u32 len,
0286 void *para);
0287
0288 static int ocfs2_mv_xattr_buckets(struct inode *inode, handle_t *handle,
0289 u64 src_blk, u64 last_blk, u64 to_blk,
0290 unsigned int start_bucket,
0291 u32 *first_hash);
0292 static int ocfs2_prepare_refcount_xattr(struct inode *inode,
0293 struct ocfs2_dinode *di,
0294 struct ocfs2_xattr_info *xi,
0295 struct ocfs2_xattr_search *xis,
0296 struct ocfs2_xattr_search *xbs,
0297 struct ocfs2_refcount_tree **ref_tree,
0298 int *meta_need,
0299 int *credits);
0300 static int ocfs2_get_xattr_tree_value_root(struct super_block *sb,
0301 struct ocfs2_xattr_bucket *bucket,
0302 int offset,
0303 struct ocfs2_xattr_value_root **xv,
0304 struct buffer_head **bh);
0305
0306 static inline u16 ocfs2_xattr_buckets_per_cluster(struct ocfs2_super *osb)
0307 {
0308 return (1 << osb->s_clustersize_bits) / OCFS2_XATTR_BUCKET_SIZE;
0309 }
0310
0311 static inline u16 ocfs2_blocks_per_xattr_bucket(struct super_block *sb)
0312 {
0313 return OCFS2_XATTR_BUCKET_SIZE / (1 << sb->s_blocksize_bits);
0314 }
0315
0316 #define bucket_blkno(_b) ((_b)->bu_bhs[0]->b_blocknr)
0317 #define bucket_block(_b, _n) ((_b)->bu_bhs[(_n)]->b_data)
0318 #define bucket_xh(_b) ((struct ocfs2_xattr_header *)bucket_block((_b), 0))
0319
0320 static struct ocfs2_xattr_bucket *ocfs2_xattr_bucket_new(struct inode *inode)
0321 {
0322 struct ocfs2_xattr_bucket *bucket;
0323 int blks = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
0324
0325 BUG_ON(blks > OCFS2_XATTR_MAX_BLOCKS_PER_BUCKET);
0326
0327 bucket = kzalloc(sizeof(struct ocfs2_xattr_bucket), GFP_NOFS);
0328 if (bucket) {
0329 bucket->bu_inode = inode;
0330 bucket->bu_blocks = blks;
0331 }
0332
0333 return bucket;
0334 }
0335
0336 static void ocfs2_xattr_bucket_relse(struct ocfs2_xattr_bucket *bucket)
0337 {
0338 int i;
0339
0340 for (i = 0; i < bucket->bu_blocks; i++) {
0341 brelse(bucket->bu_bhs[i]);
0342 bucket->bu_bhs[i] = NULL;
0343 }
0344 }
0345
0346 static void ocfs2_xattr_bucket_free(struct ocfs2_xattr_bucket *bucket)
0347 {
0348 if (bucket) {
0349 ocfs2_xattr_bucket_relse(bucket);
0350 bucket->bu_inode = NULL;
0351 kfree(bucket);
0352 }
0353 }
0354
0355
0356
0357
0358
0359
0360
0361 static int ocfs2_init_xattr_bucket(struct ocfs2_xattr_bucket *bucket,
0362 u64 xb_blkno, int new)
0363 {
0364 int i, rc = 0;
0365
0366 for (i = 0; i < bucket->bu_blocks; i++) {
0367 bucket->bu_bhs[i] = sb_getblk(bucket->bu_inode->i_sb,
0368 xb_blkno + i);
0369 if (!bucket->bu_bhs[i]) {
0370 rc = -ENOMEM;
0371 mlog_errno(rc);
0372 break;
0373 }
0374
0375 if (!ocfs2_buffer_uptodate(INODE_CACHE(bucket->bu_inode),
0376 bucket->bu_bhs[i])) {
0377 if (new)
0378 ocfs2_set_new_buffer_uptodate(INODE_CACHE(bucket->bu_inode),
0379 bucket->bu_bhs[i]);
0380 else {
0381 set_buffer_uptodate(bucket->bu_bhs[i]);
0382 ocfs2_set_buffer_uptodate(INODE_CACHE(bucket->bu_inode),
0383 bucket->bu_bhs[i]);
0384 }
0385 }
0386 }
0387
0388 if (rc)
0389 ocfs2_xattr_bucket_relse(bucket);
0390 return rc;
0391 }
0392
0393
0394 static int ocfs2_read_xattr_bucket(struct ocfs2_xattr_bucket *bucket,
0395 u64 xb_blkno)
0396 {
0397 int rc;
0398
0399 rc = ocfs2_read_blocks(INODE_CACHE(bucket->bu_inode), xb_blkno,
0400 bucket->bu_blocks, bucket->bu_bhs, 0,
0401 NULL);
0402 if (!rc) {
0403 spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
0404 rc = ocfs2_validate_meta_ecc_bhs(bucket->bu_inode->i_sb,
0405 bucket->bu_bhs,
0406 bucket->bu_blocks,
0407 &bucket_xh(bucket)->xh_check);
0408 spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
0409 if (rc)
0410 mlog_errno(rc);
0411 }
0412
0413 if (rc)
0414 ocfs2_xattr_bucket_relse(bucket);
0415 return rc;
0416 }
0417
0418 static int ocfs2_xattr_bucket_journal_access(handle_t *handle,
0419 struct ocfs2_xattr_bucket *bucket,
0420 int type)
0421 {
0422 int i, rc = 0;
0423
0424 for (i = 0; i < bucket->bu_blocks; i++) {
0425 rc = ocfs2_journal_access(handle,
0426 INODE_CACHE(bucket->bu_inode),
0427 bucket->bu_bhs[i], type);
0428 if (rc) {
0429 mlog_errno(rc);
0430 break;
0431 }
0432 }
0433
0434 return rc;
0435 }
0436
0437 static void ocfs2_xattr_bucket_journal_dirty(handle_t *handle,
0438 struct ocfs2_xattr_bucket *bucket)
0439 {
0440 int i;
0441
0442 spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
0443 ocfs2_compute_meta_ecc_bhs(bucket->bu_inode->i_sb,
0444 bucket->bu_bhs, bucket->bu_blocks,
0445 &bucket_xh(bucket)->xh_check);
0446 spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
0447
0448 for (i = 0; i < bucket->bu_blocks; i++)
0449 ocfs2_journal_dirty(handle, bucket->bu_bhs[i]);
0450 }
0451
0452 static void ocfs2_xattr_bucket_copy_data(struct ocfs2_xattr_bucket *dest,
0453 struct ocfs2_xattr_bucket *src)
0454 {
0455 int i;
0456 int blocksize = src->bu_inode->i_sb->s_blocksize;
0457
0458 BUG_ON(dest->bu_blocks != src->bu_blocks);
0459 BUG_ON(dest->bu_inode != src->bu_inode);
0460
0461 for (i = 0; i < src->bu_blocks; i++) {
0462 memcpy(bucket_block(dest, i), bucket_block(src, i),
0463 blocksize);
0464 }
0465 }
0466
0467 static int ocfs2_validate_xattr_block(struct super_block *sb,
0468 struct buffer_head *bh)
0469 {
0470 int rc;
0471 struct ocfs2_xattr_block *xb =
0472 (struct ocfs2_xattr_block *)bh->b_data;
0473
0474 trace_ocfs2_validate_xattr_block((unsigned long long)bh->b_blocknr);
0475
0476 BUG_ON(!buffer_uptodate(bh));
0477
0478
0479
0480
0481
0482
0483 rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &xb->xb_check);
0484 if (rc)
0485 return rc;
0486
0487
0488
0489
0490
0491 if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
0492 return ocfs2_error(sb,
0493 "Extended attribute block #%llu has bad signature %.*s\n",
0494 (unsigned long long)bh->b_blocknr, 7,
0495 xb->xb_signature);
0496 }
0497
0498 if (le64_to_cpu(xb->xb_blkno) != bh->b_blocknr) {
0499 return ocfs2_error(sb,
0500 "Extended attribute block #%llu has an invalid xb_blkno of %llu\n",
0501 (unsigned long long)bh->b_blocknr,
0502 (unsigned long long)le64_to_cpu(xb->xb_blkno));
0503 }
0504
0505 if (le32_to_cpu(xb->xb_fs_generation) != OCFS2_SB(sb)->fs_generation) {
0506 return ocfs2_error(sb,
0507 "Extended attribute block #%llu has an invalid xb_fs_generation of #%u\n",
0508 (unsigned long long)bh->b_blocknr,
0509 le32_to_cpu(xb->xb_fs_generation));
0510 }
0511
0512 return 0;
0513 }
0514
0515 static int ocfs2_read_xattr_block(struct inode *inode, u64 xb_blkno,
0516 struct buffer_head **bh)
0517 {
0518 int rc;
0519 struct buffer_head *tmp = *bh;
0520
0521 rc = ocfs2_read_block(INODE_CACHE(inode), xb_blkno, &tmp,
0522 ocfs2_validate_xattr_block);
0523
0524
0525 if (!rc && !*bh)
0526 *bh = tmp;
0527
0528 return rc;
0529 }
0530
0531 static inline const char *ocfs2_xattr_prefix(int name_index)
0532 {
0533 const struct xattr_handler *handler = NULL;
0534
0535 if (name_index > 0 && name_index < OCFS2_XATTR_MAX)
0536 handler = ocfs2_xattr_handler_map[name_index];
0537 return handler ? xattr_prefix(handler) : NULL;
0538 }
0539
0540 static u32 ocfs2_xattr_name_hash(struct inode *inode,
0541 const char *name,
0542 int name_len)
0543 {
0544
0545 u32 hash = OCFS2_SB(inode->i_sb)->uuid_hash;
0546 int i;
0547
0548
0549 for (i = 0; i < name_len; i++) {
0550 hash = (hash << OCFS2_HASH_SHIFT) ^
0551 (hash >> (8*sizeof(hash) - OCFS2_HASH_SHIFT)) ^
0552 *name++;
0553 }
0554
0555 return hash;
0556 }
0557
0558 static int ocfs2_xattr_entry_real_size(int name_len, size_t value_len)
0559 {
0560 return namevalue_size(name_len, value_len) +
0561 sizeof(struct ocfs2_xattr_entry);
0562 }
0563
0564 static int ocfs2_xi_entry_usage(struct ocfs2_xattr_info *xi)
0565 {
0566 return namevalue_size_xi(xi) +
0567 sizeof(struct ocfs2_xattr_entry);
0568 }
0569
0570 static int ocfs2_xe_entry_usage(struct ocfs2_xattr_entry *xe)
0571 {
0572 return namevalue_size_xe(xe) +
0573 sizeof(struct ocfs2_xattr_entry);
0574 }
0575
0576 int ocfs2_calc_security_init(struct inode *dir,
0577 struct ocfs2_security_xattr_info *si,
0578 int *want_clusters,
0579 int *xattr_credits,
0580 struct ocfs2_alloc_context **xattr_ac)
0581 {
0582 int ret = 0;
0583 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
0584 int s_size = ocfs2_xattr_entry_real_size(strlen(si->name),
0585 si->value_len);
0586
0587
0588
0589
0590
0591
0592 if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE ||
0593 s_size > OCFS2_XATTR_FREE_IN_IBODY) {
0594 ret = ocfs2_reserve_new_metadata_blocks(osb, 1, xattr_ac);
0595 if (ret) {
0596 mlog_errno(ret);
0597 return ret;
0598 }
0599 *xattr_credits += OCFS2_XATTR_BLOCK_CREATE_CREDITS;
0600 }
0601
0602
0603 if (si->value_len > OCFS2_XATTR_INLINE_SIZE) {
0604 int new_clusters = ocfs2_clusters_for_bytes(dir->i_sb,
0605 si->value_len);
0606
0607 *xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb,
0608 new_clusters);
0609 *want_clusters += new_clusters;
0610 }
0611 return ret;
0612 }
0613
0614 int ocfs2_calc_xattr_init(struct inode *dir,
0615 struct buffer_head *dir_bh,
0616 umode_t mode,
0617 struct ocfs2_security_xattr_info *si,
0618 int *want_clusters,
0619 int *xattr_credits,
0620 int *want_meta)
0621 {
0622 int ret = 0;
0623 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
0624 int s_size = 0, a_size = 0, acl_len = 0, new_clusters;
0625
0626 if (si->enable)
0627 s_size = ocfs2_xattr_entry_real_size(strlen(si->name),
0628 si->value_len);
0629
0630 if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) {
0631 down_read(&OCFS2_I(dir)->ip_xattr_sem);
0632 acl_len = ocfs2_xattr_get_nolock(dir, dir_bh,
0633 OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT,
0634 "", NULL, 0);
0635 up_read(&OCFS2_I(dir)->ip_xattr_sem);
0636 if (acl_len > 0) {
0637 a_size = ocfs2_xattr_entry_real_size(0, acl_len);
0638 if (S_ISDIR(mode))
0639 a_size <<= 1;
0640 } else if (acl_len != 0 && acl_len != -ENODATA) {
0641 ret = acl_len;
0642 mlog_errno(ret);
0643 return ret;
0644 }
0645 }
0646
0647 if (!(s_size + a_size))
0648 return ret;
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662 if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE ||
0663 (S_ISDIR(mode) && ocfs2_supports_inline_data(osb)) ||
0664 (s_size + a_size) > OCFS2_XATTR_FREE_IN_IBODY) {
0665 *want_meta = *want_meta + 1;
0666 *xattr_credits += OCFS2_XATTR_BLOCK_CREATE_CREDITS;
0667 }
0668
0669 if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE &&
0670 (s_size + a_size) > OCFS2_XATTR_FREE_IN_BLOCK(dir)) {
0671 *want_clusters += 1;
0672 *xattr_credits += ocfs2_blocks_per_xattr_bucket(dir->i_sb);
0673 }
0674
0675
0676
0677
0678
0679 if (si->enable && si->value_len > OCFS2_XATTR_INLINE_SIZE) {
0680 new_clusters = ocfs2_clusters_for_bytes(dir->i_sb,
0681 si->value_len);
0682 *xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb,
0683 new_clusters);
0684 *want_clusters += new_clusters;
0685 }
0686 if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL &&
0687 acl_len > OCFS2_XATTR_INLINE_SIZE) {
0688
0689 new_clusters = (S_ISDIR(mode) ? 2 : 1) *
0690 ocfs2_clusters_for_bytes(dir->i_sb, acl_len);
0691 *xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb,
0692 new_clusters);
0693 *want_clusters += new_clusters;
0694 }
0695
0696 return ret;
0697 }
0698
0699 static int ocfs2_xattr_extend_allocation(struct inode *inode,
0700 u32 clusters_to_add,
0701 struct ocfs2_xattr_value_buf *vb,
0702 struct ocfs2_xattr_set_ctxt *ctxt)
0703 {
0704 int status = 0, credits;
0705 handle_t *handle = ctxt->handle;
0706 enum ocfs2_alloc_restarted why;
0707 u32 prev_clusters, logical_start = le32_to_cpu(vb->vb_xv->xr_clusters);
0708 struct ocfs2_extent_tree et;
0709
0710 ocfs2_init_xattr_value_extent_tree(&et, INODE_CACHE(inode), vb);
0711
0712 while (clusters_to_add) {
0713 trace_ocfs2_xattr_extend_allocation(clusters_to_add);
0714
0715 status = vb->vb_access(handle, INODE_CACHE(inode), vb->vb_bh,
0716 OCFS2_JOURNAL_ACCESS_WRITE);
0717 if (status < 0) {
0718 mlog_errno(status);
0719 break;
0720 }
0721
0722 prev_clusters = le32_to_cpu(vb->vb_xv->xr_clusters);
0723 status = ocfs2_add_clusters_in_btree(handle,
0724 &et,
0725 &logical_start,
0726 clusters_to_add,
0727 0,
0728 ctxt->data_ac,
0729 ctxt->meta_ac,
0730 &why);
0731 if ((status < 0) && (status != -EAGAIN)) {
0732 if (status != -ENOSPC)
0733 mlog_errno(status);
0734 break;
0735 }
0736
0737 ocfs2_journal_dirty(handle, vb->vb_bh);
0738
0739 clusters_to_add -= le32_to_cpu(vb->vb_xv->xr_clusters) -
0740 prev_clusters;
0741
0742 if (why != RESTART_NONE && clusters_to_add) {
0743
0744
0745
0746
0747 BUG_ON(why == RESTART_META);
0748
0749 credits = ocfs2_calc_extend_credits(inode->i_sb,
0750 &vb->vb_xv->xr_list);
0751 status = ocfs2_extend_trans(handle, credits);
0752 if (status < 0) {
0753 status = -ENOMEM;
0754 mlog_errno(status);
0755 break;
0756 }
0757 }
0758 }
0759
0760 return status;
0761 }
0762
0763 static int __ocfs2_remove_xattr_range(struct inode *inode,
0764 struct ocfs2_xattr_value_buf *vb,
0765 u32 cpos, u32 phys_cpos, u32 len,
0766 unsigned int ext_flags,
0767 struct ocfs2_xattr_set_ctxt *ctxt)
0768 {
0769 int ret;
0770 u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos);
0771 handle_t *handle = ctxt->handle;
0772 struct ocfs2_extent_tree et;
0773
0774 ocfs2_init_xattr_value_extent_tree(&et, INODE_CACHE(inode), vb);
0775
0776 ret = vb->vb_access(handle, INODE_CACHE(inode), vb->vb_bh,
0777 OCFS2_JOURNAL_ACCESS_WRITE);
0778 if (ret) {
0779 mlog_errno(ret);
0780 goto out;
0781 }
0782
0783 ret = ocfs2_remove_extent(handle, &et, cpos, len, ctxt->meta_ac,
0784 &ctxt->dealloc);
0785 if (ret) {
0786 mlog_errno(ret);
0787 goto out;
0788 }
0789
0790 le32_add_cpu(&vb->vb_xv->xr_clusters, -len);
0791 ocfs2_journal_dirty(handle, vb->vb_bh);
0792
0793 if (ext_flags & OCFS2_EXT_REFCOUNTED)
0794 ret = ocfs2_decrease_refcount(inode, handle,
0795 ocfs2_blocks_to_clusters(inode->i_sb,
0796 phys_blkno),
0797 len, ctxt->meta_ac, &ctxt->dealloc, 1);
0798 else
0799 ret = ocfs2_cache_cluster_dealloc(&ctxt->dealloc,
0800 phys_blkno, len);
0801 if (ret)
0802 mlog_errno(ret);
0803
0804 out:
0805 return ret;
0806 }
0807
0808 static int ocfs2_xattr_shrink_size(struct inode *inode,
0809 u32 old_clusters,
0810 u32 new_clusters,
0811 struct ocfs2_xattr_value_buf *vb,
0812 struct ocfs2_xattr_set_ctxt *ctxt)
0813 {
0814 int ret = 0;
0815 unsigned int ext_flags;
0816 u32 trunc_len, cpos, phys_cpos, alloc_size;
0817 u64 block;
0818
0819 if (old_clusters <= new_clusters)
0820 return 0;
0821
0822 cpos = new_clusters;
0823 trunc_len = old_clusters - new_clusters;
0824 while (trunc_len) {
0825 ret = ocfs2_xattr_get_clusters(inode, cpos, &phys_cpos,
0826 &alloc_size,
0827 &vb->vb_xv->xr_list, &ext_flags);
0828 if (ret) {
0829 mlog_errno(ret);
0830 goto out;
0831 }
0832
0833 if (alloc_size > trunc_len)
0834 alloc_size = trunc_len;
0835
0836 ret = __ocfs2_remove_xattr_range(inode, vb, cpos,
0837 phys_cpos, alloc_size,
0838 ext_flags, ctxt);
0839 if (ret) {
0840 mlog_errno(ret);
0841 goto out;
0842 }
0843
0844 block = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos);
0845 ocfs2_remove_xattr_clusters_from_cache(INODE_CACHE(inode),
0846 block, alloc_size);
0847 cpos += alloc_size;
0848 trunc_len -= alloc_size;
0849 }
0850
0851 out:
0852 return ret;
0853 }
0854
0855 static int ocfs2_xattr_value_truncate(struct inode *inode,
0856 struct ocfs2_xattr_value_buf *vb,
0857 int len,
0858 struct ocfs2_xattr_set_ctxt *ctxt)
0859 {
0860 int ret;
0861 u32 new_clusters = ocfs2_clusters_for_bytes(inode->i_sb, len);
0862 u32 old_clusters = le32_to_cpu(vb->vb_xv->xr_clusters);
0863
0864 if (new_clusters == old_clusters)
0865 return 0;
0866
0867 if (new_clusters > old_clusters)
0868 ret = ocfs2_xattr_extend_allocation(inode,
0869 new_clusters - old_clusters,
0870 vb, ctxt);
0871 else
0872 ret = ocfs2_xattr_shrink_size(inode,
0873 old_clusters, new_clusters,
0874 vb, ctxt);
0875
0876 return ret;
0877 }
0878
0879 static int ocfs2_xattr_list_entry(struct super_block *sb,
0880 char *buffer, size_t size,
0881 size_t *result, int type,
0882 const char *name, int name_len)
0883 {
0884 char *p = buffer + *result;
0885 const char *prefix;
0886 int prefix_len;
0887 int total_len;
0888
0889 switch(type) {
0890 case OCFS2_XATTR_INDEX_USER:
0891 if (OCFS2_SB(sb)->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR)
0892 return 0;
0893 break;
0894
0895 case OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS:
0896 case OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT:
0897 if (!(sb->s_flags & SB_POSIXACL))
0898 return 0;
0899 break;
0900
0901 case OCFS2_XATTR_INDEX_TRUSTED:
0902 if (!capable(CAP_SYS_ADMIN))
0903 return 0;
0904 break;
0905 }
0906
0907 prefix = ocfs2_xattr_prefix(type);
0908 if (!prefix)
0909 return 0;
0910 prefix_len = strlen(prefix);
0911 total_len = prefix_len + name_len + 1;
0912 *result += total_len;
0913
0914
0915 if (!size)
0916 return 0;
0917
0918 if (*result > size)
0919 return -ERANGE;
0920
0921 memcpy(p, prefix, prefix_len);
0922 memcpy(p + prefix_len, name, name_len);
0923 p[prefix_len + name_len] = '\0';
0924
0925 return 0;
0926 }
0927
0928 static int ocfs2_xattr_list_entries(struct inode *inode,
0929 struct ocfs2_xattr_header *header,
0930 char *buffer, size_t buffer_size)
0931 {
0932 size_t result = 0;
0933 int i, type, ret;
0934 const char *name;
0935
0936 for (i = 0 ; i < le16_to_cpu(header->xh_count); i++) {
0937 struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
0938 type = ocfs2_xattr_get_type(entry);
0939 name = (const char *)header +
0940 le16_to_cpu(entry->xe_name_offset);
0941
0942 ret = ocfs2_xattr_list_entry(inode->i_sb,
0943 buffer, buffer_size,
0944 &result, type, name,
0945 entry->xe_name_len);
0946 if (ret)
0947 return ret;
0948 }
0949
0950 return result;
0951 }
0952
0953 int ocfs2_has_inline_xattr_value_outside(struct inode *inode,
0954 struct ocfs2_dinode *di)
0955 {
0956 struct ocfs2_xattr_header *xh;
0957 int i;
0958
0959 xh = (struct ocfs2_xattr_header *)
0960 ((void *)di + inode->i_sb->s_blocksize -
0961 le16_to_cpu(di->i_xattr_inline_size));
0962
0963 for (i = 0; i < le16_to_cpu(xh->xh_count); i++)
0964 if (!ocfs2_xattr_is_local(&xh->xh_entries[i]))
0965 return 1;
0966
0967 return 0;
0968 }
0969
0970 static int ocfs2_xattr_ibody_list(struct inode *inode,
0971 struct ocfs2_dinode *di,
0972 char *buffer,
0973 size_t buffer_size)
0974 {
0975 struct ocfs2_xattr_header *header = NULL;
0976 struct ocfs2_inode_info *oi = OCFS2_I(inode);
0977 int ret = 0;
0978
0979 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL))
0980 return ret;
0981
0982 header = (struct ocfs2_xattr_header *)
0983 ((void *)di + inode->i_sb->s_blocksize -
0984 le16_to_cpu(di->i_xattr_inline_size));
0985
0986 ret = ocfs2_xattr_list_entries(inode, header, buffer, buffer_size);
0987
0988 return ret;
0989 }
0990
0991 static int ocfs2_xattr_block_list(struct inode *inode,
0992 struct ocfs2_dinode *di,
0993 char *buffer,
0994 size_t buffer_size)
0995 {
0996 struct buffer_head *blk_bh = NULL;
0997 struct ocfs2_xattr_block *xb;
0998 int ret = 0;
0999
1000 if (!di->i_xattr_loc)
1001 return ret;
1002
1003 ret = ocfs2_read_xattr_block(inode, le64_to_cpu(di->i_xattr_loc),
1004 &blk_bh);
1005 if (ret < 0) {
1006 mlog_errno(ret);
1007 return ret;
1008 }
1009
1010 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
1011 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
1012 struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header;
1013 ret = ocfs2_xattr_list_entries(inode, header,
1014 buffer, buffer_size);
1015 } else
1016 ret = ocfs2_xattr_tree_list_index_block(inode, blk_bh,
1017 buffer, buffer_size);
1018
1019 brelse(blk_bh);
1020
1021 return ret;
1022 }
1023
1024 ssize_t ocfs2_listxattr(struct dentry *dentry,
1025 char *buffer,
1026 size_t size)
1027 {
1028 int ret = 0, i_ret = 0, b_ret = 0;
1029 struct buffer_head *di_bh = NULL;
1030 struct ocfs2_dinode *di = NULL;
1031 struct ocfs2_inode_info *oi = OCFS2_I(d_inode(dentry));
1032
1033 if (!ocfs2_supports_xattr(OCFS2_SB(dentry->d_sb)))
1034 return -EOPNOTSUPP;
1035
1036 if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
1037 return ret;
1038
1039 ret = ocfs2_inode_lock(d_inode(dentry), &di_bh, 0);
1040 if (ret < 0) {
1041 mlog_errno(ret);
1042 return ret;
1043 }
1044
1045 di = (struct ocfs2_dinode *)di_bh->b_data;
1046
1047 down_read(&oi->ip_xattr_sem);
1048 i_ret = ocfs2_xattr_ibody_list(d_inode(dentry), di, buffer, size);
1049 if (i_ret < 0)
1050 b_ret = 0;
1051 else {
1052 if (buffer) {
1053 buffer += i_ret;
1054 size -= i_ret;
1055 }
1056 b_ret = ocfs2_xattr_block_list(d_inode(dentry), di,
1057 buffer, size);
1058 if (b_ret < 0)
1059 i_ret = 0;
1060 }
1061 up_read(&oi->ip_xattr_sem);
1062 ocfs2_inode_unlock(d_inode(dentry), 0);
1063
1064 brelse(di_bh);
1065
1066 return i_ret + b_ret;
1067 }
1068
1069 static int ocfs2_xattr_find_entry(int name_index,
1070 const char *name,
1071 struct ocfs2_xattr_search *xs)
1072 {
1073 struct ocfs2_xattr_entry *entry;
1074 size_t name_len;
1075 int i, cmp = 1;
1076
1077 if (name == NULL)
1078 return -EINVAL;
1079
1080 name_len = strlen(name);
1081 entry = xs->here;
1082 for (i = 0; i < le16_to_cpu(xs->header->xh_count); i++) {
1083 cmp = name_index - ocfs2_xattr_get_type(entry);
1084 if (!cmp)
1085 cmp = name_len - entry->xe_name_len;
1086 if (!cmp)
1087 cmp = memcmp(name, (xs->base +
1088 le16_to_cpu(entry->xe_name_offset)),
1089 name_len);
1090 if (cmp == 0)
1091 break;
1092 entry += 1;
1093 }
1094 xs->here = entry;
1095
1096 return cmp ? -ENODATA : 0;
1097 }
1098
1099 static int ocfs2_xattr_get_value_outside(struct inode *inode,
1100 struct ocfs2_xattr_value_root *xv,
1101 void *buffer,
1102 size_t len)
1103 {
1104 u32 cpos, p_cluster, num_clusters, bpc, clusters;
1105 u64 blkno;
1106 int i, ret = 0;
1107 size_t cplen, blocksize;
1108 struct buffer_head *bh = NULL;
1109 struct ocfs2_extent_list *el;
1110
1111 el = &xv->xr_list;
1112 clusters = le32_to_cpu(xv->xr_clusters);
1113 bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
1114 blocksize = inode->i_sb->s_blocksize;
1115
1116 cpos = 0;
1117 while (cpos < clusters) {
1118 ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
1119 &num_clusters, el, NULL);
1120 if (ret) {
1121 mlog_errno(ret);
1122 goto out;
1123 }
1124
1125 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster);
1126
1127 for (i = 0; i < num_clusters * bpc; i++, blkno++) {
1128 ret = ocfs2_read_block(INODE_CACHE(inode), blkno,
1129 &bh, NULL);
1130 if (ret) {
1131 mlog_errno(ret);
1132 goto out;
1133 }
1134
1135 cplen = len >= blocksize ? blocksize : len;
1136 memcpy(buffer, bh->b_data, cplen);
1137 len -= cplen;
1138 buffer += cplen;
1139
1140 brelse(bh);
1141 bh = NULL;
1142 if (len == 0)
1143 break;
1144 }
1145 cpos += num_clusters;
1146 }
1147 out:
1148 return ret;
1149 }
1150
1151 static int ocfs2_xattr_ibody_get(struct inode *inode,
1152 int name_index,
1153 const char *name,
1154 void *buffer,
1155 size_t buffer_size,
1156 struct ocfs2_xattr_search *xs)
1157 {
1158 struct ocfs2_inode_info *oi = OCFS2_I(inode);
1159 struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
1160 struct ocfs2_xattr_value_root *xv;
1161 size_t size;
1162 int ret = 0;
1163
1164 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL))
1165 return -ENODATA;
1166
1167 xs->end = (void *)di + inode->i_sb->s_blocksize;
1168 xs->header = (struct ocfs2_xattr_header *)
1169 (xs->end - le16_to_cpu(di->i_xattr_inline_size));
1170 xs->base = (void *)xs->header;
1171 xs->here = xs->header->xh_entries;
1172
1173 ret = ocfs2_xattr_find_entry(name_index, name, xs);
1174 if (ret)
1175 return ret;
1176 size = le64_to_cpu(xs->here->xe_value_size);
1177 if (buffer) {
1178 if (size > buffer_size)
1179 return -ERANGE;
1180 if (ocfs2_xattr_is_local(xs->here)) {
1181 memcpy(buffer, (void *)xs->base +
1182 le16_to_cpu(xs->here->xe_name_offset) +
1183 OCFS2_XATTR_SIZE(xs->here->xe_name_len), size);
1184 } else {
1185 xv = (struct ocfs2_xattr_value_root *)
1186 (xs->base + le16_to_cpu(
1187 xs->here->xe_name_offset) +
1188 OCFS2_XATTR_SIZE(xs->here->xe_name_len));
1189 ret = ocfs2_xattr_get_value_outside(inode, xv,
1190 buffer, size);
1191 if (ret < 0) {
1192 mlog_errno(ret);
1193 return ret;
1194 }
1195 }
1196 }
1197
1198 return size;
1199 }
1200
1201 static int ocfs2_xattr_block_get(struct inode *inode,
1202 int name_index,
1203 const char *name,
1204 void *buffer,
1205 size_t buffer_size,
1206 struct ocfs2_xattr_search *xs)
1207 {
1208 struct ocfs2_xattr_block *xb;
1209 struct ocfs2_xattr_value_root *xv;
1210 size_t size;
1211 int ret = -ENODATA, name_offset, name_len, i;
1212 int block_off;
1213
1214 xs->bucket = ocfs2_xattr_bucket_new(inode);
1215 if (!xs->bucket) {
1216 ret = -ENOMEM;
1217 mlog_errno(ret);
1218 goto cleanup;
1219 }
1220
1221 ret = ocfs2_xattr_block_find(inode, name_index, name, xs);
1222 if (ret) {
1223 mlog_errno(ret);
1224 goto cleanup;
1225 }
1226
1227 if (xs->not_found) {
1228 ret = -ENODATA;
1229 goto cleanup;
1230 }
1231
1232 xb = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
1233 size = le64_to_cpu(xs->here->xe_value_size);
1234 if (buffer) {
1235 ret = -ERANGE;
1236 if (size > buffer_size)
1237 goto cleanup;
1238
1239 name_offset = le16_to_cpu(xs->here->xe_name_offset);
1240 name_len = OCFS2_XATTR_SIZE(xs->here->xe_name_len);
1241 i = xs->here - xs->header->xh_entries;
1242
1243 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) {
1244 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
1245 bucket_xh(xs->bucket),
1246 i,
1247 &block_off,
1248 &name_offset);
1249 if (ret) {
1250 mlog_errno(ret);
1251 goto cleanup;
1252 }
1253 xs->base = bucket_block(xs->bucket, block_off);
1254 }
1255 if (ocfs2_xattr_is_local(xs->here)) {
1256 memcpy(buffer, (void *)xs->base +
1257 name_offset + name_len, size);
1258 } else {
1259 xv = (struct ocfs2_xattr_value_root *)
1260 (xs->base + name_offset + name_len);
1261 ret = ocfs2_xattr_get_value_outside(inode, xv,
1262 buffer, size);
1263 if (ret < 0) {
1264 mlog_errno(ret);
1265 goto cleanup;
1266 }
1267 }
1268 }
1269 ret = size;
1270 cleanup:
1271 ocfs2_xattr_bucket_free(xs->bucket);
1272
1273 brelse(xs->xattr_bh);
1274 xs->xattr_bh = NULL;
1275 return ret;
1276 }
1277
1278 int ocfs2_xattr_get_nolock(struct inode *inode,
1279 struct buffer_head *di_bh,
1280 int name_index,
1281 const char *name,
1282 void *buffer,
1283 size_t buffer_size)
1284 {
1285 int ret;
1286 struct ocfs2_dinode *di = NULL;
1287 struct ocfs2_inode_info *oi = OCFS2_I(inode);
1288 struct ocfs2_xattr_search xis = {
1289 .not_found = -ENODATA,
1290 };
1291 struct ocfs2_xattr_search xbs = {
1292 .not_found = -ENODATA,
1293 };
1294
1295 if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
1296 return -EOPNOTSUPP;
1297
1298 if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
1299 return -ENODATA;
1300
1301 xis.inode_bh = xbs.inode_bh = di_bh;
1302 di = (struct ocfs2_dinode *)di_bh->b_data;
1303
1304 ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer,
1305 buffer_size, &xis);
1306 if (ret == -ENODATA && di->i_xattr_loc)
1307 ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
1308 buffer_size, &xbs);
1309
1310 return ret;
1311 }
1312
1313
1314
1315
1316
1317
1318 static int ocfs2_xattr_get(struct inode *inode,
1319 int name_index,
1320 const char *name,
1321 void *buffer,
1322 size_t buffer_size)
1323 {
1324 int ret, had_lock;
1325 struct buffer_head *di_bh = NULL;
1326 struct ocfs2_lock_holder oh;
1327
1328 had_lock = ocfs2_inode_lock_tracker(inode, &di_bh, 0, &oh);
1329 if (had_lock < 0) {
1330 mlog_errno(had_lock);
1331 return had_lock;
1332 }
1333 down_read(&OCFS2_I(inode)->ip_xattr_sem);
1334 ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index,
1335 name, buffer, buffer_size);
1336 up_read(&OCFS2_I(inode)->ip_xattr_sem);
1337
1338 ocfs2_inode_unlock_tracker(inode, 0, &oh, had_lock);
1339
1340 brelse(di_bh);
1341
1342 return ret;
1343 }
1344
1345 static int __ocfs2_xattr_set_value_outside(struct inode *inode,
1346 handle_t *handle,
1347 struct ocfs2_xattr_value_buf *vb,
1348 const void *value,
1349 int value_len)
1350 {
1351 int ret = 0, i, cp_len;
1352 u16 blocksize = inode->i_sb->s_blocksize;
1353 u32 p_cluster, num_clusters;
1354 u32 cpos = 0, bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
1355 u32 clusters = ocfs2_clusters_for_bytes(inode->i_sb, value_len);
1356 u64 blkno;
1357 struct buffer_head *bh = NULL;
1358 unsigned int ext_flags;
1359 struct ocfs2_xattr_value_root *xv = vb->vb_xv;
1360
1361 BUG_ON(clusters > le32_to_cpu(xv->xr_clusters));
1362
1363 while (cpos < clusters) {
1364 ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
1365 &num_clusters, &xv->xr_list,
1366 &ext_flags);
1367 if (ret) {
1368 mlog_errno(ret);
1369 goto out;
1370 }
1371
1372 BUG_ON(ext_flags & OCFS2_EXT_REFCOUNTED);
1373
1374 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster);
1375
1376 for (i = 0; i < num_clusters * bpc; i++, blkno++) {
1377 ret = ocfs2_read_block(INODE_CACHE(inode), blkno,
1378 &bh, NULL);
1379 if (ret) {
1380 mlog_errno(ret);
1381 goto out;
1382 }
1383
1384 ret = ocfs2_journal_access(handle,
1385 INODE_CACHE(inode),
1386 bh,
1387 OCFS2_JOURNAL_ACCESS_WRITE);
1388 if (ret < 0) {
1389 mlog_errno(ret);
1390 goto out;
1391 }
1392
1393 cp_len = value_len > blocksize ? blocksize : value_len;
1394 memcpy(bh->b_data, value, cp_len);
1395 value_len -= cp_len;
1396 value += cp_len;
1397 if (cp_len < blocksize)
1398 memset(bh->b_data + cp_len, 0,
1399 blocksize - cp_len);
1400
1401 ocfs2_journal_dirty(handle, bh);
1402 brelse(bh);
1403 bh = NULL;
1404
1405
1406
1407
1408
1409 if (!value_len)
1410 break;
1411 }
1412 cpos += num_clusters;
1413 }
1414 out:
1415 brelse(bh);
1416
1417 return ret;
1418 }
1419
1420 static int ocfs2_xa_check_space_helper(int needed_space, int free_start,
1421 int num_entries)
1422 {
1423 int free_space;
1424
1425 if (!needed_space)
1426 return 0;
1427
1428 free_space = free_start -
1429 sizeof(struct ocfs2_xattr_header) -
1430 (num_entries * sizeof(struct ocfs2_xattr_entry)) -
1431 OCFS2_XATTR_HEADER_GAP;
1432 if (free_space < 0)
1433 return -EIO;
1434 if (free_space < needed_space)
1435 return -ENOSPC;
1436
1437 return 0;
1438 }
1439
1440 static int ocfs2_xa_journal_access(handle_t *handle, struct ocfs2_xa_loc *loc,
1441 int type)
1442 {
1443 return loc->xl_ops->xlo_journal_access(handle, loc, type);
1444 }
1445
1446 static void ocfs2_xa_journal_dirty(handle_t *handle, struct ocfs2_xa_loc *loc)
1447 {
1448 loc->xl_ops->xlo_journal_dirty(handle, loc);
1449 }
1450
1451
1452 static void *ocfs2_xa_offset_pointer(struct ocfs2_xa_loc *loc, int offset)
1453 {
1454 BUG_ON(offset >= loc->xl_size);
1455 return loc->xl_ops->xlo_offset_pointer(loc, offset);
1456 }
1457
1458
1459
1460
1461
1462
1463 static void ocfs2_xa_wipe_namevalue(struct ocfs2_xa_loc *loc)
1464 {
1465 loc->xl_ops->xlo_wipe_namevalue(loc);
1466 }
1467
1468
1469
1470
1471
1472 static int ocfs2_xa_get_free_start(struct ocfs2_xa_loc *loc)
1473 {
1474 return loc->xl_ops->xlo_get_free_start(loc);
1475 }
1476
1477
1478 static int ocfs2_xa_can_reuse_entry(struct ocfs2_xa_loc *loc,
1479 struct ocfs2_xattr_info *xi)
1480 {
1481 return loc->xl_ops->xlo_can_reuse(loc, xi);
1482 }
1483
1484
1485 static int ocfs2_xa_check_space(struct ocfs2_xa_loc *loc,
1486 struct ocfs2_xattr_info *xi)
1487 {
1488 return loc->xl_ops->xlo_check_space(loc, xi);
1489 }
1490
1491 static void ocfs2_xa_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1492 {
1493 loc->xl_ops->xlo_add_entry(loc, name_hash);
1494 loc->xl_entry->xe_name_hash = cpu_to_le32(name_hash);
1495
1496
1497
1498
1499
1500 loc->xl_entry->xe_name_offset = cpu_to_le16(loc->xl_size);
1501 }
1502
1503 static void ocfs2_xa_add_namevalue(struct ocfs2_xa_loc *loc,
1504 struct ocfs2_xattr_info *xi)
1505 {
1506 int size = namevalue_size_xi(xi);
1507 int nameval_offset;
1508 char *nameval_buf;
1509
1510 loc->xl_ops->xlo_add_namevalue(loc, size);
1511 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len);
1512 loc->xl_entry->xe_name_len = xi->xi_name_len;
1513 ocfs2_xattr_set_type(loc->xl_entry, xi->xi_name_index);
1514 ocfs2_xattr_set_local(loc->xl_entry,
1515 xi->xi_value_len <= OCFS2_XATTR_INLINE_SIZE);
1516
1517 nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1518 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset);
1519 memset(nameval_buf, 0, size);
1520 memcpy(nameval_buf, xi->xi_name, xi->xi_name_len);
1521 }
1522
1523 static void ocfs2_xa_fill_value_buf(struct ocfs2_xa_loc *loc,
1524 struct ocfs2_xattr_value_buf *vb)
1525 {
1526 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1527 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len);
1528
1529
1530 BUG_ON(ocfs2_xattr_is_local(loc->xl_entry));
1531 BUG_ON(namevalue_size_xe(loc->xl_entry) !=
1532 (name_size + OCFS2_XATTR_ROOT_SIZE));
1533
1534 loc->xl_ops->xlo_fill_value_buf(loc, vb);
1535 vb->vb_xv =
1536 (struct ocfs2_xattr_value_root *)ocfs2_xa_offset_pointer(loc,
1537 nameval_offset +
1538 name_size);
1539 }
1540
1541 static int ocfs2_xa_block_journal_access(handle_t *handle,
1542 struct ocfs2_xa_loc *loc, int type)
1543 {
1544 struct buffer_head *bh = loc->xl_storage;
1545 ocfs2_journal_access_func access;
1546
1547 if (loc->xl_size == (bh->b_size -
1548 offsetof(struct ocfs2_xattr_block,
1549 xb_attrs.xb_header)))
1550 access = ocfs2_journal_access_xb;
1551 else
1552 access = ocfs2_journal_access_di;
1553 return access(handle, INODE_CACHE(loc->xl_inode), bh, type);
1554 }
1555
1556 static void ocfs2_xa_block_journal_dirty(handle_t *handle,
1557 struct ocfs2_xa_loc *loc)
1558 {
1559 struct buffer_head *bh = loc->xl_storage;
1560
1561 ocfs2_journal_dirty(handle, bh);
1562 }
1563
1564 static void *ocfs2_xa_block_offset_pointer(struct ocfs2_xa_loc *loc,
1565 int offset)
1566 {
1567 return (char *)loc->xl_header + offset;
1568 }
1569
1570 static int ocfs2_xa_block_can_reuse(struct ocfs2_xa_loc *loc,
1571 struct ocfs2_xattr_info *xi)
1572 {
1573
1574
1575
1576
1577 return namevalue_size_xe(loc->xl_entry) ==
1578 namevalue_size_xi(xi);
1579 }
1580
1581 static int ocfs2_xa_block_get_free_start(struct ocfs2_xa_loc *loc)
1582 {
1583 struct ocfs2_xattr_header *xh = loc->xl_header;
1584 int i, count = le16_to_cpu(xh->xh_count);
1585 int offset, free_start = loc->xl_size;
1586
1587 for (i = 0; i < count; i++) {
1588 offset = le16_to_cpu(xh->xh_entries[i].xe_name_offset);
1589 if (offset < free_start)
1590 free_start = offset;
1591 }
1592
1593 return free_start;
1594 }
1595
1596 static int ocfs2_xa_block_check_space(struct ocfs2_xa_loc *loc,
1597 struct ocfs2_xattr_info *xi)
1598 {
1599 int count = le16_to_cpu(loc->xl_header->xh_count);
1600 int free_start = ocfs2_xa_get_free_start(loc);
1601 int needed_space = ocfs2_xi_entry_usage(xi);
1602
1603
1604
1605
1606
1607
1608 if (loc->xl_entry) {
1609
1610 if (ocfs2_xa_can_reuse_entry(loc, xi))
1611 needed_space = 0;
1612 else
1613 needed_space -= ocfs2_xe_entry_usage(loc->xl_entry);
1614 }
1615 if (needed_space < 0)
1616 needed_space = 0;
1617 return ocfs2_xa_check_space_helper(needed_space, free_start, count);
1618 }
1619
1620
1621
1622
1623
1624 static void ocfs2_xa_block_wipe_namevalue(struct ocfs2_xa_loc *loc)
1625 {
1626 int i, offset;
1627 int namevalue_offset, first_namevalue_offset, namevalue_size;
1628 struct ocfs2_xattr_entry *entry = loc->xl_entry;
1629 struct ocfs2_xattr_header *xh = loc->xl_header;
1630 int count = le16_to_cpu(xh->xh_count);
1631
1632 namevalue_offset = le16_to_cpu(entry->xe_name_offset);
1633 namevalue_size = namevalue_size_xe(entry);
1634 first_namevalue_offset = ocfs2_xa_get_free_start(loc);
1635
1636
1637 memmove((char *)xh + first_namevalue_offset + namevalue_size,
1638 (char *)xh + first_namevalue_offset,
1639 namevalue_offset - first_namevalue_offset);
1640 memset((char *)xh + first_namevalue_offset, 0, namevalue_size);
1641
1642
1643 for (i = 0; i < count; i++) {
1644 offset = le16_to_cpu(xh->xh_entries[i].xe_name_offset);
1645 if (offset <= namevalue_offset)
1646 le16_add_cpu(&xh->xh_entries[i].xe_name_offset,
1647 namevalue_size);
1648 }
1649
1650
1651
1652
1653
1654 }
1655
1656 static void ocfs2_xa_block_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1657 {
1658 int count = le16_to_cpu(loc->xl_header->xh_count);
1659 loc->xl_entry = &(loc->xl_header->xh_entries[count]);
1660 le16_add_cpu(&loc->xl_header->xh_count, 1);
1661 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry));
1662 }
1663
1664 static void ocfs2_xa_block_add_namevalue(struct ocfs2_xa_loc *loc, int size)
1665 {
1666 int free_start = ocfs2_xa_get_free_start(loc);
1667
1668 loc->xl_entry->xe_name_offset = cpu_to_le16(free_start - size);
1669 }
1670
1671 static void ocfs2_xa_block_fill_value_buf(struct ocfs2_xa_loc *loc,
1672 struct ocfs2_xattr_value_buf *vb)
1673 {
1674 struct buffer_head *bh = loc->xl_storage;
1675
1676 if (loc->xl_size == (bh->b_size -
1677 offsetof(struct ocfs2_xattr_block,
1678 xb_attrs.xb_header)))
1679 vb->vb_access = ocfs2_journal_access_xb;
1680 else
1681 vb->vb_access = ocfs2_journal_access_di;
1682 vb->vb_bh = bh;
1683 }
1684
1685
1686
1687
1688
1689 static const struct ocfs2_xa_loc_operations ocfs2_xa_block_loc_ops = {
1690 .xlo_journal_access = ocfs2_xa_block_journal_access,
1691 .xlo_journal_dirty = ocfs2_xa_block_journal_dirty,
1692 .xlo_offset_pointer = ocfs2_xa_block_offset_pointer,
1693 .xlo_check_space = ocfs2_xa_block_check_space,
1694 .xlo_can_reuse = ocfs2_xa_block_can_reuse,
1695 .xlo_get_free_start = ocfs2_xa_block_get_free_start,
1696 .xlo_wipe_namevalue = ocfs2_xa_block_wipe_namevalue,
1697 .xlo_add_entry = ocfs2_xa_block_add_entry,
1698 .xlo_add_namevalue = ocfs2_xa_block_add_namevalue,
1699 .xlo_fill_value_buf = ocfs2_xa_block_fill_value_buf,
1700 };
1701
1702 static int ocfs2_xa_bucket_journal_access(handle_t *handle,
1703 struct ocfs2_xa_loc *loc, int type)
1704 {
1705 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1706
1707 return ocfs2_xattr_bucket_journal_access(handle, bucket, type);
1708 }
1709
1710 static void ocfs2_xa_bucket_journal_dirty(handle_t *handle,
1711 struct ocfs2_xa_loc *loc)
1712 {
1713 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1714
1715 ocfs2_xattr_bucket_journal_dirty(handle, bucket);
1716 }
1717
1718 static void *ocfs2_xa_bucket_offset_pointer(struct ocfs2_xa_loc *loc,
1719 int offset)
1720 {
1721 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1722 int block, block_offset;
1723
1724
1725 block = offset >> loc->xl_inode->i_sb->s_blocksize_bits;
1726 block_offset = offset % loc->xl_inode->i_sb->s_blocksize;
1727
1728 return bucket_block(bucket, block) + block_offset;
1729 }
1730
1731 static int ocfs2_xa_bucket_can_reuse(struct ocfs2_xa_loc *loc,
1732 struct ocfs2_xattr_info *xi)
1733 {
1734 return namevalue_size_xe(loc->xl_entry) >=
1735 namevalue_size_xi(xi);
1736 }
1737
1738 static int ocfs2_xa_bucket_get_free_start(struct ocfs2_xa_loc *loc)
1739 {
1740 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1741 return le16_to_cpu(bucket_xh(bucket)->xh_free_start);
1742 }
1743
1744 static int ocfs2_bucket_align_free_start(struct super_block *sb,
1745 int free_start, int size)
1746 {
1747
1748
1749
1750
1751 if (((free_start - size) >> sb->s_blocksize_bits) !=
1752 ((free_start - 1) >> sb->s_blocksize_bits))
1753 free_start -= free_start % sb->s_blocksize;
1754
1755 return free_start;
1756 }
1757
1758 static int ocfs2_xa_bucket_check_space(struct ocfs2_xa_loc *loc,
1759 struct ocfs2_xattr_info *xi)
1760 {
1761 int rc;
1762 int count = le16_to_cpu(loc->xl_header->xh_count);
1763 int free_start = ocfs2_xa_get_free_start(loc);
1764 int needed_space = ocfs2_xi_entry_usage(xi);
1765 int size = namevalue_size_xi(xi);
1766 struct super_block *sb = loc->xl_inode->i_sb;
1767
1768
1769
1770
1771
1772
1773
1774 if (loc->xl_entry) {
1775
1776 if (ocfs2_xa_can_reuse_entry(loc, xi))
1777 needed_space = 0;
1778 else
1779 needed_space -= sizeof(struct ocfs2_xattr_entry);
1780 }
1781 BUG_ON(needed_space < 0);
1782
1783 if (free_start < size) {
1784 if (needed_space)
1785 return -ENOSPC;
1786 } else {
1787
1788
1789
1790
1791
1792
1793 rc = ocfs2_xa_check_space_helper(needed_space, free_start,
1794 count);
1795 if (rc)
1796 return rc;
1797 free_start = ocfs2_bucket_align_free_start(sb, free_start,
1798 size);
1799 }
1800 return ocfs2_xa_check_space_helper(needed_space, free_start, count);
1801 }
1802
1803 static void ocfs2_xa_bucket_wipe_namevalue(struct ocfs2_xa_loc *loc)
1804 {
1805 le16_add_cpu(&loc->xl_header->xh_name_value_len,
1806 -namevalue_size_xe(loc->xl_entry));
1807 }
1808
1809 static void ocfs2_xa_bucket_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1810 {
1811 struct ocfs2_xattr_header *xh = loc->xl_header;
1812 int count = le16_to_cpu(xh->xh_count);
1813 int low = 0, high = count - 1, tmp;
1814 struct ocfs2_xattr_entry *tmp_xe;
1815
1816
1817
1818
1819
1820 while (low <= high && count) {
1821 tmp = (low + high) / 2;
1822 tmp_xe = &xh->xh_entries[tmp];
1823
1824 if (name_hash > le32_to_cpu(tmp_xe->xe_name_hash))
1825 low = tmp + 1;
1826 else if (name_hash < le32_to_cpu(tmp_xe->xe_name_hash))
1827 high = tmp - 1;
1828 else {
1829 low = tmp;
1830 break;
1831 }
1832 }
1833
1834 if (low != count)
1835 memmove(&xh->xh_entries[low + 1],
1836 &xh->xh_entries[low],
1837 ((count - low) * sizeof(struct ocfs2_xattr_entry)));
1838
1839 le16_add_cpu(&xh->xh_count, 1);
1840 loc->xl_entry = &xh->xh_entries[low];
1841 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry));
1842 }
1843
1844 static void ocfs2_xa_bucket_add_namevalue(struct ocfs2_xa_loc *loc, int size)
1845 {
1846 int free_start = ocfs2_xa_get_free_start(loc);
1847 struct ocfs2_xattr_header *xh = loc->xl_header;
1848 struct super_block *sb = loc->xl_inode->i_sb;
1849 int nameval_offset;
1850
1851 free_start = ocfs2_bucket_align_free_start(sb, free_start, size);
1852 nameval_offset = free_start - size;
1853 loc->xl_entry->xe_name_offset = cpu_to_le16(nameval_offset);
1854 xh->xh_free_start = cpu_to_le16(nameval_offset);
1855 le16_add_cpu(&xh->xh_name_value_len, size);
1856
1857 }
1858
1859 static void ocfs2_xa_bucket_fill_value_buf(struct ocfs2_xa_loc *loc,
1860 struct ocfs2_xattr_value_buf *vb)
1861 {
1862 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1863 struct super_block *sb = loc->xl_inode->i_sb;
1864 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1865 int size = namevalue_size_xe(loc->xl_entry);
1866 int block_offset = nameval_offset >> sb->s_blocksize_bits;
1867
1868
1869 BUG_ON(block_offset !=
1870 ((nameval_offset + size - 1) >> sb->s_blocksize_bits));
1871
1872 BUG_ON(!bucket->bu_bhs[block_offset]);
1873
1874 vb->vb_access = ocfs2_journal_access;
1875 vb->vb_bh = bucket->bu_bhs[block_offset];
1876 }
1877
1878
1879 static const struct ocfs2_xa_loc_operations ocfs2_xa_bucket_loc_ops = {
1880 .xlo_journal_access = ocfs2_xa_bucket_journal_access,
1881 .xlo_journal_dirty = ocfs2_xa_bucket_journal_dirty,
1882 .xlo_offset_pointer = ocfs2_xa_bucket_offset_pointer,
1883 .xlo_check_space = ocfs2_xa_bucket_check_space,
1884 .xlo_can_reuse = ocfs2_xa_bucket_can_reuse,
1885 .xlo_get_free_start = ocfs2_xa_bucket_get_free_start,
1886 .xlo_wipe_namevalue = ocfs2_xa_bucket_wipe_namevalue,
1887 .xlo_add_entry = ocfs2_xa_bucket_add_entry,
1888 .xlo_add_namevalue = ocfs2_xa_bucket_add_namevalue,
1889 .xlo_fill_value_buf = ocfs2_xa_bucket_fill_value_buf,
1890 };
1891
1892 static unsigned int ocfs2_xa_value_clusters(struct ocfs2_xa_loc *loc)
1893 {
1894 struct ocfs2_xattr_value_buf vb;
1895
1896 if (ocfs2_xattr_is_local(loc->xl_entry))
1897 return 0;
1898
1899 ocfs2_xa_fill_value_buf(loc, &vb);
1900 return le32_to_cpu(vb.vb_xv->xr_clusters);
1901 }
1902
1903 static int ocfs2_xa_value_truncate(struct ocfs2_xa_loc *loc, u64 bytes,
1904 struct ocfs2_xattr_set_ctxt *ctxt)
1905 {
1906 int trunc_rc, access_rc;
1907 struct ocfs2_xattr_value_buf vb;
1908
1909 ocfs2_xa_fill_value_buf(loc, &vb);
1910 trunc_rc = ocfs2_xattr_value_truncate(loc->xl_inode, &vb, bytes,
1911 ctxt);
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923 access_rc = ocfs2_xa_journal_access(ctxt->handle, loc,
1924 OCFS2_JOURNAL_ACCESS_WRITE);
1925
1926
1927 return trunc_rc ? trunc_rc : access_rc;
1928 }
1929
1930 static void ocfs2_xa_remove_entry(struct ocfs2_xa_loc *loc)
1931 {
1932 int index, count;
1933 struct ocfs2_xattr_header *xh = loc->xl_header;
1934 struct ocfs2_xattr_entry *entry = loc->xl_entry;
1935
1936 ocfs2_xa_wipe_namevalue(loc);
1937 loc->xl_entry = NULL;
1938
1939 le16_add_cpu(&xh->xh_count, -1);
1940 count = le16_to_cpu(xh->xh_count);
1941
1942
1943
1944
1945
1946
1947 if (count) {
1948 index = ((char *)entry - (char *)&xh->xh_entries) /
1949 sizeof(struct ocfs2_xattr_entry);
1950 memmove(&xh->xh_entries[index], &xh->xh_entries[index + 1],
1951 (count - index) * sizeof(struct ocfs2_xattr_entry));
1952 memset(&xh->xh_entries[count], 0,
1953 sizeof(struct ocfs2_xattr_entry));
1954 }
1955 }
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981 static void ocfs2_xa_cleanup_value_truncate(struct ocfs2_xa_loc *loc,
1982 const char *what,
1983 unsigned int orig_clusters)
1984 {
1985 unsigned int new_clusters = ocfs2_xa_value_clusters(loc);
1986 char *nameval_buf = ocfs2_xa_offset_pointer(loc,
1987 le16_to_cpu(loc->xl_entry->xe_name_offset));
1988
1989 if (new_clusters < orig_clusters) {
1990 mlog(ML_ERROR,
1991 "Partial truncate while %s xattr %.*s. Leaking "
1992 "%u clusters and removing the entry\n",
1993 what, loc->xl_entry->xe_name_len, nameval_buf,
1994 orig_clusters - new_clusters);
1995 ocfs2_xa_remove_entry(loc);
1996 } else if (!orig_clusters) {
1997 mlog(ML_ERROR,
1998 "Unable to allocate an external value for xattr "
1999 "%.*s safely. Leaking %u clusters and removing the "
2000 "entry\n",
2001 loc->xl_entry->xe_name_len, nameval_buf,
2002 new_clusters - orig_clusters);
2003 ocfs2_xa_remove_entry(loc);
2004 } else if (new_clusters > orig_clusters)
2005 mlog(ML_ERROR,
2006 "Unable to grow xattr %.*s safely. %u new clusters "
2007 "have been added, but the value will not be "
2008 "modified\n",
2009 loc->xl_entry->xe_name_len, nameval_buf,
2010 new_clusters - orig_clusters);
2011 }
2012
2013 static int ocfs2_xa_remove(struct ocfs2_xa_loc *loc,
2014 struct ocfs2_xattr_set_ctxt *ctxt)
2015 {
2016 int rc = 0;
2017 unsigned int orig_clusters;
2018
2019 if (!ocfs2_xattr_is_local(loc->xl_entry)) {
2020 orig_clusters = ocfs2_xa_value_clusters(loc);
2021 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2022 if (rc) {
2023 mlog_errno(rc);
2024
2025
2026
2027
2028
2029
2030 if (orig_clusters != ocfs2_xa_value_clusters(loc))
2031 rc = 0;
2032 ocfs2_xa_cleanup_value_truncate(loc, "removing",
2033 orig_clusters);
2034 if (rc)
2035 goto out;
2036 }
2037 }
2038
2039 ocfs2_xa_remove_entry(loc);
2040
2041 out:
2042 return rc;
2043 }
2044
2045 static void ocfs2_xa_install_value_root(struct ocfs2_xa_loc *loc)
2046 {
2047 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len);
2048 char *nameval_buf;
2049
2050 nameval_buf = ocfs2_xa_offset_pointer(loc,
2051 le16_to_cpu(loc->xl_entry->xe_name_offset));
2052 memcpy(nameval_buf + name_size, &def_xv, OCFS2_XATTR_ROOT_SIZE);
2053 }
2054
2055
2056
2057
2058
2059
2060 static int ocfs2_xa_reuse_entry(struct ocfs2_xa_loc *loc,
2061 struct ocfs2_xattr_info *xi,
2062 struct ocfs2_xattr_set_ctxt *ctxt)
2063 {
2064 int rc = 0;
2065 int name_size = OCFS2_XATTR_SIZE(xi->xi_name_len);
2066 unsigned int orig_clusters;
2067 char *nameval_buf;
2068 int xe_local = ocfs2_xattr_is_local(loc->xl_entry);
2069 int xi_local = xi->xi_value_len <= OCFS2_XATTR_INLINE_SIZE;
2070
2071 BUG_ON(OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len) !=
2072 name_size);
2073
2074 nameval_buf = ocfs2_xa_offset_pointer(loc,
2075 le16_to_cpu(loc->xl_entry->xe_name_offset));
2076 if (xe_local) {
2077 memset(nameval_buf + name_size, 0,
2078 namevalue_size_xe(loc->xl_entry) - name_size);
2079 if (!xi_local)
2080 ocfs2_xa_install_value_root(loc);
2081 } else {
2082 orig_clusters = ocfs2_xa_value_clusters(loc);
2083 if (xi_local) {
2084 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2085 if (rc < 0)
2086 mlog_errno(rc);
2087 else
2088 memset(nameval_buf + name_size, 0,
2089 namevalue_size_xe(loc->xl_entry) -
2090 name_size);
2091 } else if (le64_to_cpu(loc->xl_entry->xe_value_size) >
2092 xi->xi_value_len) {
2093 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len,
2094 ctxt);
2095 if (rc < 0)
2096 mlog_errno(rc);
2097 }
2098
2099 if (rc) {
2100 ocfs2_xa_cleanup_value_truncate(loc, "reusing",
2101 orig_clusters);
2102 goto out;
2103 }
2104 }
2105
2106 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len);
2107 ocfs2_xattr_set_local(loc->xl_entry, xi_local);
2108
2109 out:
2110 return rc;
2111 }
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121 static int ocfs2_xa_prepare_entry(struct ocfs2_xa_loc *loc,
2122 struct ocfs2_xattr_info *xi,
2123 u32 name_hash,
2124 struct ocfs2_xattr_set_ctxt *ctxt)
2125 {
2126 int rc = 0;
2127 unsigned int orig_clusters;
2128 __le64 orig_value_size = 0;
2129
2130 rc = ocfs2_xa_check_space(loc, xi);
2131 if (rc)
2132 goto out;
2133
2134 if (loc->xl_entry) {
2135 if (ocfs2_xa_can_reuse_entry(loc, xi)) {
2136 orig_value_size = loc->xl_entry->xe_value_size;
2137 rc = ocfs2_xa_reuse_entry(loc, xi, ctxt);
2138 if (rc)
2139 goto out;
2140 goto alloc_value;
2141 }
2142
2143 if (!ocfs2_xattr_is_local(loc->xl_entry)) {
2144 orig_clusters = ocfs2_xa_value_clusters(loc);
2145 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2146 if (rc) {
2147 mlog_errno(rc);
2148 ocfs2_xa_cleanup_value_truncate(loc,
2149 "overwriting",
2150 orig_clusters);
2151 goto out;
2152 }
2153 }
2154 ocfs2_xa_wipe_namevalue(loc);
2155 } else
2156 ocfs2_xa_add_entry(loc, name_hash);
2157
2158
2159
2160
2161
2162 ocfs2_xa_add_namevalue(loc, xi);
2163 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE)
2164 ocfs2_xa_install_value_root(loc);
2165
2166 alloc_value:
2167 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) {
2168 orig_clusters = ocfs2_xa_value_clusters(loc);
2169 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, ctxt);
2170 if (rc < 0) {
2171 ctxt->set_abort = 1;
2172 ocfs2_xa_cleanup_value_truncate(loc, "growing",
2173 orig_clusters);
2174
2175
2176
2177
2178
2179
2180 if (loc->xl_entry) {
2181 BUG_ON(!orig_value_size);
2182 loc->xl_entry->xe_value_size = orig_value_size;
2183 }
2184 mlog_errno(rc);
2185 }
2186 }
2187
2188 out:
2189 return rc;
2190 }
2191
2192
2193
2194
2195
2196
2197 static int ocfs2_xa_store_value(struct ocfs2_xa_loc *loc,
2198 struct ocfs2_xattr_info *xi,
2199 struct ocfs2_xattr_set_ctxt *ctxt)
2200 {
2201 int rc = 0;
2202 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
2203 int name_size = OCFS2_XATTR_SIZE(xi->xi_name_len);
2204 char *nameval_buf;
2205 struct ocfs2_xattr_value_buf vb;
2206
2207 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset);
2208 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) {
2209 ocfs2_xa_fill_value_buf(loc, &vb);
2210 rc = __ocfs2_xattr_set_value_outside(loc->xl_inode,
2211 ctxt->handle, &vb,
2212 xi->xi_value,
2213 xi->xi_value_len);
2214 } else
2215 memcpy(nameval_buf + name_size, xi->xi_value, xi->xi_value_len);
2216
2217 return rc;
2218 }
2219
2220 static int ocfs2_xa_set(struct ocfs2_xa_loc *loc,
2221 struct ocfs2_xattr_info *xi,
2222 struct ocfs2_xattr_set_ctxt *ctxt)
2223 {
2224 int ret;
2225 u32 name_hash = ocfs2_xattr_name_hash(loc->xl_inode, xi->xi_name,
2226 xi->xi_name_len);
2227
2228 ret = ocfs2_xa_journal_access(ctxt->handle, loc,
2229 OCFS2_JOURNAL_ACCESS_WRITE);
2230 if (ret) {
2231 mlog_errno(ret);
2232 goto out;
2233 }
2234
2235
2236
2237
2238
2239
2240
2241
2242 if (!xi->xi_value) {
2243 ret = ocfs2_xa_remove(loc, ctxt);
2244 goto out_dirty;
2245 }
2246
2247 ret = ocfs2_xa_prepare_entry(loc, xi, name_hash, ctxt);
2248 if (ret) {
2249 if (ret != -ENOSPC)
2250 mlog_errno(ret);
2251 goto out_dirty;
2252 }
2253
2254 ret = ocfs2_xa_store_value(loc, xi, ctxt);
2255 if (ret)
2256 mlog_errno(ret);
2257
2258 out_dirty:
2259 ocfs2_xa_journal_dirty(ctxt->handle, loc);
2260
2261 out:
2262 return ret;
2263 }
2264
2265 static void ocfs2_init_dinode_xa_loc(struct ocfs2_xa_loc *loc,
2266 struct inode *inode,
2267 struct buffer_head *bh,
2268 struct ocfs2_xattr_entry *entry)
2269 {
2270 struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data;
2271
2272 BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_XATTR_FL));
2273
2274 loc->xl_inode = inode;
2275 loc->xl_ops = &ocfs2_xa_block_loc_ops;
2276 loc->xl_storage = bh;
2277 loc->xl_entry = entry;
2278 loc->xl_size = le16_to_cpu(di->i_xattr_inline_size);
2279 loc->xl_header =
2280 (struct ocfs2_xattr_header *)(bh->b_data + bh->b_size -
2281 loc->xl_size);
2282 }
2283
2284 static void ocfs2_init_xattr_block_xa_loc(struct ocfs2_xa_loc *loc,
2285 struct inode *inode,
2286 struct buffer_head *bh,
2287 struct ocfs2_xattr_entry *entry)
2288 {
2289 struct ocfs2_xattr_block *xb =
2290 (struct ocfs2_xattr_block *)bh->b_data;
2291
2292 BUG_ON(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED);
2293
2294 loc->xl_inode = inode;
2295 loc->xl_ops = &ocfs2_xa_block_loc_ops;
2296 loc->xl_storage = bh;
2297 loc->xl_header = &(xb->xb_attrs.xb_header);
2298 loc->xl_entry = entry;
2299 loc->xl_size = bh->b_size - offsetof(struct ocfs2_xattr_block,
2300 xb_attrs.xb_header);
2301 }
2302
2303 static void ocfs2_init_xattr_bucket_xa_loc(struct ocfs2_xa_loc *loc,
2304 struct ocfs2_xattr_bucket *bucket,
2305 struct ocfs2_xattr_entry *entry)
2306 {
2307 loc->xl_inode = bucket->bu_inode;
2308 loc->xl_ops = &ocfs2_xa_bucket_loc_ops;
2309 loc->xl_storage = bucket;
2310 loc->xl_header = bucket_xh(bucket);
2311 loc->xl_entry = entry;
2312 loc->xl_size = OCFS2_XATTR_BUCKET_SIZE;
2313 }
2314
2315
2316
2317
2318
2319 static int ocfs2_lock_xattr_remove_allocators(struct inode *inode,
2320 struct ocfs2_xattr_value_root *xv,
2321 struct ocfs2_caching_info *ref_ci,
2322 struct buffer_head *ref_root_bh,
2323 struct ocfs2_alloc_context **meta_ac,
2324 int *ref_credits)
2325 {
2326 int ret, meta_add = 0;
2327 u32 p_cluster, num_clusters;
2328 unsigned int ext_flags;
2329
2330 *ref_credits = 0;
2331 ret = ocfs2_xattr_get_clusters(inode, 0, &p_cluster,
2332 &num_clusters,
2333 &xv->xr_list,
2334 &ext_flags);
2335 if (ret) {
2336 mlog_errno(ret);
2337 goto out;
2338 }
2339
2340 if (!(ext_flags & OCFS2_EXT_REFCOUNTED))
2341 goto out;
2342
2343 ret = ocfs2_refcounted_xattr_delete_need(inode, ref_ci,
2344 ref_root_bh, xv,
2345 &meta_add, ref_credits);
2346 if (ret) {
2347 mlog_errno(ret);
2348 goto out;
2349 }
2350
2351 ret = ocfs2_reserve_new_metadata_blocks(OCFS2_SB(inode->i_sb),
2352 meta_add, meta_ac);
2353 if (ret)
2354 mlog_errno(ret);
2355
2356 out:
2357 return ret;
2358 }
2359
2360 static int ocfs2_remove_value_outside(struct inode*inode,
2361 struct ocfs2_xattr_value_buf *vb,
2362 struct ocfs2_xattr_header *header,
2363 struct ocfs2_caching_info *ref_ci,
2364 struct buffer_head *ref_root_bh)
2365 {
2366 int ret = 0, i, ref_credits;
2367 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2368 struct ocfs2_xattr_set_ctxt ctxt = { NULL, NULL, };
2369 void *val;
2370
2371 ocfs2_init_dealloc_ctxt(&ctxt.dealloc);
2372
2373 for (i = 0; i < le16_to_cpu(header->xh_count); i++) {
2374 struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
2375
2376 if (ocfs2_xattr_is_local(entry))
2377 continue;
2378
2379 val = (void *)header +
2380 le16_to_cpu(entry->xe_name_offset);
2381 vb->vb_xv = (struct ocfs2_xattr_value_root *)
2382 (val + OCFS2_XATTR_SIZE(entry->xe_name_len));
2383
2384 ret = ocfs2_lock_xattr_remove_allocators(inode, vb->vb_xv,
2385 ref_ci, ref_root_bh,
2386 &ctxt.meta_ac,
2387 &ref_credits);
2388
2389 ctxt.handle = ocfs2_start_trans(osb, ref_credits +
2390 ocfs2_remove_extent_credits(osb->sb));
2391 if (IS_ERR(ctxt.handle)) {
2392 ret = PTR_ERR(ctxt.handle);
2393 mlog_errno(ret);
2394 break;
2395 }
2396
2397 ret = ocfs2_xattr_value_truncate(inode, vb, 0, &ctxt);
2398
2399 ocfs2_commit_trans(osb, ctxt.handle);
2400 if (ctxt.meta_ac) {
2401 ocfs2_free_alloc_context(ctxt.meta_ac);
2402 ctxt.meta_ac = NULL;
2403 }
2404
2405 if (ret < 0) {
2406 mlog_errno(ret);
2407 break;
2408 }
2409
2410 }
2411
2412 if (ctxt.meta_ac)
2413 ocfs2_free_alloc_context(ctxt.meta_ac);
2414 ocfs2_schedule_truncate_log_flush(osb, 1);
2415 ocfs2_run_deallocs(osb, &ctxt.dealloc);
2416 return ret;
2417 }
2418
2419 static int ocfs2_xattr_ibody_remove(struct inode *inode,
2420 struct buffer_head *di_bh,
2421 struct ocfs2_caching_info *ref_ci,
2422 struct buffer_head *ref_root_bh)
2423 {
2424
2425 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
2426 struct ocfs2_xattr_header *header;
2427 int ret;
2428 struct ocfs2_xattr_value_buf vb = {
2429 .vb_bh = di_bh,
2430 .vb_access = ocfs2_journal_access_di,
2431 };
2432
2433 header = (struct ocfs2_xattr_header *)
2434 ((void *)di + inode->i_sb->s_blocksize -
2435 le16_to_cpu(di->i_xattr_inline_size));
2436
2437 ret = ocfs2_remove_value_outside(inode, &vb, header,
2438 ref_ci, ref_root_bh);
2439
2440 return ret;
2441 }
2442
2443 struct ocfs2_rm_xattr_bucket_para {
2444 struct ocfs2_caching_info *ref_ci;
2445 struct buffer_head *ref_root_bh;
2446 };
2447
2448 static int ocfs2_xattr_block_remove(struct inode *inode,
2449 struct buffer_head *blk_bh,
2450 struct ocfs2_caching_info *ref_ci,
2451 struct buffer_head *ref_root_bh)
2452 {
2453 struct ocfs2_xattr_block *xb;
2454 int ret = 0;
2455 struct ocfs2_xattr_value_buf vb = {
2456 .vb_bh = blk_bh,
2457 .vb_access = ocfs2_journal_access_xb,
2458 };
2459 struct ocfs2_rm_xattr_bucket_para args = {
2460 .ref_ci = ref_ci,
2461 .ref_root_bh = ref_root_bh,
2462 };
2463
2464 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
2465 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
2466 struct ocfs2_xattr_header *header = &(xb->xb_attrs.xb_header);
2467 ret = ocfs2_remove_value_outside(inode, &vb, header,
2468 ref_ci, ref_root_bh);
2469 } else
2470 ret = ocfs2_iterate_xattr_index_block(inode,
2471 blk_bh,
2472 ocfs2_rm_xattr_cluster,
2473 &args);
2474
2475 return ret;
2476 }
2477
2478 static int ocfs2_xattr_free_block(struct inode *inode,
2479 u64 block,
2480 struct ocfs2_caching_info *ref_ci,
2481 struct buffer_head *ref_root_bh)
2482 {
2483 struct inode *xb_alloc_inode;
2484 struct buffer_head *xb_alloc_bh = NULL;
2485 struct buffer_head *blk_bh = NULL;
2486 struct ocfs2_xattr_block *xb;
2487 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2488 handle_t *handle;
2489 int ret = 0;
2490 u64 blk, bg_blkno;
2491 u16 bit;
2492
2493 ret = ocfs2_read_xattr_block(inode, block, &blk_bh);
2494 if (ret < 0) {
2495 mlog_errno(ret);
2496 goto out;
2497 }
2498
2499 ret = ocfs2_xattr_block_remove(inode, blk_bh, ref_ci, ref_root_bh);
2500 if (ret < 0) {
2501 mlog_errno(ret);
2502 goto out;
2503 }
2504
2505 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
2506 blk = le64_to_cpu(xb->xb_blkno);
2507 bit = le16_to_cpu(xb->xb_suballoc_bit);
2508 if (xb->xb_suballoc_loc)
2509 bg_blkno = le64_to_cpu(xb->xb_suballoc_loc);
2510 else
2511 bg_blkno = ocfs2_which_suballoc_group(blk, bit);
2512
2513 xb_alloc_inode = ocfs2_get_system_file_inode(osb,
2514 EXTENT_ALLOC_SYSTEM_INODE,
2515 le16_to_cpu(xb->xb_suballoc_slot));
2516 if (!xb_alloc_inode) {
2517 ret = -ENOMEM;
2518 mlog_errno(ret);
2519 goto out;
2520 }
2521 inode_lock(xb_alloc_inode);
2522
2523 ret = ocfs2_inode_lock(xb_alloc_inode, &xb_alloc_bh, 1);
2524 if (ret < 0) {
2525 mlog_errno(ret);
2526 goto out_mutex;
2527 }
2528
2529 handle = ocfs2_start_trans(osb, OCFS2_SUBALLOC_FREE);
2530 if (IS_ERR(handle)) {
2531 ret = PTR_ERR(handle);
2532 mlog_errno(ret);
2533 goto out_unlock;
2534 }
2535
2536 ret = ocfs2_free_suballoc_bits(handle, xb_alloc_inode, xb_alloc_bh,
2537 bit, bg_blkno, 1);
2538 if (ret < 0)
2539 mlog_errno(ret);
2540
2541 ocfs2_commit_trans(osb, handle);
2542 out_unlock:
2543 ocfs2_inode_unlock(xb_alloc_inode, 1);
2544 brelse(xb_alloc_bh);
2545 out_mutex:
2546 inode_unlock(xb_alloc_inode);
2547 iput(xb_alloc_inode);
2548 out:
2549 brelse(blk_bh);
2550 return ret;
2551 }
2552
2553
2554
2555
2556
2557
2558 int ocfs2_xattr_remove(struct inode *inode, struct buffer_head *di_bh)
2559 {
2560 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2561 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
2562 struct ocfs2_refcount_tree *ref_tree = NULL;
2563 struct buffer_head *ref_root_bh = NULL;
2564 struct ocfs2_caching_info *ref_ci = NULL;
2565 handle_t *handle;
2566 int ret;
2567
2568 if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
2569 return 0;
2570
2571 if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
2572 return 0;
2573
2574 if (ocfs2_is_refcount_inode(inode)) {
2575 ret = ocfs2_lock_refcount_tree(OCFS2_SB(inode->i_sb),
2576 le64_to_cpu(di->i_refcount_loc),
2577 1, &ref_tree, &ref_root_bh);
2578 if (ret) {
2579 mlog_errno(ret);
2580 goto out;
2581 }
2582 ref_ci = &ref_tree->rf_ci;
2583
2584 }
2585
2586 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) {
2587 ret = ocfs2_xattr_ibody_remove(inode, di_bh,
2588 ref_ci, ref_root_bh);
2589 if (ret < 0) {
2590 mlog_errno(ret);
2591 goto out;
2592 }
2593 }
2594
2595 if (di->i_xattr_loc) {
2596 ret = ocfs2_xattr_free_block(inode,
2597 le64_to_cpu(di->i_xattr_loc),
2598 ref_ci, ref_root_bh);
2599 if (ret < 0) {
2600 mlog_errno(ret);
2601 goto out;
2602 }
2603 }
2604
2605 handle = ocfs2_start_trans((OCFS2_SB(inode->i_sb)),
2606 OCFS2_INODE_UPDATE_CREDITS);
2607 if (IS_ERR(handle)) {
2608 ret = PTR_ERR(handle);
2609 mlog_errno(ret);
2610 goto out;
2611 }
2612 ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh,
2613 OCFS2_JOURNAL_ACCESS_WRITE);
2614 if (ret) {
2615 mlog_errno(ret);
2616 goto out_commit;
2617 }
2618
2619 di->i_xattr_loc = 0;
2620
2621 spin_lock(&oi->ip_lock);
2622 oi->ip_dyn_features &= ~(OCFS2_INLINE_XATTR_FL | OCFS2_HAS_XATTR_FL);
2623 di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features);
2624 spin_unlock(&oi->ip_lock);
2625 ocfs2_update_inode_fsync_trans(handle, inode, 0);
2626
2627 ocfs2_journal_dirty(handle, di_bh);
2628 out_commit:
2629 ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle);
2630 out:
2631 if (ref_tree)
2632 ocfs2_unlock_refcount_tree(OCFS2_SB(inode->i_sb), ref_tree, 1);
2633 brelse(ref_root_bh);
2634 return ret;
2635 }
2636
2637 static int ocfs2_xattr_has_space_inline(struct inode *inode,
2638 struct ocfs2_dinode *di)
2639 {
2640 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2641 unsigned int xattrsize = OCFS2_SB(inode->i_sb)->s_xattr_inline_size;
2642 int free;
2643
2644 if (xattrsize < OCFS2_MIN_XATTR_INLINE_SIZE)
2645 return 0;
2646
2647 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
2648 struct ocfs2_inline_data *idata = &di->id2.i_data;
2649 free = le16_to_cpu(idata->id_count) - le64_to_cpu(di->i_size);
2650 } else if (ocfs2_inode_is_fast_symlink(inode)) {
2651 free = ocfs2_fast_symlink_chars(inode->i_sb) -
2652 le64_to_cpu(di->i_size);
2653 } else {
2654 struct ocfs2_extent_list *el = &di->id2.i_list;
2655 free = (le16_to_cpu(el->l_count) -
2656 le16_to_cpu(el->l_next_free_rec)) *
2657 sizeof(struct ocfs2_extent_rec);
2658 }
2659 if (free >= xattrsize)
2660 return 1;
2661
2662 return 0;
2663 }
2664
2665
2666
2667
2668
2669
2670
2671 static int ocfs2_xattr_ibody_find(struct inode *inode,
2672 int name_index,
2673 const char *name,
2674 struct ocfs2_xattr_search *xs)
2675 {
2676 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2677 struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
2678 int ret;
2679 int has_space = 0;
2680
2681 if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE)
2682 return 0;
2683
2684 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) {
2685 down_read(&oi->ip_alloc_sem);
2686 has_space = ocfs2_xattr_has_space_inline(inode, di);
2687 up_read(&oi->ip_alloc_sem);
2688 if (!has_space)
2689 return 0;
2690 }
2691
2692 xs->xattr_bh = xs->inode_bh;
2693 xs->end = (void *)di + inode->i_sb->s_blocksize;
2694 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)
2695 xs->header = (struct ocfs2_xattr_header *)
2696 (xs->end - le16_to_cpu(di->i_xattr_inline_size));
2697 else
2698 xs->header = (struct ocfs2_xattr_header *)
2699 (xs->end - OCFS2_SB(inode->i_sb)->s_xattr_inline_size);
2700 xs->base = (void *)xs->header;
2701 xs->here = xs->header->xh_entries;
2702
2703
2704 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) {
2705 ret = ocfs2_xattr_find_entry(name_index, name, xs);
2706 if (ret && ret != -ENODATA)
2707 return ret;
2708 xs->not_found = ret;
2709 }
2710
2711 return 0;
2712 }
2713
2714 static int ocfs2_xattr_ibody_init(struct inode *inode,
2715 struct buffer_head *di_bh,
2716 struct ocfs2_xattr_set_ctxt *ctxt)
2717 {
2718 int ret;
2719 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2720 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
2721 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2722 unsigned int xattrsize = osb->s_xattr_inline_size;
2723
2724 if (!ocfs2_xattr_has_space_inline(inode, di)) {
2725 ret = -ENOSPC;
2726 goto out;
2727 }
2728
2729 ret = ocfs2_journal_access_di(ctxt->handle, INODE_CACHE(inode), di_bh,
2730 OCFS2_JOURNAL_ACCESS_WRITE);
2731 if (ret) {
2732 mlog_errno(ret);
2733 goto out;
2734 }
2735
2736
2737
2738
2739
2740 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
2741 struct ocfs2_inline_data *idata = &di->id2.i_data;
2742 le16_add_cpu(&idata->id_count, -xattrsize);
2743 } else if (!(ocfs2_inode_is_fast_symlink(inode))) {
2744 struct ocfs2_extent_list *el = &di->id2.i_list;
2745 le16_add_cpu(&el->l_count, -(xattrsize /
2746 sizeof(struct ocfs2_extent_rec)));
2747 }
2748 di->i_xattr_inline_size = cpu_to_le16(xattrsize);
2749
2750 spin_lock(&oi->ip_lock);
2751 oi->ip_dyn_features |= OCFS2_INLINE_XATTR_FL|OCFS2_HAS_XATTR_FL;
2752 di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features);
2753 spin_unlock(&oi->ip_lock);
2754
2755 ocfs2_journal_dirty(ctxt->handle, di_bh);
2756
2757 out:
2758 return ret;
2759 }
2760
2761
2762
2763
2764
2765
2766
2767 static int ocfs2_xattr_ibody_set(struct inode *inode,
2768 struct ocfs2_xattr_info *xi,
2769 struct ocfs2_xattr_search *xs,
2770 struct ocfs2_xattr_set_ctxt *ctxt)
2771 {
2772 int ret;
2773 struct ocfs2_inode_info *oi = OCFS2_I(inode);
2774 struct ocfs2_xa_loc loc;
2775
2776 if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE)
2777 return -ENOSPC;
2778
2779 down_write(&oi->ip_alloc_sem);
2780 if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) {
2781 ret = ocfs2_xattr_ibody_init(inode, xs->inode_bh, ctxt);
2782 if (ret) {
2783 if (ret != -ENOSPC)
2784 mlog_errno(ret);
2785 goto out;
2786 }
2787 }
2788
2789 ocfs2_init_dinode_xa_loc(&loc, inode, xs->inode_bh,
2790 xs->not_found ? NULL : xs->here);
2791 ret = ocfs2_xa_set(&loc, xi, ctxt);
2792 if (ret) {
2793 if (ret != -ENOSPC)
2794 mlog_errno(ret);
2795 goto out;
2796 }
2797 xs->here = loc.xl_entry;
2798
2799 out:
2800 up_write(&oi->ip_alloc_sem);
2801
2802 return ret;
2803 }
2804
2805
2806
2807
2808
2809
2810
2811 static int ocfs2_xattr_block_find(struct inode *inode,
2812 int name_index,
2813 const char *name,
2814 struct ocfs2_xattr_search *xs)
2815 {
2816 struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
2817 struct buffer_head *blk_bh = NULL;
2818 struct ocfs2_xattr_block *xb;
2819 int ret = 0;
2820
2821 if (!di->i_xattr_loc)
2822 return ret;
2823
2824 ret = ocfs2_read_xattr_block(inode, le64_to_cpu(di->i_xattr_loc),
2825 &blk_bh);
2826 if (ret < 0) {
2827 mlog_errno(ret);
2828 return ret;
2829 }
2830
2831 xs->xattr_bh = blk_bh;
2832 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
2833
2834 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
2835 xs->header = &xb->xb_attrs.xb_header;
2836 xs->base = (void *)xs->header;
2837 xs->end = (void *)(blk_bh->b_data) + blk_bh->b_size;
2838 xs->here = xs->header->xh_entries;
2839
2840 ret = ocfs2_xattr_find_entry(name_index, name, xs);
2841 } else
2842 ret = ocfs2_xattr_index_block_find(inode, blk_bh,
2843 name_index,
2844 name, xs);
2845
2846 if (ret && ret != -ENODATA) {
2847 xs->xattr_bh = NULL;
2848 goto cleanup;
2849 }
2850 xs->not_found = ret;
2851 return 0;
2852 cleanup:
2853 brelse(blk_bh);
2854
2855 return ret;
2856 }
2857
2858 static int ocfs2_create_xattr_block(struct inode *inode,
2859 struct buffer_head *inode_bh,
2860 struct ocfs2_xattr_set_ctxt *ctxt,
2861 int indexed,
2862 struct buffer_head **ret_bh)
2863 {
2864 int ret;
2865 u16 suballoc_bit_start;
2866 u32 num_got;
2867 u64 suballoc_loc, first_blkno;
2868 struct ocfs2_dinode *di = (struct ocfs2_dinode *)inode_bh->b_data;
2869 struct buffer_head *new_bh = NULL;
2870 struct ocfs2_xattr_block *xblk;
2871
2872 ret = ocfs2_journal_access_di(ctxt->handle, INODE_CACHE(inode),
2873 inode_bh, OCFS2_JOURNAL_ACCESS_CREATE);
2874 if (ret < 0) {
2875 mlog_errno(ret);
2876 goto end;
2877 }
2878
2879 ret = ocfs2_claim_metadata(ctxt->handle, ctxt->meta_ac, 1,
2880 &suballoc_loc, &suballoc_bit_start,
2881 &num_got, &first_blkno);
2882 if (ret < 0) {
2883 mlog_errno(ret);
2884 goto end;
2885 }
2886
2887 new_bh = sb_getblk(inode->i_sb, first_blkno);
2888 if (!new_bh) {
2889 ret = -ENOMEM;
2890 mlog_errno(ret);
2891 goto end;
2892 }
2893
2894 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), new_bh);
2895
2896 ret = ocfs2_journal_access_xb(ctxt->handle, INODE_CACHE(inode),
2897 new_bh,
2898 OCFS2_JOURNAL_ACCESS_CREATE);
2899 if (ret < 0) {
2900 mlog_errno(ret);
2901 goto end;
2902 }
2903
2904
2905 xblk = (struct ocfs2_xattr_block *)new_bh->b_data;
2906 memset(xblk, 0, inode->i_sb->s_blocksize);
2907 strcpy((void *)xblk, OCFS2_XATTR_BLOCK_SIGNATURE);
2908 xblk->xb_suballoc_slot = cpu_to_le16(ctxt->meta_ac->ac_alloc_slot);
2909 xblk->xb_suballoc_loc = cpu_to_le64(suballoc_loc);
2910 xblk->xb_suballoc_bit = cpu_to_le16(suballoc_bit_start);
2911 xblk->xb_fs_generation =
2912 cpu_to_le32(OCFS2_SB(inode->i_sb)->fs_generation);
2913 xblk->xb_blkno = cpu_to_le64(first_blkno);
2914 if (indexed) {
2915 struct ocfs2_xattr_tree_root *xr = &xblk->xb_attrs.xb_root;
2916 xr->xt_clusters = cpu_to_le32(1);
2917 xr->xt_last_eb_blk = 0;
2918 xr->xt_list.l_tree_depth = 0;
2919 xr->xt_list.l_count = cpu_to_le16(
2920 ocfs2_xattr_recs_per_xb(inode->i_sb));
2921 xr->xt_list.l_next_free_rec = cpu_to_le16(1);
2922 xblk->xb_flags = cpu_to_le16(OCFS2_XATTR_INDEXED);
2923 }
2924 ocfs2_journal_dirty(ctxt->handle, new_bh);
2925
2926
2927 di->i_xattr_loc = cpu_to_le64(first_blkno);
2928
2929 spin_lock(&OCFS2_I(inode)->ip_lock);
2930 OCFS2_I(inode)->ip_dyn_features |= OCFS2_HAS_XATTR_FL;
2931 di->i_dyn_features = cpu_to_le16(OCFS2_I(inode)->ip_dyn_features);
2932 spin_unlock(&OCFS2_I(inode)->ip_lock);
2933
2934 ocfs2_journal_dirty(ctxt->handle, inode_bh);
2935
2936 *ret_bh = new_bh;
2937 new_bh = NULL;
2938
2939 end:
2940 brelse(new_bh);
2941 return ret;
2942 }
2943
2944
2945
2946
2947
2948
2949
2950 static int ocfs2_xattr_block_set(struct inode *inode,
2951 struct ocfs2_xattr_info *xi,
2952 struct ocfs2_xattr_search *xs,
2953 struct ocfs2_xattr_set_ctxt *ctxt)
2954 {
2955 struct buffer_head *new_bh = NULL;
2956 struct ocfs2_xattr_block *xblk = NULL;
2957 int ret;
2958 struct ocfs2_xa_loc loc;
2959
2960 if (!xs->xattr_bh) {
2961 ret = ocfs2_create_xattr_block(inode, xs->inode_bh, ctxt,
2962 0, &new_bh);
2963 if (ret) {
2964 mlog_errno(ret);
2965 goto end;
2966 }
2967
2968 xs->xattr_bh = new_bh;
2969 xblk = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
2970 xs->header = &xblk->xb_attrs.xb_header;
2971 xs->base = (void *)xs->header;
2972 xs->end = (void *)xblk + inode->i_sb->s_blocksize;
2973 xs->here = xs->header->xh_entries;
2974 } else
2975 xblk = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
2976
2977 if (!(le16_to_cpu(xblk->xb_flags) & OCFS2_XATTR_INDEXED)) {
2978 ocfs2_init_xattr_block_xa_loc(&loc, inode, xs->xattr_bh,
2979 xs->not_found ? NULL : xs->here);
2980
2981 ret = ocfs2_xa_set(&loc, xi, ctxt);
2982 if (!ret)
2983 xs->here = loc.xl_entry;
2984 else if ((ret != -ENOSPC) || ctxt->set_abort)
2985 goto end;
2986 else {
2987 ret = ocfs2_xattr_create_index_block(inode, xs, ctxt);
2988 if (ret)
2989 goto end;
2990 }
2991 }
2992
2993 if (le16_to_cpu(xblk->xb_flags) & OCFS2_XATTR_INDEXED)
2994 ret = ocfs2_xattr_set_entry_index_block(inode, xi, xs, ctxt);
2995
2996 end:
2997 return ret;
2998 }
2999
3000
3001 static int ocfs2_xattr_can_be_in_inode(struct inode *inode,
3002 struct ocfs2_xattr_info *xi,
3003 struct ocfs2_xattr_search *xs)
3004 {
3005 struct ocfs2_xattr_entry *last;
3006 int free, i;
3007 size_t min_offs = xs->end - xs->base;
3008
3009 if (!xs->header)
3010 return 0;
3011
3012 last = xs->header->xh_entries;
3013
3014 for (i = 0; i < le16_to_cpu(xs->header->xh_count); i++) {
3015 size_t offs = le16_to_cpu(last->xe_name_offset);
3016 if (offs < min_offs)
3017 min_offs = offs;
3018 last += 1;
3019 }
3020
3021 free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP;
3022 if (free < 0)
3023 return 0;
3024
3025 BUG_ON(!xs->not_found);
3026
3027 if (free >= (sizeof(struct ocfs2_xattr_entry) + namevalue_size_xi(xi)))
3028 return 1;
3029
3030 return 0;
3031 }
3032
3033 static int ocfs2_calc_xattr_set_need(struct inode *inode,
3034 struct ocfs2_dinode *di,
3035 struct ocfs2_xattr_info *xi,
3036 struct ocfs2_xattr_search *xis,
3037 struct ocfs2_xattr_search *xbs,
3038 int *clusters_need,
3039 int *meta_need,
3040 int *credits_need)
3041 {
3042 int ret = 0, old_in_xb = 0;
3043 int clusters_add = 0, meta_add = 0, credits = 0;
3044 struct buffer_head *bh = NULL;
3045 struct ocfs2_xattr_block *xb = NULL;
3046 struct ocfs2_xattr_entry *xe = NULL;
3047 struct ocfs2_xattr_value_root *xv = NULL;
3048 char *base = NULL;
3049 int name_offset, name_len = 0;
3050 u32 new_clusters = ocfs2_clusters_for_bytes(inode->i_sb,
3051 xi->xi_value_len);
3052 u64 value_size;
3053
3054
3055
3056
3057
3058
3059 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE)
3060 credits += new_clusters *
3061 ocfs2_clusters_to_blocks(inode->i_sb, 1);
3062
3063 if (xis->not_found && xbs->not_found) {
3064 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb);
3065
3066 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) {
3067 clusters_add += new_clusters;
3068 credits += ocfs2_calc_extend_credits(inode->i_sb,
3069 &def_xv.xv.xr_list);
3070 }
3071
3072 goto meta_guess;
3073 }
3074
3075 if (!xis->not_found) {
3076 xe = xis->here;
3077 name_offset = le16_to_cpu(xe->xe_name_offset);
3078 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len);
3079 base = xis->base;
3080 credits += OCFS2_INODE_UPDATE_CREDITS;
3081 } else {
3082 int i, block_off = 0;
3083 xb = (struct ocfs2_xattr_block *)xbs->xattr_bh->b_data;
3084 xe = xbs->here;
3085 name_offset = le16_to_cpu(xe->xe_name_offset);
3086 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len);
3087 i = xbs->here - xbs->header->xh_entries;
3088 old_in_xb = 1;
3089
3090 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) {
3091 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
3092 bucket_xh(xbs->bucket),
3093 i, &block_off,
3094 &name_offset);
3095 base = bucket_block(xbs->bucket, block_off);
3096 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb);
3097 } else {
3098 base = xbs->base;
3099 credits += OCFS2_XATTR_BLOCK_UPDATE_CREDITS;
3100 }
3101 }
3102
3103
3104
3105
3106
3107
3108
3109
3110 if (!xi->xi_value) {
3111 if (!ocfs2_xattr_is_local(xe))
3112 credits += ocfs2_remove_extent_credits(inode->i_sb);
3113
3114 goto out;
3115 }
3116
3117
3118 value_size = le64_to_cpu(xe->xe_value_size);
3119
3120 if (old_in_xb) {
3121
3122
3123
3124
3125
3126
3127 if (ocfs2_xattr_can_be_in_inode(inode, xi, xis)) {
3128 clusters_add += new_clusters;
3129 credits += ocfs2_remove_extent_credits(inode->i_sb) +
3130 OCFS2_INODE_UPDATE_CREDITS;
3131 if (!ocfs2_xattr_is_local(xe))
3132 credits += ocfs2_calc_extend_credits(
3133 inode->i_sb,
3134 &def_xv.xv.xr_list);
3135 goto out;
3136 }
3137 }
3138
3139 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) {
3140
3141 u32 old_clusters = 0;
3142
3143 if (!ocfs2_xattr_is_local(xe)) {
3144 old_clusters = ocfs2_clusters_for_bytes(inode->i_sb,
3145 value_size);
3146 xv = (struct ocfs2_xattr_value_root *)
3147 (base + name_offset + name_len);
3148 value_size = OCFS2_XATTR_ROOT_SIZE;
3149 } else
3150 xv = &def_xv.xv;
3151
3152 if (old_clusters >= new_clusters) {
3153 credits += ocfs2_remove_extent_credits(inode->i_sb);
3154 goto out;
3155 } else {
3156 meta_add += ocfs2_extend_meta_needed(&xv->xr_list);
3157 clusters_add += new_clusters - old_clusters;
3158 credits += ocfs2_calc_extend_credits(inode->i_sb,
3159 &xv->xr_list);
3160 if (value_size >= OCFS2_XATTR_ROOT_SIZE)
3161 goto out;
3162 }
3163 } else {
3164
3165
3166
3167
3168
3169
3170 if ((ocfs2_xattr_is_local(xe) &&
3171 (value_size >= xi->xi_value_len)) ||
3172 (!ocfs2_xattr_is_local(xe) &&
3173 OCFS2_XATTR_ROOT_SIZE >= xi->xi_value_len))
3174 goto out;
3175 }
3176
3177 meta_guess:
3178
3179 if (di->i_xattr_loc) {
3180 if (!xbs->xattr_bh) {
3181 ret = ocfs2_read_xattr_block(inode,
3182 le64_to_cpu(di->i_xattr_loc),
3183 &bh);
3184 if (ret) {
3185 mlog_errno(ret);
3186 goto out;
3187 }
3188
3189 xb = (struct ocfs2_xattr_block *)bh->b_data;
3190 } else
3191 xb = (struct ocfs2_xattr_block *)xbs->xattr_bh->b_data;
3192
3193
3194
3195
3196
3197
3198
3199
3200 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) {
3201 struct ocfs2_extent_list *el =
3202 &xb->xb_attrs.xb_root.xt_list;
3203 meta_add += ocfs2_extend_meta_needed(el);
3204 credits += ocfs2_calc_extend_credits(inode->i_sb,
3205 el);
3206 } else
3207 credits += OCFS2_SUBALLOC_ALLOC + 1;
3208
3209
3210
3211
3212
3213
3214
3215
3216 clusters_add += 1;
3217 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb);
3218 if (OCFS2_XATTR_BUCKET_SIZE ==
3219 OCFS2_SB(inode->i_sb)->s_clustersize) {
3220 credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb);
3221 clusters_add += 1;
3222 }
3223 } else {
3224 credits += OCFS2_XATTR_BLOCK_CREATE_CREDITS;
3225 if (xi->xi_value_len > OCFS2_XATTR_INLINE_SIZE) {
3226 struct ocfs2_extent_list *el = &def_xv.xv.xr_list;
3227 meta_add += ocfs2_extend_meta_needed(el);
3228 credits += ocfs2_calc_extend_credits(inode->i_sb,
3229 el);
3230 } else {
3231 meta_add += 1;
3232 }
3233 }
3234 out:
3235 if (clusters_need)
3236 *clusters_need = clusters_add;
3237 if (meta_need)
3238 *meta_need = meta_add;
3239 if (credits_need)
3240 *credits_need = credits;
3241 brelse(bh);
3242 return ret;
3243 }
3244
3245 static int ocfs2_init_xattr_set_ctxt(struct inode *inode,
3246 struct ocfs2_dinode *di,
3247 struct ocfs2_xattr_info *xi,
3248 struct ocfs2_xattr_search *xis,
3249 struct ocfs2_xattr_search *xbs,
3250 struct ocfs2_xattr_set_ctxt *ctxt,
3251 int extra_meta,
3252 int *credits)
3253 {
3254 int clusters_add, meta_add, ret;
3255 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
3256
3257 memset(ctxt, 0, sizeof(struct ocfs2_xattr_set_ctxt));
3258
3259 ocfs2_init_dealloc_ctxt(&ctxt->dealloc);
3260
3261 ret = ocfs2_calc_xattr_set_need(inode, di, xi, xis, xbs,
3262 &clusters_add, &meta_add, credits);
3263 if (ret) {
3264 mlog_errno(ret);
3265 return ret;
3266 }
3267
3268 meta_add += extra_meta;
3269 trace_ocfs2_init_xattr_set_ctxt(xi->xi_name, meta_add,
3270 clusters_add, *credits);
3271
3272 if (meta_add) {
3273 ret = ocfs2_reserve_new_metadata_blocks(osb, meta_add,
3274 &ctxt->meta_ac);
3275 if (ret) {
3276 mlog_errno(ret);
3277 goto out;
3278 }
3279 }
3280
3281 if (clusters_add) {
3282 ret = ocfs2_reserve_clusters(osb, clusters_add, &ctxt->data_ac);
3283 if (ret)
3284 mlog_errno(ret);
3285 }
3286 out:
3287 if (ret) {
3288 if (ctxt->meta_ac) {
3289 ocfs2_free_alloc_context(ctxt->meta_ac);
3290 ctxt->meta_ac = NULL;
3291 }
3292
3293
3294
3295
3296 }
3297
3298 return ret;
3299 }
3300
3301 static int __ocfs2_xattr_set_handle(struct inode *inode,
3302 struct ocfs2_dinode *di,
3303 struct ocfs2_xattr_info *xi,
3304 struct ocfs2_xattr_search *xis,
3305 struct ocfs2_xattr_search *xbs,
3306 struct ocfs2_xattr_set_ctxt *ctxt)
3307 {
3308 int ret = 0, credits, old_found;
3309
3310 if (!xi->xi_value) {
3311
3312 if (!xis->not_found)
3313 ret = ocfs2_xattr_ibody_set(inode, xi, xis, ctxt);
3314 else if (!xbs->not_found)
3315 ret = ocfs2_xattr_block_set(inode, xi, xbs, ctxt);
3316 } else {
3317
3318 ret = ocfs2_xattr_ibody_set(inode, xi, xis, ctxt);
3319 if (!ret && !xbs->not_found) {
3320
3321
3322
3323
3324 xi->xi_value = NULL;
3325 xi->xi_value_len = 0;
3326
3327 old_found = xis->not_found;
3328 xis->not_found = -ENODATA;
3329 ret = ocfs2_calc_xattr_set_need(inode,
3330 di,
3331 xi,
3332 xis,
3333 xbs,
3334 NULL,
3335 NULL,
3336 &credits);
3337 xis->not_found = old_found;
3338 if (ret) {
3339 mlog_errno(ret);
3340 goto out;
3341 }
3342
3343 ret = ocfs2_extend_trans(ctxt->handle, credits);
3344 if (ret) {
3345 mlog_errno(ret);
3346 goto out;
3347 }
3348 ret = ocfs2_xattr_block_set(inode, xi, xbs, ctxt);
3349 } else if ((ret == -ENOSPC) && !ctxt->set_abort) {
3350 if (di->i_xattr_loc && !xbs->xattr_bh) {
3351 ret = ocfs2_xattr_block_find(inode,
3352 xi->xi_name_index,
3353 xi->xi_name, xbs);
3354 if (ret)
3355 goto out;
3356
3357 old_found = xis->not_found;
3358 xis->not_found = -ENODATA;
3359 ret = ocfs2_calc_xattr_set_need(inode,
3360 di,
3361 xi,
3362 xis,
3363 xbs,
3364 NULL,
3365 NULL,
3366 &credits);
3367 xis->not_found = old_found;
3368 if (ret) {
3369 mlog_errno(ret);
3370 goto out;
3371 }
3372
3373 ret = ocfs2_extend_trans(ctxt->handle, credits);
3374 if (ret) {
3375 mlog_errno(ret);
3376 goto out;
3377 }
3378 }
3379
3380
3381
3382
3383 ret = ocfs2_xattr_block_set(inode, xi, xbs, ctxt);
3384 if (ret)
3385 goto out;
3386 if (!xis->not_found) {
3387
3388
3389
3390
3391 xi->xi_value = NULL;
3392 xi->xi_value_len = 0;
3393 xbs->not_found = -ENODATA;
3394 ret = ocfs2_calc_xattr_set_need(inode,
3395 di,
3396 xi,
3397 xis,
3398 xbs,
3399 NULL,
3400 NULL,
3401 &credits);
3402 if (ret) {
3403 mlog_errno(ret);
3404 goto out;
3405 }
3406
3407 ret = ocfs2_extend_trans(ctxt->handle, credits);
3408 if (ret) {
3409 mlog_errno(ret);
3410 goto out;
3411 }
3412 ret = ocfs2_xattr_ibody_set(inode, xi,
3413 xis, ctxt);
3414 }
3415 }
3416 }
3417
3418 if (!ret) {
3419
3420 ret = ocfs2_journal_access_di(ctxt->handle, INODE_CACHE(inode),
3421 xis->inode_bh,
3422 OCFS2_JOURNAL_ACCESS_WRITE);
3423 if (ret) {
3424 mlog_errno(ret);
3425 goto out;
3426 }
3427
3428 inode->i_ctime = current_time(inode);
3429 di->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
3430 di->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
3431 ocfs2_journal_dirty(ctxt->handle, xis->inode_bh);
3432 }
3433 out:
3434 return ret;
3435 }
3436
3437
3438
3439
3440
3441
3442 int ocfs2_xattr_set_handle(handle_t *handle,
3443 struct inode *inode,
3444 struct buffer_head *di_bh,
3445 int name_index,
3446 const char *name,
3447 const void *value,
3448 size_t value_len,
3449 int flags,
3450 struct ocfs2_alloc_context *meta_ac,
3451 struct ocfs2_alloc_context *data_ac)
3452 {
3453 struct ocfs2_dinode *di;
3454 int ret;
3455
3456 struct ocfs2_xattr_info xi = {
3457 .xi_name_index = name_index,
3458 .xi_name = name,
3459 .xi_name_len = strlen(name),
3460 .xi_value = value,
3461 .xi_value_len = value_len,
3462 };
3463
3464 struct ocfs2_xattr_search xis = {
3465 .not_found = -ENODATA,
3466 };
3467
3468 struct ocfs2_xattr_search xbs = {
3469 .not_found = -ENODATA,
3470 };
3471
3472 struct ocfs2_xattr_set_ctxt ctxt = {
3473 .handle = handle,
3474 .meta_ac = meta_ac,
3475 .data_ac = data_ac,
3476 };
3477
3478 if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
3479 return -EOPNOTSUPP;
3480
3481
3482
3483
3484
3485
3486 if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE) {
3487 xbs.bucket = ocfs2_xattr_bucket_new(inode);
3488 if (!xbs.bucket) {
3489 mlog_errno(-ENOMEM);
3490 return -ENOMEM;
3491 }
3492 }
3493
3494 xis.inode_bh = xbs.inode_bh = di_bh;
3495 di = (struct ocfs2_dinode *)di_bh->b_data;
3496
3497 down_write(&OCFS2_I(inode)->ip_xattr_sem);
3498
3499 ret = ocfs2_xattr_ibody_find(inode, name_index, name, &xis);
3500 if (ret)
3501 goto cleanup;
3502 if (xis.not_found) {
3503 ret = ocfs2_xattr_block_find(inode, name_index, name, &xbs);
3504 if (ret)
3505 goto cleanup;
3506 }
3507
3508 ret = __ocfs2_xattr_set_handle(inode, di, &xi, &xis, &xbs, &ctxt);
3509
3510 cleanup:
3511 up_write(&OCFS2_I(inode)->ip_xattr_sem);
3512 brelse(xbs.xattr_bh);
3513 ocfs2_xattr_bucket_free(xbs.bucket);
3514
3515 return ret;
3516 }
3517
3518
3519
3520
3521
3522
3523
3524
3525 int ocfs2_xattr_set(struct inode *inode,
3526 int name_index,
3527 const char *name,
3528 const void *value,
3529 size_t value_len,
3530 int flags)
3531 {
3532 struct buffer_head *di_bh = NULL;
3533 struct ocfs2_dinode *di;
3534 int ret, credits, had_lock, ref_meta = 0, ref_credits = 0;
3535 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
3536 struct inode *tl_inode = osb->osb_tl_inode;
3537 struct ocfs2_xattr_set_ctxt ctxt = { NULL, NULL, NULL, };
3538 struct ocfs2_refcount_tree *ref_tree = NULL;
3539 struct ocfs2_lock_holder oh;
3540
3541 struct ocfs2_xattr_info xi = {
3542 .xi_name_index = name_index,
3543 .xi_name = name,
3544 .xi_name_len = strlen(name),
3545 .xi_value = value,
3546 .xi_value_len = value_len,
3547 };
3548
3549 struct ocfs2_xattr_search xis = {
3550 .not_found = -ENODATA,
3551 };
3552
3553 struct ocfs2_xattr_search xbs = {
3554 .not_found = -ENODATA,
3555 };
3556
3557 if (!ocfs2_supports_xattr(osb))
3558 return -EOPNOTSUPP;
3559
3560
3561
3562
3563
3564 xbs.bucket = ocfs2_xattr_bucket_new(inode);
3565 if (!xbs.bucket) {
3566 mlog_errno(-ENOMEM);
3567 return -ENOMEM;
3568 }
3569
3570 had_lock = ocfs2_inode_lock_tracker(inode, &di_bh, 1, &oh);
3571 if (had_lock < 0) {
3572 ret = had_lock;
3573 mlog_errno(ret);
3574 goto cleanup_nolock;
3575 }
3576 xis.inode_bh = xbs.inode_bh = di_bh;
3577 di = (struct ocfs2_dinode *)di_bh->b_data;
3578
3579 down_write(&OCFS2_I(inode)->ip_xattr_sem);
3580
3581
3582
3583
3584 ret = ocfs2_xattr_ibody_find(inode, name_index, name, &xis);
3585 if (ret)
3586 goto cleanup;
3587 if (xis.not_found) {
3588 ret = ocfs2_xattr_block_find(inode, name_index, name, &xbs);
3589 if (ret)
3590 goto cleanup;
3591 }
3592
3593 if (xis.not_found && xbs.not_found) {
3594 ret = -ENODATA;
3595 if (flags & XATTR_REPLACE)
3596 goto cleanup;
3597 ret = 0;
3598 if (!value)
3599 goto cleanup;
3600 } else {
3601 ret = -EEXIST;
3602 if (flags & XATTR_CREATE)
3603 goto cleanup;
3604 }
3605
3606
3607 if (ocfs2_is_refcount_inode(inode) &&
3608 (!xis.not_found || !xbs.not_found)) {
3609 ret = ocfs2_prepare_refcount_xattr(inode, di, &xi,
3610 &xis, &xbs, &ref_tree,
3611 &ref_meta, &ref_credits);
3612 if (ret) {
3613 mlog_errno(ret);
3614 goto cleanup;
3615 }
3616 }
3617
3618 inode_lock(tl_inode);
3619
3620 if (ocfs2_truncate_log_needs_flush(osb)) {
3621 ret = __ocfs2_flush_truncate_log(osb);
3622 if (ret < 0) {
3623 inode_unlock(tl_inode);
3624 mlog_errno(ret);
3625 goto cleanup;
3626 }
3627 }
3628 inode_unlock(tl_inode);
3629
3630 ret = ocfs2_init_xattr_set_ctxt(inode, di, &xi, &xis,
3631 &xbs, &ctxt, ref_meta, &credits);
3632 if (ret) {
3633 mlog_errno(ret);
3634 goto cleanup;
3635 }
3636
3637
3638 credits += OCFS2_INODE_UPDATE_CREDITS;
3639 ctxt.handle = ocfs2_start_trans(osb, credits + ref_credits);
3640 if (IS_ERR(ctxt.handle)) {
3641 ret = PTR_ERR(ctxt.handle);
3642 mlog_errno(ret);
3643 goto out_free_ac;
3644 }
3645
3646 ret = __ocfs2_xattr_set_handle(inode, di, &xi, &xis, &xbs, &ctxt);
3647 ocfs2_update_inode_fsync_trans(ctxt.handle, inode, 0);
3648
3649 ocfs2_commit_trans(osb, ctxt.handle);
3650
3651 out_free_ac:
3652 if (ctxt.data_ac)
3653 ocfs2_free_alloc_context(ctxt.data_ac);
3654 if (ctxt.meta_ac)
3655 ocfs2_free_alloc_context(ctxt.meta_ac);
3656 if (ocfs2_dealloc_has_cluster(&ctxt.dealloc))
3657 ocfs2_schedule_truncate_log_flush(osb, 1);
3658 ocfs2_run_deallocs(osb, &ctxt.dealloc);
3659
3660 cleanup:
3661 if (ref_tree)
3662 ocfs2_unlock_refcount_tree(osb, ref_tree, 1);
3663 up_write(&OCFS2_I(inode)->ip_xattr_sem);
3664 if (!value && !ret) {
3665 ret = ocfs2_try_remove_refcount_tree(inode, di_bh);
3666 if (ret)
3667 mlog_errno(ret);
3668 }
3669 ocfs2_inode_unlock_tracker(inode, 1, &oh, had_lock);
3670 cleanup_nolock:
3671 brelse(di_bh);
3672 brelse(xbs.xattr_bh);
3673 ocfs2_xattr_bucket_free(xbs.bucket);
3674
3675 return ret;
3676 }
3677
3678
3679
3680
3681
3682
3683 static int ocfs2_xattr_get_rec(struct inode *inode,
3684 u32 name_hash,
3685 u64 *p_blkno,
3686 u32 *e_cpos,
3687 u32 *num_clusters,
3688 struct ocfs2_extent_list *el)
3689 {
3690 int ret = 0, i;
3691 struct buffer_head *eb_bh = NULL;
3692 struct ocfs2_extent_block *eb;
3693 struct ocfs2_extent_rec *rec = NULL;
3694 u64 e_blkno = 0;
3695
3696 if (el->l_tree_depth) {
3697 ret = ocfs2_find_leaf(INODE_CACHE(inode), el, name_hash,
3698 &eb_bh);
3699 if (ret) {
3700 mlog_errno(ret);
3701 goto out;
3702 }
3703
3704 eb = (struct ocfs2_extent_block *) eb_bh->b_data;
3705 el = &eb->h_list;
3706
3707 if (el->l_tree_depth) {
3708 ret = ocfs2_error(inode->i_sb,
3709 "Inode %lu has non zero tree depth in xattr tree block %llu\n",
3710 inode->i_ino,
3711 (unsigned long long)eb_bh->b_blocknr);
3712 goto out;
3713 }
3714 }
3715
3716 for (i = le16_to_cpu(el->l_next_free_rec) - 1; i >= 0; i--) {
3717 rec = &el->l_recs[i];
3718
3719 if (le32_to_cpu(rec->e_cpos) <= name_hash) {
3720 e_blkno = le64_to_cpu(rec->e_blkno);
3721 break;
3722 }
3723 }
3724
3725 if (!e_blkno) {
3726 ret = ocfs2_error(inode->i_sb, "Inode %lu has bad extent record (%u, %u, 0) in xattr\n",
3727 inode->i_ino,
3728 le32_to_cpu(rec->e_cpos),
3729 ocfs2_rec_clusters(el, rec));
3730 goto out;
3731 }
3732
3733 *p_blkno = le64_to_cpu(rec->e_blkno);
3734 *num_clusters = le16_to_cpu(rec->e_leaf_clusters);
3735 if (e_cpos)
3736 *e_cpos = le32_to_cpu(rec->e_cpos);
3737 out:
3738 brelse(eb_bh);
3739 return ret;
3740 }
3741
3742 typedef int (xattr_bucket_func)(struct inode *inode,
3743 struct ocfs2_xattr_bucket *bucket,
3744 void *para);
3745
3746 static int ocfs2_find_xe_in_bucket(struct inode *inode,
3747 struct ocfs2_xattr_bucket *bucket,
3748 int name_index,
3749 const char *name,
3750 u32 name_hash,
3751 u16 *xe_index,
3752 int *found)
3753 {
3754 int i, ret = 0, cmp = 1, block_off, new_offset;
3755 struct ocfs2_xattr_header *xh = bucket_xh(bucket);
3756 size_t name_len = strlen(name);
3757 struct ocfs2_xattr_entry *xe = NULL;
3758 char *xe_name;
3759
3760
3761
3762
3763
3764 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) {
3765 xe = &xh->xh_entries[i];
3766
3767 if (name_hash > le32_to_cpu(xe->xe_name_hash))
3768 continue;
3769 else if (name_hash < le32_to_cpu(xe->xe_name_hash))
3770 break;
3771
3772 cmp = name_index - ocfs2_xattr_get_type(xe);
3773 if (!cmp)
3774 cmp = name_len - xe->xe_name_len;
3775 if (cmp)
3776 continue;
3777
3778 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
3779 xh,
3780 i,
3781 &block_off,
3782 &new_offset);
3783 if (ret) {
3784 mlog_errno(ret);
3785 break;
3786 }
3787
3788
3789 xe_name = bucket_block(bucket, block_off) + new_offset;
3790 if (!memcmp(name, xe_name, name_len)) {
3791 *xe_index = i;
3792 *found = 1;
3793 ret = 0;
3794 break;
3795 }
3796 }
3797
3798 return ret;
3799 }
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810 static int ocfs2_xattr_bucket_find(struct inode *inode,
3811 int name_index,
3812 const char *name,
3813 u32 name_hash,
3814 u64 p_blkno,
3815 u32 first_hash,
3816 u32 num_clusters,
3817 struct ocfs2_xattr_search *xs)
3818 {
3819 int ret, found = 0;
3820 struct ocfs2_xattr_header *xh = NULL;
3821 struct ocfs2_xattr_entry *xe = NULL;
3822 u16 index = 0;
3823 u16 blk_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
3824 int low_bucket = 0, bucket, high_bucket;
3825 struct ocfs2_xattr_bucket *search;
3826 u64 blkno, lower_blkno = 0;
3827
3828 search = ocfs2_xattr_bucket_new(inode);
3829 if (!search) {
3830 ret = -ENOMEM;
3831 mlog_errno(ret);
3832 goto out;
3833 }
3834
3835 ret = ocfs2_read_xattr_bucket(search, p_blkno);
3836 if (ret) {
3837 mlog_errno(ret);
3838 goto out;
3839 }
3840
3841 xh = bucket_xh(search);
3842 high_bucket = le16_to_cpu(xh->xh_num_buckets) - 1;
3843 while (low_bucket <= high_bucket) {
3844 ocfs2_xattr_bucket_relse(search);
3845
3846 bucket = (low_bucket + high_bucket) / 2;
3847 blkno = p_blkno + bucket * blk_per_bucket;
3848 ret = ocfs2_read_xattr_bucket(search, blkno);
3849 if (ret) {
3850 mlog_errno(ret);
3851 goto out;
3852 }
3853
3854 xh = bucket_xh(search);
3855 xe = &xh->xh_entries[0];
3856 if (name_hash < le32_to_cpu(xe->xe_name_hash)) {
3857 high_bucket = bucket - 1;
3858 continue;
3859 }
3860
3861
3862
3863
3864
3865
3866 if (xh->xh_count)
3867 xe = &xh->xh_entries[le16_to_cpu(xh->xh_count) - 1];
3868
3869
3870 lower_blkno = blkno;
3871
3872 if (name_hash > le32_to_cpu(xe->xe_name_hash)) {
3873 low_bucket = bucket + 1;
3874 continue;
3875 }
3876
3877
3878 ret = ocfs2_find_xe_in_bucket(inode, search,
3879 name_index, name, name_hash,
3880 &index, &found);
3881 if (ret) {
3882 mlog_errno(ret);
3883 goto out;
3884 }
3885 break;
3886 }
3887
3888
3889
3890
3891
3892
3893 if (!lower_blkno)
3894 lower_blkno = p_blkno;
3895
3896
3897 ret = ocfs2_read_xattr_bucket(xs->bucket, lower_blkno);
3898 if (ret) {
3899 mlog_errno(ret);
3900 goto out;
3901 }
3902
3903 xs->header = bucket_xh(xs->bucket);
3904 xs->base = bucket_block(xs->bucket, 0);
3905 xs->end = xs->base + inode->i_sb->s_blocksize;
3906
3907 if (found) {
3908 xs->here = &xs->header->xh_entries[index];
3909 trace_ocfs2_xattr_bucket_find(OCFS2_I(inode)->ip_blkno,
3910 name, name_index, name_hash,
3911 (unsigned long long)bucket_blkno(xs->bucket),
3912 index);
3913 } else
3914 ret = -ENODATA;
3915
3916 out:
3917 ocfs2_xattr_bucket_free(search);
3918 return ret;
3919 }
3920
3921 static int ocfs2_xattr_index_block_find(struct inode *inode,
3922 struct buffer_head *root_bh,
3923 int name_index,
3924 const char *name,
3925 struct ocfs2_xattr_search *xs)
3926 {
3927 int ret;
3928 struct ocfs2_xattr_block *xb =
3929 (struct ocfs2_xattr_block *)root_bh->b_data;
3930 struct ocfs2_xattr_tree_root *xb_root = &xb->xb_attrs.xb_root;
3931 struct ocfs2_extent_list *el = &xb_root->xt_list;
3932 u64 p_blkno = 0;
3933 u32 first_hash, num_clusters = 0;
3934 u32 name_hash = ocfs2_xattr_name_hash(inode, name, strlen(name));
3935
3936 if (le16_to_cpu(el->l_next_free_rec) == 0)
3937 return -ENODATA;
3938
3939 trace_ocfs2_xattr_index_block_find(OCFS2_I(inode)->ip_blkno,
3940 name, name_index, name_hash,
3941 (unsigned long long)root_bh->b_blocknr,
3942 -1);
3943
3944 ret = ocfs2_xattr_get_rec(inode, name_hash, &p_blkno, &first_hash,
3945 &num_clusters, el);
3946 if (ret) {
3947 mlog_errno(ret);
3948 goto out;
3949 }
3950
3951 BUG_ON(p_blkno == 0 || num_clusters == 0 || first_hash > name_hash);
3952
3953 trace_ocfs2_xattr_index_block_find_rec(OCFS2_I(inode)->ip_blkno,
3954 name, name_index, first_hash,
3955 (unsigned long long)p_blkno,
3956 num_clusters);
3957
3958 ret = ocfs2_xattr_bucket_find(inode, name_index, name, name_hash,
3959 p_blkno, first_hash, num_clusters, xs);
3960
3961 out:
3962 return ret;
3963 }
3964
3965 static int ocfs2_iterate_xattr_buckets(struct inode *inode,
3966 u64 blkno,
3967 u32 clusters,
3968 xattr_bucket_func *func,
3969 void *para)
3970 {
3971 int i, ret = 0;
3972 u32 bpc = ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb));
3973 u32 num_buckets = clusters * bpc;
3974 struct ocfs2_xattr_bucket *bucket;
3975
3976 bucket = ocfs2_xattr_bucket_new(inode);
3977 if (!bucket) {
3978 mlog_errno(-ENOMEM);
3979 return -ENOMEM;
3980 }
3981
3982 trace_ocfs2_iterate_xattr_buckets(
3983 (unsigned long long)OCFS2_I(inode)->ip_blkno,
3984 (unsigned long long)blkno, clusters);
3985
3986 for (i = 0; i < num_buckets; i++, blkno += bucket->bu_blocks) {
3987 ret = ocfs2_read_xattr_bucket(bucket, blkno);
3988 if (ret) {
3989 mlog_errno(ret);
3990 break;
3991 }
3992
3993
3994
3995
3996
3997 if (i == 0)
3998 num_buckets = le16_to_cpu(bucket_xh(bucket)->xh_num_buckets);
3999
4000 trace_ocfs2_iterate_xattr_bucket((unsigned long long)blkno,
4001 le32_to_cpu(bucket_xh(bucket)->xh_entries[0].xe_name_hash));
4002 if (func) {
4003 ret = func(inode, bucket, para);
4004 if (ret && ret != -ERANGE)
4005 mlog_errno(ret);
4006
4007 }
4008
4009 ocfs2_xattr_bucket_relse(bucket);
4010 if (ret)
4011 break;
4012 }
4013
4014 ocfs2_xattr_bucket_free(bucket);
4015 return ret;
4016 }
4017
4018 struct ocfs2_xattr_tree_list {
4019 char *buffer;
4020 size_t buffer_size;
4021 size_t result;
4022 };
4023
4024 static int ocfs2_xattr_bucket_get_name_value(struct super_block *sb,
4025 struct ocfs2_xattr_header *xh,
4026 int index,
4027 int *block_off,
4028 int *new_offset)
4029 {
4030 u16 name_offset;
4031
4032 if (index < 0 || index >= le16_to_cpu(xh->xh_count))
4033 return -EINVAL;
4034
4035 name_offset = le16_to_cpu(xh->xh_entries[index].xe_name_offset);
4036
4037 *block_off = name_offset >> sb->s_blocksize_bits;
4038 *new_offset = name_offset % sb->s_blocksize;
4039
4040 return 0;
4041 }
4042
4043 static int ocfs2_list_xattr_bucket(struct inode *inode,
4044 struct ocfs2_xattr_bucket *bucket,
4045 void *para)
4046 {
4047 int ret = 0, type;
4048 struct ocfs2_xattr_tree_list *xl = (struct ocfs2_xattr_tree_list *)para;
4049 int i, block_off, new_offset;
4050 const char *name;
4051
4052 for (i = 0 ; i < le16_to_cpu(bucket_xh(bucket)->xh_count); i++) {
4053 struct ocfs2_xattr_entry *entry = &bucket_xh(bucket)->xh_entries[i];
4054 type = ocfs2_xattr_get_type(entry);
4055
4056 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
4057 bucket_xh(bucket),
4058 i,
4059 &block_off,
4060 &new_offset);
4061 if (ret)
4062 break;
4063
4064 name = (const char *)bucket_block(bucket, block_off) +
4065 new_offset;
4066 ret = ocfs2_xattr_list_entry(inode->i_sb,
4067 xl->buffer,
4068 xl->buffer_size,
4069 &xl->result,
4070 type, name,
4071 entry->xe_name_len);
4072 if (ret)
4073 break;
4074 }
4075
4076 return ret;
4077 }
4078
4079 static int ocfs2_iterate_xattr_index_block(struct inode *inode,
4080 struct buffer_head *blk_bh,
4081 xattr_tree_rec_func *rec_func,
4082 void *para)
4083 {
4084 struct ocfs2_xattr_block *xb =
4085 (struct ocfs2_xattr_block *)blk_bh->b_data;
4086 struct ocfs2_extent_list *el = &xb->xb_attrs.xb_root.xt_list;
4087 int ret = 0;
4088 u32 name_hash = UINT_MAX, e_cpos = 0, num_clusters = 0;
4089 u64 p_blkno = 0;
4090
4091 if (!el->l_next_free_rec || !rec_func)
4092 return 0;
4093
4094 while (name_hash > 0) {
4095 ret = ocfs2_xattr_get_rec(inode, name_hash, &p_blkno,
4096 &e_cpos, &num_clusters, el);
4097 if (ret) {
4098 mlog_errno(ret);
4099 break;
4100 }
4101
4102 ret = rec_func(inode, blk_bh, p_blkno, e_cpos,
4103 num_clusters, para);
4104 if (ret) {
4105 if (ret != -ERANGE)
4106 mlog_errno(ret);
4107 break;
4108 }
4109
4110 if (e_cpos == 0)
4111 break;
4112
4113 name_hash = e_cpos - 1;
4114 }
4115
4116 return ret;
4117
4118 }
4119
4120 static int ocfs2_list_xattr_tree_rec(struct inode *inode,
4121 struct buffer_head *root_bh,
4122 u64 blkno, u32 cpos, u32 len, void *para)
4123 {
4124 return ocfs2_iterate_xattr_buckets(inode, blkno, len,
4125 ocfs2_list_xattr_bucket, para);
4126 }
4127
4128 static int ocfs2_xattr_tree_list_index_block(struct inode *inode,
4129 struct buffer_head *blk_bh,
4130 char *buffer,
4131 size_t buffer_size)
4132 {
4133 int ret;
4134 struct ocfs2_xattr_tree_list xl = {
4135 .buffer = buffer,
4136 .buffer_size = buffer_size,
4137 .result = 0,
4138 };
4139
4140 ret = ocfs2_iterate_xattr_index_block(inode, blk_bh,
4141 ocfs2_list_xattr_tree_rec, &xl);
4142 if (ret) {
4143 mlog_errno(ret);
4144 goto out;
4145 }
4146
4147 ret = xl.result;
4148 out:
4149 return ret;
4150 }
4151
4152 static int cmp_xe(const void *a, const void *b)
4153 {
4154 const struct ocfs2_xattr_entry *l = a, *r = b;
4155 u32 l_hash = le32_to_cpu(l->xe_name_hash);
4156 u32 r_hash = le32_to_cpu(r->xe_name_hash);
4157
4158 if (l_hash > r_hash)
4159 return 1;
4160 if (l_hash < r_hash)
4161 return -1;
4162 return 0;
4163 }
4164
4165 static void swap_xe(void *a, void *b, int size)
4166 {
4167 struct ocfs2_xattr_entry *l = a, *r = b, tmp;
4168
4169 tmp = *l;
4170 memcpy(l, r, sizeof(struct ocfs2_xattr_entry));
4171 memcpy(r, &tmp, sizeof(struct ocfs2_xattr_entry));
4172 }
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182 static void ocfs2_cp_xattr_block_to_bucket(struct inode *inode,
4183 struct buffer_head *xb_bh,
4184 struct ocfs2_xattr_bucket *bucket)
4185 {
4186 int i, blocksize = inode->i_sb->s_blocksize;
4187 int blks = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
4188 u16 offset, size, off_change;
4189 struct ocfs2_xattr_entry *xe;
4190 struct ocfs2_xattr_block *xb =
4191 (struct ocfs2_xattr_block *)xb_bh->b_data;
4192 struct ocfs2_xattr_header *xb_xh = &xb->xb_attrs.xb_header;
4193 struct ocfs2_xattr_header *xh = bucket_xh(bucket);
4194 u16 count = le16_to_cpu(xb_xh->xh_count);
4195 char *src = xb_bh->b_data;
4196 char *target = bucket_block(bucket, blks - 1);
4197
4198 trace_ocfs2_cp_xattr_block_to_bucket_begin(
4199 (unsigned long long)xb_bh->b_blocknr,
4200 (unsigned long long)bucket_blkno(bucket));
4201
4202 for (i = 0; i < blks; i++)
4203 memset(bucket_block(bucket, i), 0, blocksize);
4204
4205
4206
4207
4208
4209
4210 off_change = offsetof(struct ocfs2_xattr_block, xb_attrs.xb_header);
4211 xe = &xb_xh->xh_entries[count - 1];
4212 offset = le16_to_cpu(xe->xe_name_offset) + off_change;
4213 size = blocksize - offset;
4214
4215
4216 memcpy(target + offset, src + offset, size);
4217
4218
4219 xh->xh_count = xb_xh->xh_count;
4220 xh->xh_num_buckets = cpu_to_le16(1);
4221 xh->xh_name_value_len = cpu_to_le16(size);
4222 xh->xh_free_start = cpu_to_le16(OCFS2_XATTR_BUCKET_SIZE - size);
4223
4224
4225 target = bucket_block(bucket, 0);
4226 offset = offsetof(struct ocfs2_xattr_header, xh_entries);
4227 size = count * sizeof(struct ocfs2_xattr_entry);
4228 memcpy(target + offset, (char *)xb_xh + offset, size);
4229
4230
4231 off_change = OCFS2_XATTR_BUCKET_SIZE - blocksize +
4232 offsetof(struct ocfs2_xattr_block, xb_attrs.xb_header);
4233 for (i = 0; i < count; i++)
4234 le16_add_cpu(&xh->xh_entries[i].xe_name_offset, off_change);
4235
4236 trace_ocfs2_cp_xattr_block_to_bucket_end(offset, size, off_change);
4237
4238 sort(target + offset, count, sizeof(struct ocfs2_xattr_entry),
4239 cmp_xe, swap_xe);
4240 }
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250 static void ocfs2_xattr_update_xattr_search(struct inode *inode,
4251 struct ocfs2_xattr_search *xs,
4252 struct buffer_head *old_bh)
4253 {
4254 char *buf = old_bh->b_data;
4255 struct ocfs2_xattr_block *old_xb = (struct ocfs2_xattr_block *)buf;
4256 struct ocfs2_xattr_header *old_xh = &old_xb->xb_attrs.xb_header;
4257 int i;
4258
4259 xs->header = bucket_xh(xs->bucket);
4260 xs->base = bucket_block(xs->bucket, 0);
4261 xs->end = xs->base + inode->i_sb->s_blocksize;
4262
4263 if (xs->not_found)
4264 return;
4265
4266 i = xs->here - old_xh->xh_entries;
4267 xs->here = &xs->header->xh_entries[i];
4268 }
4269
4270 static int ocfs2_xattr_create_index_block(struct inode *inode,
4271 struct ocfs2_xattr_search *xs,
4272 struct ocfs2_xattr_set_ctxt *ctxt)
4273 {
4274 int ret;
4275 u32 bit_off, len;
4276 u64 blkno;
4277 handle_t *handle = ctxt->handle;
4278 struct ocfs2_inode_info *oi = OCFS2_I(inode);
4279 struct buffer_head *xb_bh = xs->xattr_bh;
4280 struct ocfs2_xattr_block *xb =
4281 (struct ocfs2_xattr_block *)xb_bh->b_data;
4282 struct ocfs2_xattr_tree_root *xr;
4283 u16 xb_flags = le16_to_cpu(xb->xb_flags);
4284
4285 trace_ocfs2_xattr_create_index_block_begin(
4286 (unsigned long long)xb_bh->b_blocknr);
4287
4288 BUG_ON(xb_flags & OCFS2_XATTR_INDEXED);
4289 BUG_ON(!xs->bucket);
4290
4291
4292
4293
4294
4295
4296 down_write(&oi->ip_alloc_sem);
4297
4298 ret = ocfs2_journal_access_xb(handle, INODE_CACHE(inode), xb_bh,
4299 OCFS2_JOURNAL_ACCESS_WRITE);
4300 if (ret) {
4301 mlog_errno(ret);
4302 goto out;
4303 }
4304
4305 ret = __ocfs2_claim_clusters(handle, ctxt->data_ac,
4306 1, 1, &bit_off, &len);
4307 if (ret) {
4308 mlog_errno(ret);
4309 goto out;
4310 }
4311
4312
4313
4314
4315
4316
4317 blkno = ocfs2_clusters_to_blocks(inode->i_sb, bit_off);
4318
4319 trace_ocfs2_xattr_create_index_block((unsigned long long)blkno);
4320
4321 ret = ocfs2_init_xattr_bucket(xs->bucket, blkno, 1);
4322 if (ret) {
4323 mlog_errno(ret);
4324 goto out;
4325 }
4326
4327 ret = ocfs2_xattr_bucket_journal_access(handle, xs->bucket,
4328 OCFS2_JOURNAL_ACCESS_CREATE);
4329 if (ret) {
4330 mlog_errno(ret);
4331 goto out;
4332 }
4333
4334 ocfs2_cp_xattr_block_to_bucket(inode, xb_bh, xs->bucket);
4335 ocfs2_xattr_bucket_journal_dirty(handle, xs->bucket);
4336
4337 ocfs2_xattr_update_xattr_search(inode, xs, xb_bh);
4338
4339
4340 memset(&xb->xb_attrs, 0, inode->i_sb->s_blocksize -
4341 offsetof(struct ocfs2_xattr_block, xb_attrs));
4342
4343 xr = &xb->xb_attrs.xb_root;
4344 xr->xt_clusters = cpu_to_le32(1);
4345 xr->xt_last_eb_blk = 0;
4346 xr->xt_list.l_tree_depth = 0;
4347 xr->xt_list.l_count = cpu_to_le16(ocfs2_xattr_recs_per_xb(inode->i_sb));
4348 xr->xt_list.l_next_free_rec = cpu_to_le16(1);
4349
4350 xr->xt_list.l_recs[0].e_cpos = 0;
4351 xr->xt_list.l_recs[0].e_blkno = cpu_to_le64(blkno);
4352 xr->xt_list.l_recs[0].e_leaf_clusters = cpu_to_le16(1);
4353
4354 xb->xb_flags = cpu_to_le16(xb_flags | OCFS2_XATTR_INDEXED);
4355
4356 ocfs2_journal_dirty(handle, xb_bh);
4357
4358 out:
4359 up_write(&oi->ip_alloc_sem);
4360
4361 return ret;
4362 }
4363
4364 static int cmp_xe_offset(const void *a, const void *b)
4365 {
4366 const struct ocfs2_xattr_entry *l = a, *r = b;
4367 u32 l_name_offset = le16_to_cpu(l->xe_name_offset);
4368 u32 r_name_offset = le16_to_cpu(r->xe_name_offset);
4369
4370 if (l_name_offset < r_name_offset)
4371 return 1;
4372 if (l_name_offset > r_name_offset)
4373 return -1;
4374 return 0;
4375 }
4376
4377
4378
4379
4380
4381
4382
4383 static int ocfs2_defrag_xattr_bucket(struct inode *inode,
4384 handle_t *handle,
4385 struct ocfs2_xattr_bucket *bucket)
4386 {
4387 int ret, i;
4388 size_t end, offset, len;
4389 struct ocfs2_xattr_header *xh;
4390 char *entries, *buf, *bucket_buf = NULL;
4391 u64 blkno = bucket_blkno(bucket);
4392 u16 xh_free_start;
4393 size_t blocksize = inode->i_sb->s_blocksize;
4394 struct ocfs2_xattr_entry *xe;
4395
4396
4397
4398
4399
4400
4401
4402 bucket_buf = kmalloc(OCFS2_XATTR_BUCKET_SIZE, GFP_NOFS);
4403 if (!bucket_buf) {
4404 ret = -EIO;
4405 goto out;
4406 }
4407
4408 buf = bucket_buf;
4409 for (i = 0; i < bucket->bu_blocks; i++, buf += blocksize)
4410 memcpy(buf, bucket_block(bucket, i), blocksize);
4411
4412 ret = ocfs2_xattr_bucket_journal_access(handle, bucket,
4413 OCFS2_JOURNAL_ACCESS_WRITE);
4414 if (ret < 0) {
4415 mlog_errno(ret);
4416 goto out;
4417 }
4418
4419 xh = (struct ocfs2_xattr_header *)bucket_buf;
4420 entries = (char *)xh->xh_entries;
4421 xh_free_start = le16_to_cpu(xh->xh_free_start);
4422
4423 trace_ocfs2_defrag_xattr_bucket(
4424 (unsigned long long)blkno, le16_to_cpu(xh->xh_count),
4425 xh_free_start, le16_to_cpu(xh->xh_name_value_len));
4426
4427
4428
4429
4430
4431
4432 sort(entries, le16_to_cpu(xh->xh_count),
4433 sizeof(struct ocfs2_xattr_entry),
4434 cmp_xe_offset, swap_xe);
4435
4436
4437 xe = xh->xh_entries;
4438 end = OCFS2_XATTR_BUCKET_SIZE;
4439 for (i = 0; i < le16_to_cpu(xh->xh_count); i++, xe++) {
4440 offset = le16_to_cpu(xe->xe_name_offset);
4441 len = namevalue_size_xe(xe);
4442
4443
4444
4445
4446
4447
4448 if (((end - len) / blocksize !=
4449 (end - 1) / blocksize))
4450 end = end - end % blocksize;
4451
4452 if (end > offset + len) {
4453 memmove(bucket_buf + end - len,
4454 bucket_buf + offset, len);
4455 xe->xe_name_offset = cpu_to_le16(end - len);
4456 }
4457
4458 mlog_bug_on_msg(end < offset + len, "Defrag check failed for "
4459 "bucket %llu\n", (unsigned long long)blkno);
4460
4461 end -= len;
4462 }
4463
4464 mlog_bug_on_msg(xh_free_start > end, "Defrag check failed for "
4465 "bucket %llu\n", (unsigned long long)blkno);
4466
4467 if (xh_free_start == end)
4468 goto out;
4469
4470 memset(bucket_buf + xh_free_start, 0, end - xh_free_start);
4471 xh->xh_free_start = cpu_to_le16(end);
4472
4473
4474 sort(entries, le16_to_cpu(xh->xh_count),
4475 sizeof(struct ocfs2_xattr_entry),
4476 cmp_xe, swap_xe);
4477
4478 buf = bucket_buf;
4479 for (i = 0; i < bucket->bu_blocks; i++, buf += blocksize)
4480 memcpy(bucket_block(bucket, i), buf, blocksize);
4481 ocfs2_xattr_bucket_journal_dirty(handle, bucket);
4482
4483 out:
4484 kfree(bucket_buf);
4485 return ret;
4486 }
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505 static int ocfs2_mv_xattr_bucket_cross_cluster(struct inode *inode,
4506 handle_t *handle,
4507 struct ocfs2_xattr_bucket *first,
4508 struct ocfs2_xattr_bucket *target,
4509 u64 new_blkno,
4510 u32 num_clusters,
4511 u32 *first_hash)
4512 {
4513 int ret;
4514 struct super_block *sb = inode->i_sb;
4515 int blks_per_bucket = ocfs2_blocks_per_xattr_bucket(sb);
4516 int num_buckets = ocfs2_xattr_buckets_per_cluster(OCFS2_SB(sb));
4517 int to_move = num_buckets / 2;
4518 u64 src_blkno;
4519 u64 last_cluster_blkno = bucket_blkno(first) +
4520 ((num_clusters - 1) * ocfs2_clusters_to_blocks(sb, 1));
4521
4522 BUG_ON(le16_to_cpu(bucket_xh(first)->xh_num_buckets) < num_buckets);
4523 BUG_ON(OCFS2_XATTR_BUCKET_SIZE == OCFS2_SB(sb)->s_clustersize);
4524
4525 trace_ocfs2_mv_xattr_bucket_cross_cluster(
4526 (unsigned long long)last_cluster_blkno,
4527 (unsigned long long)new_blkno);
4528
4529 ret = ocfs2_mv_xattr_buckets(inode, handle, bucket_blkno(first),
4530 last_cluster_blkno, new_blkno,
4531 to_move, first_hash);
4532 if (ret) {
4533 mlog_errno(ret);
4534 goto out;
4535 }
4536
4537
4538 src_blkno = last_cluster_blkno + (to_move * blks_per_bucket);
4539
4540
4541
4542
4543
4544 if (bucket_blkno(target) >= src_blkno) {
4545
4546 src_blkno = new_blkno +
4547 (bucket_blkno(target) - src_blkno);
4548
4549 ocfs2_xattr_bucket_relse(first);
4550 ocfs2_xattr_bucket_relse(target);
4551
4552
4553
4554
4555
4556 ret = ocfs2_read_xattr_bucket(first, new_blkno);
4557 if (ret) {
4558 mlog_errno(ret);
4559 goto out;
4560 }
4561 ret = ocfs2_read_xattr_bucket(target, src_blkno);
4562 if (ret)
4563 mlog_errno(ret);
4564
4565 }
4566
4567 out:
4568 return ret;
4569 }
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581 static int ocfs2_xattr_find_divide_pos(struct ocfs2_xattr_header *xh)
4582 {
4583 struct ocfs2_xattr_entry *entries = xh->xh_entries;
4584 int count = le16_to_cpu(xh->xh_count);
4585 int delta, middle = count / 2;
4586
4587
4588
4589
4590
4591
4592
4593 for (delta = 0; delta < middle; delta++) {
4594
4595 if (cmp_xe(&entries[middle - delta - 1],
4596 &entries[middle - delta]))
4597 return middle - delta;
4598
4599
4600 if ((middle + delta + 1) == count)
4601 continue;
4602
4603
4604 if (cmp_xe(&entries[middle + delta],
4605 &entries[middle + delta + 1]))
4606 return middle + delta + 1;
4607 }
4608
4609
4610 return count;
4611 }
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623 static int ocfs2_divide_xattr_bucket(struct inode *inode,
4624 handle_t *handle,
4625 u64 blk,
4626 u64 new_blk,
4627 u32 *first_hash,
4628 int new_bucket_head)
4629 {
4630 int ret, i;
4631 int count, start, len, name_value_len = 0, name_offset = 0;
4632 struct ocfs2_xattr_bucket *s_bucket = NULL, *t_bucket = NULL;
4633 struct ocfs2_xattr_header *xh;
4634 struct ocfs2_xattr_entry *xe;
4635 int blocksize = inode->i_sb->s_blocksize;
4636
4637 trace_ocfs2_divide_xattr_bucket_begin((unsigned long long)blk,
4638 (unsigned long long)new_blk);
4639
4640 s_bucket = ocfs2_xattr_bucket_new(inode);
4641 t_bucket = ocfs2_xattr_bucket_new(inode);
4642 if (!s_bucket || !t_bucket) {
4643 ret = -ENOMEM;
4644 mlog_errno(ret);
4645 goto out;
4646 }
4647
4648 ret = ocfs2_read_xattr_bucket(s_bucket, blk);
4649 if (ret) {
4650 mlog_errno(ret);
4651 goto out;
4652 }
4653
4654 ret = ocfs2_xattr_bucket_journal_access(handle, s_bucket,
4655 OCFS2_JOURNAL_ACCESS_WRITE);
4656 if (ret) {
4657 mlog_errno(ret);
4658 goto out;
4659 }
4660
4661
4662
4663
4664
4665 ret = ocfs2_init_xattr_bucket(t_bucket, new_blk, new_bucket_head);
4666 if (ret) {
4667 mlog_errno(ret);
4668 goto out;
4669 }
4670
4671
4672
4673
4674
4675
4676 ret = ocfs2_xattr_bucket_journal_access(handle, t_bucket,
4677 new_bucket_head ?
4678 OCFS2_JOURNAL_ACCESS_CREATE :
4679 OCFS2_JOURNAL_ACCESS_WRITE);
4680 if (ret) {
4681 mlog_errno(ret);
4682 goto out;
4683 }
4684
4685 xh = bucket_xh(s_bucket);
4686 count = le16_to_cpu(xh->xh_count);
4687 start = ocfs2_xattr_find_divide_pos(xh);
4688
4689 if (start == count) {
4690 xe = &xh->xh_entries[start-1];
4691
4692
4693
4694
4695
4696
4697 for (i = 0; i < t_bucket->bu_blocks; i++)
4698 memset(bucket_block(t_bucket, i), 0, blocksize);
4699
4700 xh = bucket_xh(t_bucket);
4701 xh->xh_free_start = cpu_to_le16(blocksize);
4702 xh->xh_entries[0].xe_name_hash = xe->xe_name_hash;
4703 le32_add_cpu(&xh->xh_entries[0].xe_name_hash, 1);
4704
4705 goto set_num_buckets;
4706 }
4707
4708
4709 ocfs2_xattr_bucket_copy_data(t_bucket, s_bucket);
4710
4711
4712 xh = bucket_xh(t_bucket);
4713
4714
4715
4716
4717
4718 name_offset = OCFS2_XATTR_BUCKET_SIZE;
4719 name_value_len = 0;
4720 for (i = 0; i < start; i++) {
4721 xe = &xh->xh_entries[i];
4722 name_value_len += namevalue_size_xe(xe);
4723 if (le16_to_cpu(xe->xe_name_offset) < name_offset)
4724 name_offset = le16_to_cpu(xe->xe_name_offset);
4725 }
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735 xe = &xh->xh_entries[start];
4736 len = sizeof(struct ocfs2_xattr_entry) * (count - start);
4737 trace_ocfs2_divide_xattr_bucket_move(len,
4738 (int)((char *)xe - (char *)xh),
4739 (int)((char *)xh->xh_entries - (char *)xh));
4740 memmove((char *)xh->xh_entries, (char *)xe, len);
4741 xe = &xh->xh_entries[count - start];
4742 len = sizeof(struct ocfs2_xattr_entry) * start;
4743 memset((char *)xe, 0, len);
4744
4745 le16_add_cpu(&xh->xh_count, -start);
4746 le16_add_cpu(&xh->xh_name_value_len, -name_value_len);
4747
4748
4749 xh->xh_free_start = cpu_to_le16(OCFS2_XATTR_BUCKET_SIZE);
4750 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) {
4751 xe = &xh->xh_entries[i];
4752 if (le16_to_cpu(xe->xe_name_offset) <
4753 le16_to_cpu(xh->xh_free_start))
4754 xh->xh_free_start = xe->xe_name_offset;
4755 }
4756
4757 set_num_buckets:
4758
4759 if (new_bucket_head)
4760 xh->xh_num_buckets = cpu_to_le16(1);
4761 else
4762 xh->xh_num_buckets = 0;
4763
4764 ocfs2_xattr_bucket_journal_dirty(handle, t_bucket);
4765
4766
4767 if (first_hash)
4768 *first_hash = le32_to_cpu(xh->xh_entries[0].xe_name_hash);
4769
4770
4771
4772
4773
4774
4775 if (start == count)
4776 goto out;
4777
4778 xh = bucket_xh(s_bucket);
4779 memset(&xh->xh_entries[start], 0,
4780 sizeof(struct ocfs2_xattr_entry) * (count - start));
4781 xh->xh_count = cpu_to_le16(start);
4782 xh->xh_free_start = cpu_to_le16(name_offset);
4783 xh->xh_name_value_len = cpu_to_le16(name_value_len);
4784
4785 ocfs2_xattr_bucket_journal_dirty(handle, s_bucket);
4786
4787 out:
4788 ocfs2_xattr_bucket_free(s_bucket);
4789 ocfs2_xattr_bucket_free(t_bucket);
4790
4791 return ret;
4792 }
4793
4794
4795
4796
4797
4798
4799
4800 static int ocfs2_cp_xattr_bucket(struct inode *inode,
4801 handle_t *handle,
4802 u64 s_blkno,
4803 u64 t_blkno,
4804 int t_is_new)
4805 {
4806 int ret;
4807 struct ocfs2_xattr_bucket *s_bucket = NULL, *t_bucket = NULL;
4808
4809 BUG_ON(s_blkno == t_blkno);
4810
4811 trace_ocfs2_cp_xattr_bucket((unsigned long long)s_blkno,
4812 (unsigned long long)t_blkno,
4813 t_is_new);
4814
4815 s_bucket = ocfs2_xattr_bucket_new(inode);
4816 t_bucket = ocfs2_xattr_bucket_new(inode);
4817 if (!s_bucket || !t_bucket) {
4818 ret = -ENOMEM;
4819 mlog_errno(ret);
4820 goto out;
4821 }
4822
4823 ret = ocfs2_read_xattr_bucket(s_bucket, s_blkno);
4824 if (ret)
4825 goto out;
4826
4827
4828
4829
4830
4831 ret = ocfs2_init_xattr_bucket(t_bucket, t_blkno, t_is_new);
4832 if (ret)
4833 goto out;
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848 ret = ocfs2_xattr_bucket_journal_access(handle, t_bucket,
4849 t_is_new ?
4850 OCFS2_JOURNAL_ACCESS_CREATE :
4851 OCFS2_JOURNAL_ACCESS_WRITE);
4852 if (ret)
4853 goto out;
4854
4855 ocfs2_xattr_bucket_copy_data(t_bucket, s_bucket);
4856 ocfs2_xattr_bucket_journal_dirty(handle, t_bucket);
4857
4858 out:
4859 ocfs2_xattr_bucket_free(t_bucket);
4860 ocfs2_xattr_bucket_free(s_bucket);
4861
4862 return ret;
4863 }
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874 static int ocfs2_mv_xattr_buckets(struct inode *inode, handle_t *handle,
4875 u64 src_blk, u64 last_blk, u64 to_blk,
4876 unsigned int start_bucket,
4877 u32 *first_hash)
4878 {
4879 int i, ret, credits;
4880 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
4881 int blks_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
4882 int num_buckets = ocfs2_xattr_buckets_per_cluster(osb);
4883 struct ocfs2_xattr_bucket *old_first, *new_first;
4884
4885 trace_ocfs2_mv_xattr_buckets((unsigned long long)last_blk,
4886 (unsigned long long)to_blk);
4887
4888 BUG_ON(start_bucket >= num_buckets);
4889 if (start_bucket) {
4890 num_buckets -= start_bucket;
4891 last_blk += (start_bucket * blks_per_bucket);
4892 }
4893
4894
4895 old_first = ocfs2_xattr_bucket_new(inode);
4896
4897 new_first = ocfs2_xattr_bucket_new(inode);
4898 if (!old_first || !new_first) {
4899 ret = -ENOMEM;
4900 mlog_errno(ret);
4901 goto out;
4902 }
4903
4904 ret = ocfs2_read_xattr_bucket(old_first, src_blk);
4905 if (ret) {
4906 mlog_errno(ret);
4907 goto out;
4908 }
4909
4910
4911
4912
4913
4914 credits = ((num_buckets + 1) * blks_per_bucket);
4915 ret = ocfs2_extend_trans(handle, credits);
4916 if (ret) {
4917 mlog_errno(ret);
4918 goto out;
4919 }
4920
4921 ret = ocfs2_xattr_bucket_journal_access(handle, old_first,
4922 OCFS2_JOURNAL_ACCESS_WRITE);
4923 if (ret) {
4924 mlog_errno(ret);
4925 goto out;
4926 }
4927
4928 for (i = 0; i < num_buckets; i++) {
4929 ret = ocfs2_cp_xattr_bucket(inode, handle,
4930 last_blk + (i * blks_per_bucket),
4931 to_blk + (i * blks_per_bucket),
4932 1);
4933 if (ret) {
4934 mlog_errno(ret);
4935 goto out;
4936 }
4937 }
4938
4939
4940
4941
4942
4943
4944 ret = ocfs2_read_xattr_bucket(new_first, to_blk);
4945 if (ret) {
4946 mlog_errno(ret);
4947 goto out;
4948 }
4949 ret = ocfs2_xattr_bucket_journal_access(handle, new_first,
4950 OCFS2_JOURNAL_ACCESS_WRITE);
4951 if (ret) {
4952 mlog_errno(ret);
4953 goto out;
4954 }
4955
4956
4957 le16_add_cpu(&bucket_xh(old_first)->xh_num_buckets, -num_buckets);
4958 ocfs2_xattr_bucket_journal_dirty(handle, old_first);
4959
4960 bucket_xh(new_first)->xh_num_buckets = cpu_to_le16(num_buckets);
4961 ocfs2_xattr_bucket_journal_dirty(handle, new_first);
4962
4963 if (first_hash)
4964 *first_hash = le32_to_cpu(bucket_xh(new_first)->xh_entries[0].xe_name_hash);
4965
4966 out:
4967 ocfs2_xattr_bucket_free(new_first);
4968 ocfs2_xattr_bucket_free(old_first);
4969 return ret;
4970 }
4971
4972
4973
4974
4975
4976
4977 static int ocfs2_divide_xattr_cluster(struct inode *inode,
4978 handle_t *handle,
4979 u64 prev_blk,
4980 u64 new_blk,
4981 u32 *first_hash)
4982 {
4983 u16 blk_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
4984 int ret, credits = 2 * blk_per_bucket;
4985
4986 BUG_ON(OCFS2_XATTR_BUCKET_SIZE < OCFS2_SB(inode->i_sb)->s_clustersize);
4987
4988 ret = ocfs2_extend_trans(handle, credits);
4989 if (ret) {
4990 mlog_errno(ret);
4991 return ret;
4992 }
4993
4994
4995 return ocfs2_divide_xattr_bucket(inode, handle, prev_blk,
4996 new_blk, first_hash, 1);
4997 }
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025 static int ocfs2_adjust_xattr_cross_cluster(struct inode *inode,
5026 handle_t *handle,
5027 struct ocfs2_xattr_bucket *first,
5028 struct ocfs2_xattr_bucket *target,
5029 u64 new_blk,
5030 u32 prev_clusters,
5031 u32 *v_start,
5032 int *extend)
5033 {
5034 int ret;
5035
5036 trace_ocfs2_adjust_xattr_cross_cluster(
5037 (unsigned long long)bucket_blkno(first),
5038 (unsigned long long)new_blk, prev_clusters);
5039
5040 if (ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb)) > 1) {
5041 ret = ocfs2_mv_xattr_bucket_cross_cluster(inode,
5042 handle,
5043 first, target,
5044 new_blk,
5045 prev_clusters,
5046 v_start);
5047 if (ret)
5048 mlog_errno(ret);
5049 } else {
5050
5051 u64 last_blk = bucket_blkno(first) +
5052 ((prev_clusters - 1) *
5053 ocfs2_clusters_to_blocks(inode->i_sb, 1));
5054
5055 if (prev_clusters > 1 && bucket_blkno(target) != last_blk) {
5056 ret = ocfs2_mv_xattr_buckets(inode, handle,
5057 bucket_blkno(first),
5058 last_blk, new_blk, 0,
5059 v_start);
5060 if (ret)
5061 mlog_errno(ret);
5062 } else {
5063 ret = ocfs2_divide_xattr_cluster(inode, handle,
5064 last_blk, new_blk,
5065 v_start);
5066 if (ret)
5067 mlog_errno(ret);
5068
5069 if ((bucket_blkno(target) == last_blk) && extend)
5070 *extend = 0;
5071 }
5072 }
5073
5074 return ret;
5075 }
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093 static int ocfs2_add_new_xattr_cluster(struct inode *inode,
5094 struct buffer_head *root_bh,
5095 struct ocfs2_xattr_bucket *first,
5096 struct ocfs2_xattr_bucket *target,
5097 u32 *num_clusters,
5098 u32 prev_cpos,
5099 int *extend,
5100 struct ocfs2_xattr_set_ctxt *ctxt)
5101 {
5102 int ret;
5103 u16 bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
5104 u32 prev_clusters = *num_clusters;
5105 u32 clusters_to_add = 1, bit_off, num_bits, v_start = 0;
5106 u64 block;
5107 handle_t *handle = ctxt->handle;
5108 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
5109 struct ocfs2_extent_tree et;
5110
5111 trace_ocfs2_add_new_xattr_cluster_begin(
5112 (unsigned long long)OCFS2_I(inode)->ip_blkno,
5113 (unsigned long long)bucket_blkno(first),
5114 prev_cpos, prev_clusters);
5115
5116 ocfs2_init_xattr_tree_extent_tree(&et, INODE_CACHE(inode), root_bh);
5117
5118 ret = ocfs2_journal_access_xb(handle, INODE_CACHE(inode), root_bh,
5119 OCFS2_JOURNAL_ACCESS_WRITE);
5120 if (ret < 0) {
5121 mlog_errno(ret);
5122 goto leave;
5123 }
5124
5125 ret = __ocfs2_claim_clusters(handle, ctxt->data_ac, 1,
5126 clusters_to_add, &bit_off, &num_bits);
5127 if (ret < 0) {
5128 if (ret != -ENOSPC)
5129 mlog_errno(ret);
5130 goto leave;
5131 }
5132
5133 BUG_ON(num_bits > clusters_to_add);
5134
5135 block = ocfs2_clusters_to_blocks(osb->sb, bit_off);
5136 trace_ocfs2_add_new_xattr_cluster((unsigned long long)block, num_bits);
5137
5138 if (bucket_blkno(first) + (prev_clusters * bpc) == block &&
5139 (prev_clusters + num_bits) << osb->s_clustersize_bits <=
5140 OCFS2_MAX_XATTR_TREE_LEAF_SIZE) {
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150 v_start = prev_cpos + prev_clusters;
5151 *num_clusters = prev_clusters + num_bits;
5152 } else {
5153 ret = ocfs2_adjust_xattr_cross_cluster(inode,
5154 handle,
5155 first,
5156 target,
5157 block,
5158 prev_clusters,
5159 &v_start,
5160 extend);
5161 if (ret) {
5162 mlog_errno(ret);
5163 goto leave;
5164 }
5165 }
5166
5167 trace_ocfs2_add_new_xattr_cluster_insert((unsigned long long)block,
5168 v_start, num_bits);
5169 ret = ocfs2_insert_extent(handle, &et, v_start, block,
5170 num_bits, 0, ctxt->meta_ac);
5171 if (ret < 0) {
5172 mlog_errno(ret);
5173 goto leave;
5174 }
5175
5176 ocfs2_journal_dirty(handle, root_bh);
5177
5178 leave:
5179 return ret;
5180 }
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191 static int ocfs2_extend_xattr_bucket(struct inode *inode,
5192 handle_t *handle,
5193 struct ocfs2_xattr_bucket *first,
5194 u64 target_blk,
5195 u32 num_clusters)
5196 {
5197 int ret, credits;
5198 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
5199 u16 blk_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
5200 u64 end_blk;
5201 u16 new_bucket = le16_to_cpu(bucket_xh(first)->xh_num_buckets);
5202
5203 trace_ocfs2_extend_xattr_bucket((unsigned long long)target_blk,
5204 (unsigned long long)bucket_blkno(first),
5205 num_clusters, new_bucket);
5206
5207
5208 BUG_ON(new_bucket >=
5209 (num_clusters * ocfs2_xattr_buckets_per_cluster(osb)));
5210
5211
5212 end_blk = bucket_blkno(first) + ((new_bucket - 1) * blk_per_bucket);
5213
5214
5215
5216
5217
5218
5219
5220
5221 credits = (end_blk - target_blk) + (3 * blk_per_bucket);
5222 ret = ocfs2_extend_trans(handle, credits);
5223 if (ret) {
5224 mlog_errno(ret);
5225 goto out;
5226 }
5227
5228 ret = ocfs2_xattr_bucket_journal_access(handle, first,
5229 OCFS2_JOURNAL_ACCESS_WRITE);
5230 if (ret) {
5231 mlog_errno(ret);
5232 goto out;
5233 }
5234
5235 while (end_blk != target_blk) {
5236 ret = ocfs2_cp_xattr_bucket(inode, handle, end_blk,
5237 end_blk + blk_per_bucket, 0);
5238 if (ret)
5239 goto out;
5240 end_blk -= blk_per_bucket;
5241 }
5242
5243
5244 ret = ocfs2_divide_xattr_bucket(inode, handle, target_blk,
5245 target_blk + blk_per_bucket, NULL, 0);
5246
5247 le16_add_cpu(&bucket_xh(first)->xh_num_buckets, 1);
5248 ocfs2_xattr_bucket_journal_dirty(handle, first);
5249
5250 out:
5251 return ret;
5252 }
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267 static int ocfs2_add_new_xattr_bucket(struct inode *inode,
5268 struct buffer_head *xb_bh,
5269 struct ocfs2_xattr_bucket *target,
5270 struct ocfs2_xattr_set_ctxt *ctxt)
5271 {
5272 struct ocfs2_xattr_block *xb =
5273 (struct ocfs2_xattr_block *)xb_bh->b_data;
5274 struct ocfs2_xattr_tree_root *xb_root = &xb->xb_attrs.xb_root;
5275 struct ocfs2_extent_list *el = &xb_root->xt_list;
5276 u32 name_hash =
5277 le32_to_cpu(bucket_xh(target)->xh_entries[0].xe_name_hash);
5278 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
5279 int ret, num_buckets, extend = 1;
5280 u64 p_blkno;
5281 u32 e_cpos, num_clusters;
5282
5283 struct ocfs2_xattr_bucket *first;
5284
5285 trace_ocfs2_add_new_xattr_bucket(
5286 (unsigned long long)bucket_blkno(target));
5287
5288
5289 first = ocfs2_xattr_bucket_new(inode);
5290 if (!first) {
5291 ret = -ENOMEM;
5292 mlog_errno(ret);
5293 goto out;
5294 }
5295
5296 ret = ocfs2_xattr_get_rec(inode, name_hash, &p_blkno, &e_cpos,
5297 &num_clusters, el);
5298 if (ret) {
5299 mlog_errno(ret);
5300 goto out;
5301 }
5302
5303 ret = ocfs2_read_xattr_bucket(first, p_blkno);
5304 if (ret) {
5305 mlog_errno(ret);
5306 goto out;
5307 }
5308
5309 num_buckets = ocfs2_xattr_buckets_per_cluster(osb) * num_clusters;
5310 if (num_buckets == le16_to_cpu(bucket_xh(first)->xh_num_buckets)) {
5311
5312
5313
5314
5315 ret = ocfs2_add_new_xattr_cluster(inode,
5316 xb_bh,
5317 first,
5318 target,
5319 &num_clusters,
5320 e_cpos,
5321 &extend,
5322 ctxt);
5323 if (ret) {
5324 mlog_errno(ret);
5325 goto out;
5326 }
5327 }
5328
5329 if (extend) {
5330 ret = ocfs2_extend_xattr_bucket(inode,
5331 ctxt->handle,
5332 first,
5333 bucket_blkno(target),
5334 num_clusters);
5335 if (ret)
5336 mlog_errno(ret);
5337 }
5338
5339 out:
5340 ocfs2_xattr_bucket_free(first);
5341
5342 return ret;
5343 }
5344
5345
5346
5347
5348
5349
5350
5351
5352 static int ocfs2_xattr_bucket_value_truncate(struct inode *inode,
5353 struct ocfs2_xattr_bucket *bucket,
5354 int xe_off,
5355 int len,
5356 struct ocfs2_xattr_set_ctxt *ctxt)
5357 {
5358 int ret, offset;
5359 u64 value_blk;
5360 struct ocfs2_xattr_entry *xe;
5361 struct ocfs2_xattr_header *xh = bucket_xh(bucket);
5362 size_t blocksize = inode->i_sb->s_blocksize;
5363 struct ocfs2_xattr_value_buf vb = {
5364 .vb_access = ocfs2_journal_access,
5365 };
5366
5367 xe = &xh->xh_entries[xe_off];
5368
5369 BUG_ON(!xe || ocfs2_xattr_is_local(xe));
5370
5371 offset = le16_to_cpu(xe->xe_name_offset) +
5372 OCFS2_XATTR_SIZE(xe->xe_name_len);
5373
5374 value_blk = offset / blocksize;
5375
5376
5377 BUG_ON(value_blk != (offset + OCFS2_XATTR_ROOT_SIZE - 1) / blocksize);
5378
5379 vb.vb_bh = bucket->bu_bhs[value_blk];
5380 BUG_ON(!vb.vb_bh);
5381
5382 vb.vb_xv = (struct ocfs2_xattr_value_root *)
5383 (vb.vb_bh->b_data + offset % blocksize);
5384
5385
5386
5387
5388
5389
5390
5391
5392 trace_ocfs2_xattr_bucket_value_truncate(
5393 (unsigned long long)bucket_blkno(bucket), xe_off, len);
5394 ret = ocfs2_xattr_value_truncate(inode, &vb, len, ctxt);
5395 if (ret) {
5396 mlog_errno(ret);
5397 goto out;
5398 }
5399
5400 ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket,
5401 OCFS2_JOURNAL_ACCESS_WRITE);
5402 if (ret) {
5403 mlog_errno(ret);
5404 goto out;
5405 }
5406
5407 xe->xe_value_size = cpu_to_le64(len);
5408
5409 ocfs2_xattr_bucket_journal_dirty(ctxt->handle, bucket);
5410
5411 out:
5412 return ret;
5413 }
5414
5415 static int ocfs2_rm_xattr_cluster(struct inode *inode,
5416 struct buffer_head *root_bh,
5417 u64 blkno,
5418 u32 cpos,
5419 u32 len,
5420 void *para)
5421 {
5422 int ret;
5423 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
5424 struct inode *tl_inode = osb->osb_tl_inode;
5425 handle_t *handle;
5426 struct ocfs2_xattr_block *xb =
5427 (struct ocfs2_xattr_block *)root_bh->b_data;
5428 struct ocfs2_alloc_context *meta_ac = NULL;
5429 struct ocfs2_cached_dealloc_ctxt dealloc;
5430 struct ocfs2_extent_tree et;
5431
5432 ret = ocfs2_iterate_xattr_buckets(inode, blkno, len,
5433 ocfs2_delete_xattr_in_bucket, para);
5434 if (ret) {
5435 mlog_errno(ret);
5436 return ret;
5437 }
5438
5439 ocfs2_init_xattr_tree_extent_tree(&et, INODE_CACHE(inode), root_bh);
5440
5441 ocfs2_init_dealloc_ctxt(&dealloc);
5442
5443 trace_ocfs2_rm_xattr_cluster(
5444 (unsigned long long)OCFS2_I(inode)->ip_blkno,
5445 (unsigned long long)blkno, cpos, len);
5446
5447 ocfs2_remove_xattr_clusters_from_cache(INODE_CACHE(inode), blkno,
5448 len);
5449
5450 ret = ocfs2_lock_allocators(inode, &et, 0, 1, NULL, &meta_ac);
5451 if (ret) {
5452 mlog_errno(ret);
5453 return ret;
5454 }
5455
5456 inode_lock(tl_inode);
5457
5458 if (ocfs2_truncate_log_needs_flush(osb)) {
5459 ret = __ocfs2_flush_truncate_log(osb);
5460 if (ret < 0) {
5461 mlog_errno(ret);
5462 goto out;
5463 }
5464 }
5465
5466 handle = ocfs2_start_trans(osb, ocfs2_remove_extent_credits(osb->sb));
5467 if (IS_ERR(handle)) {
5468 ret = -ENOMEM;
5469 mlog_errno(ret);
5470 goto out;
5471 }
5472
5473 ret = ocfs2_journal_access_xb(handle, INODE_CACHE(inode), root_bh,
5474 OCFS2_JOURNAL_ACCESS_WRITE);
5475 if (ret) {
5476 mlog_errno(ret);
5477 goto out_commit;
5478 }
5479
5480 ret = ocfs2_remove_extent(handle, &et, cpos, len, meta_ac,
5481 &dealloc);
5482 if (ret) {
5483 mlog_errno(ret);
5484 goto out_commit;
5485 }
5486
5487 le32_add_cpu(&xb->xb_attrs.xb_root.xt_clusters, -len);
5488 ocfs2_journal_dirty(handle, root_bh);
5489
5490 ret = ocfs2_truncate_log_append(osb, handle, blkno, len);
5491 if (ret)
5492 mlog_errno(ret);
5493 ocfs2_update_inode_fsync_trans(handle, inode, 0);
5494
5495 out_commit:
5496 ocfs2_commit_trans(osb, handle);
5497 out:
5498 ocfs2_schedule_truncate_log_flush(osb, 1);
5499
5500 inode_unlock(tl_inode);
5501
5502 if (meta_ac)
5503 ocfs2_free_alloc_context(meta_ac);
5504
5505 ocfs2_run_deallocs(osb, &dealloc);
5506
5507 return ret;
5508 }
5509
5510
5511
5512
5513
5514
5515
5516 static int ocfs2_check_xattr_bucket_collision(struct inode *inode,
5517 struct ocfs2_xattr_bucket *bucket,
5518 const char *name)
5519 {
5520 struct ocfs2_xattr_header *xh = bucket_xh(bucket);
5521 u32 name_hash = ocfs2_xattr_name_hash(inode, name, strlen(name));
5522
5523 if (name_hash != le32_to_cpu(xh->xh_entries[0].xe_name_hash))
5524 return 0;
5525
5526 if (xh->xh_entries[le16_to_cpu(xh->xh_count) - 1].xe_name_hash ==
5527 xh->xh_entries[0].xe_name_hash) {
5528 mlog(ML_ERROR, "Too much hash collision in xattr bucket %llu, "
5529 "hash = %u\n",
5530 (unsigned long long)bucket_blkno(bucket),
5531 le32_to_cpu(xh->xh_entries[0].xe_name_hash));
5532 return -ENOSPC;
5533 }
5534
5535 return 0;
5536 }
5537
5538
5539
5540
5541
5542 static int ocfs2_xattr_set_entry_bucket(struct inode *inode,
5543 struct ocfs2_xattr_info *xi,
5544 struct ocfs2_xattr_search *xs,
5545 struct ocfs2_xattr_set_ctxt *ctxt)
5546 {
5547 int ret;
5548 struct ocfs2_xa_loc loc;
5549
5550 trace_ocfs2_xattr_set_entry_bucket(xi->xi_name);
5551
5552 ocfs2_init_xattr_bucket_xa_loc(&loc, xs->bucket,
5553 xs->not_found ? NULL : xs->here);
5554 ret = ocfs2_xa_set(&loc, xi, ctxt);
5555 if (!ret) {
5556 xs->here = loc.xl_entry;
5557 goto out;
5558 }
5559 if (ret != -ENOSPC) {
5560 mlog_errno(ret);
5561 goto out;
5562 }
5563
5564
5565 ret = ocfs2_defrag_xattr_bucket(inode, ctxt->handle,
5566 xs->bucket);
5567 if (ret) {
5568 mlog_errno(ret);
5569 goto out;
5570 }
5571
5572 ret = ocfs2_xa_set(&loc, xi, ctxt);
5573 if (!ret) {
5574 xs->here = loc.xl_entry;
5575 goto out;
5576 }
5577 if (ret != -ENOSPC)
5578 mlog_errno(ret);
5579
5580
5581 out:
5582 return ret;
5583 }
5584
5585 static int ocfs2_xattr_set_entry_index_block(struct inode *inode,
5586 struct ocfs2_xattr_info *xi,
5587 struct ocfs2_xattr_search *xs,
5588 struct ocfs2_xattr_set_ctxt *ctxt)
5589 {
5590 int ret;
5591
5592 trace_ocfs2_xattr_set_entry_index_block(xi->xi_name);
5593
5594 ret = ocfs2_xattr_set_entry_bucket(inode, xi, xs, ctxt);
5595 if (!ret)
5596 goto out;
5597 if (ret != -ENOSPC) {
5598 mlog_errno(ret);
5599 goto out;
5600 }
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610 ret = ocfs2_check_xattr_bucket_collision(inode,
5611 xs->bucket,
5612 xi->xi_name);
5613 if (ret) {
5614 mlog_errno(ret);
5615 goto out;
5616 }
5617
5618 ret = ocfs2_add_new_xattr_bucket(inode,
5619 xs->xattr_bh,
5620 xs->bucket,
5621 ctxt);
5622 if (ret) {
5623 mlog_errno(ret);
5624 goto out;
5625 }
5626
5627
5628
5629
5630
5631
5632
5633
5634 ocfs2_xattr_bucket_relse(xs->bucket);
5635 ret = ocfs2_xattr_index_block_find(inode, xs->xattr_bh,
5636 xi->xi_name_index,
5637 xi->xi_name, xs);
5638 if (ret && ret != -ENODATA)
5639 goto out;
5640 xs->not_found = ret;
5641
5642
5643 ret = ocfs2_xattr_set_entry_bucket(inode, xi, xs, ctxt);
5644 if (ret && (ret != -ENOSPC))
5645 mlog_errno(ret);
5646
5647 out:
5648 return ret;
5649 }
5650
5651 static int ocfs2_delete_xattr_in_bucket(struct inode *inode,
5652 struct ocfs2_xattr_bucket *bucket,
5653 void *para)
5654 {
5655 int ret = 0, ref_credits;
5656 struct ocfs2_xattr_header *xh = bucket_xh(bucket);
5657 u16 i;
5658 struct ocfs2_xattr_entry *xe;
5659 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
5660 struct ocfs2_xattr_set_ctxt ctxt = {NULL, NULL,};
5661 int credits = ocfs2_remove_extent_credits(osb->sb) +
5662 ocfs2_blocks_per_xattr_bucket(inode->i_sb);
5663 struct ocfs2_xattr_value_root *xv;
5664 struct ocfs2_rm_xattr_bucket_para *args =
5665 (struct ocfs2_rm_xattr_bucket_para *)para;
5666
5667 ocfs2_init_dealloc_ctxt(&ctxt.dealloc);
5668
5669 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) {
5670 xe = &xh->xh_entries[i];
5671 if (ocfs2_xattr_is_local(xe))
5672 continue;
5673
5674 ret = ocfs2_get_xattr_tree_value_root(inode->i_sb, bucket,
5675 i, &xv, NULL);
5676 if (ret) {
5677 mlog_errno(ret);
5678 break;
5679 }
5680
5681 ret = ocfs2_lock_xattr_remove_allocators(inode, xv,
5682 args->ref_ci,
5683 args->ref_root_bh,
5684 &ctxt.meta_ac,
5685 &ref_credits);
5686
5687 ctxt.handle = ocfs2_start_trans(osb, credits + ref_credits);
5688 if (IS_ERR(ctxt.handle)) {
5689 ret = PTR_ERR(ctxt.handle);
5690 mlog_errno(ret);
5691 break;
5692 }
5693
5694 ret = ocfs2_xattr_bucket_value_truncate(inode, bucket,
5695 i, 0, &ctxt);
5696
5697 ocfs2_commit_trans(osb, ctxt.handle);
5698 if (ctxt.meta_ac) {
5699 ocfs2_free_alloc_context(ctxt.meta_ac);
5700 ctxt.meta_ac = NULL;
5701 }
5702 if (ret) {
5703 mlog_errno(ret);
5704 break;
5705 }
5706 }
5707
5708 if (ctxt.meta_ac)
5709 ocfs2_free_alloc_context(ctxt.meta_ac);
5710 ocfs2_schedule_truncate_log_flush(osb, 1);
5711 ocfs2_run_deallocs(osb, &ctxt.dealloc);
5712 return ret;
5713 }
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723 static int ocfs2_xattr_bucket_post_refcount(struct inode *inode,
5724 handle_t *handle,
5725 void *para)
5726 {
5727 int ret;
5728 struct ocfs2_xattr_bucket *bucket =
5729 (struct ocfs2_xattr_bucket *)para;
5730
5731 ret = ocfs2_xattr_bucket_journal_access(handle, bucket,
5732 OCFS2_JOURNAL_ACCESS_WRITE);
5733 if (ret) {
5734 mlog_errno(ret);
5735 return ret;
5736 }
5737
5738 ocfs2_xattr_bucket_journal_dirty(handle, bucket);
5739
5740 return 0;
5741 }
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757 static int ocfs2_prepare_refcount_xattr(struct inode *inode,
5758 struct ocfs2_dinode *di,
5759 struct ocfs2_xattr_info *xi,
5760 struct ocfs2_xattr_search *xis,
5761 struct ocfs2_xattr_search *xbs,
5762 struct ocfs2_refcount_tree **ref_tree,
5763 int *meta_add,
5764 int *credits)
5765 {
5766 int ret = 0;
5767 struct ocfs2_xattr_block *xb;
5768 struct ocfs2_xattr_entry *xe;
5769 char *base;
5770 u32 p_cluster, num_clusters;
5771 unsigned int ext_flags;
5772 int name_offset, name_len;
5773 struct ocfs2_xattr_value_buf vb;
5774 struct ocfs2_xattr_bucket *bucket = NULL;
5775 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
5776 struct ocfs2_post_refcount refcount;
5777 struct ocfs2_post_refcount *p = NULL;
5778 struct buffer_head *ref_root_bh = NULL;
5779
5780 if (!xis->not_found) {
5781 xe = xis->here;
5782 name_offset = le16_to_cpu(xe->xe_name_offset);
5783 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len);
5784 base = xis->base;
5785 vb.vb_bh = xis->inode_bh;
5786 vb.vb_access = ocfs2_journal_access_di;
5787 } else {
5788 int i, block_off = 0;
5789 xb = (struct ocfs2_xattr_block *)xbs->xattr_bh->b_data;
5790 xe = xbs->here;
5791 name_offset = le16_to_cpu(xe->xe_name_offset);
5792 name_len = OCFS2_XATTR_SIZE(xe->xe_name_len);
5793 i = xbs->here - xbs->header->xh_entries;
5794
5795 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED) {
5796 ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
5797 bucket_xh(xbs->bucket),
5798 i, &block_off,
5799 &name_offset);
5800 if (ret) {
5801 mlog_errno(ret);
5802 goto out;
5803 }
5804 base = bucket_block(xbs->bucket, block_off);
5805 vb.vb_bh = xbs->bucket->bu_bhs[block_off];
5806 vb.vb_access = ocfs2_journal_access;
5807
5808 if (ocfs2_meta_ecc(osb)) {
5809
5810 bucket = xbs->bucket;
5811 refcount.credits = bucket->bu_blocks;
5812 refcount.para = bucket;
5813 refcount.func =
5814 ocfs2_xattr_bucket_post_refcount;
5815 p = &refcount;
5816 }
5817 } else {
5818 base = xbs->base;
5819 vb.vb_bh = xbs->xattr_bh;
5820 vb.vb_access = ocfs2_journal_access_xb;
5821 }
5822 }
5823
5824 if (ocfs2_xattr_is_local(xe))
5825 goto out;
5826
5827 vb.vb_xv = (struct ocfs2_xattr_value_root *)
5828 (base + name_offset + name_len);
5829
5830 ret = ocfs2_xattr_get_clusters(inode, 0, &p_cluster,
5831 &num_clusters, &vb.vb_xv->xr_list,
5832 &ext_flags);
5833 if (ret) {
5834 mlog_errno(ret);
5835 goto out;
5836 }
5837
5838
5839
5840
5841
5842
5843 if (!(ext_flags & OCFS2_EXT_REFCOUNTED))
5844 goto out;
5845
5846 ret = ocfs2_lock_refcount_tree(osb, le64_to_cpu(di->i_refcount_loc),
5847 1, ref_tree, &ref_root_bh);
5848 if (ret) {
5849 mlog_errno(ret);
5850 goto out;
5851 }
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861 if (!xi->xi_value || xi->xi_value_len <= OCFS2_XATTR_INLINE_SIZE) {
5862
5863 ret = ocfs2_refcounted_xattr_delete_need(inode,
5864 &(*ref_tree)->rf_ci,
5865 ref_root_bh, vb.vb_xv,
5866 meta_add, credits);
5867 if (ret)
5868 mlog_errno(ret);
5869 goto out;
5870 }
5871
5872 ret = ocfs2_refcount_cow_xattr(inode, di, &vb,
5873 *ref_tree, ref_root_bh, 0,
5874 le32_to_cpu(vb.vb_xv->xr_clusters), p);
5875 if (ret)
5876 mlog_errno(ret);
5877
5878 out:
5879 brelse(ref_root_bh);
5880 return ret;
5881 }
5882
5883
5884
5885
5886
5887 static int ocfs2_xattr_value_attach_refcount(struct inode *inode,
5888 struct ocfs2_xattr_value_root *xv,
5889 struct ocfs2_extent_tree *value_et,
5890 struct ocfs2_caching_info *ref_ci,
5891 struct buffer_head *ref_root_bh,
5892 struct ocfs2_cached_dealloc_ctxt *dealloc,
5893 struct ocfs2_post_refcount *refcount)
5894 {
5895 int ret = 0;
5896 u32 clusters = le32_to_cpu(xv->xr_clusters);
5897 u32 cpos, p_cluster, num_clusters;
5898 struct ocfs2_extent_list *el = &xv->xr_list;
5899 unsigned int ext_flags;
5900
5901 cpos = 0;
5902 while (cpos < clusters) {
5903 ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
5904 &num_clusters, el, &ext_flags);
5905 if (ret) {
5906 mlog_errno(ret);
5907 break;
5908 }
5909
5910 cpos += num_clusters;
5911 if ((ext_flags & OCFS2_EXT_REFCOUNTED))
5912 continue;
5913
5914 BUG_ON(!p_cluster);
5915
5916 ret = ocfs2_add_refcount_flag(inode, value_et,
5917 ref_ci, ref_root_bh,
5918 cpos - num_clusters,
5919 p_cluster, num_clusters,
5920 dealloc, refcount);
5921 if (ret) {
5922 mlog_errno(ret);
5923 break;
5924 }
5925 }
5926
5927 return ret;
5928 }
5929
5930
5931
5932
5933
5934
5935 static int ocfs2_xattr_attach_refcount_normal(struct inode *inode,
5936 struct ocfs2_xattr_value_buf *vb,
5937 struct ocfs2_xattr_header *header,
5938 struct ocfs2_caching_info *ref_ci,
5939 struct buffer_head *ref_root_bh,
5940 struct ocfs2_cached_dealloc_ctxt *dealloc)
5941 {
5942
5943 struct ocfs2_xattr_entry *xe;
5944 struct ocfs2_xattr_value_root *xv;
5945 struct ocfs2_extent_tree et;
5946 int i, ret = 0;
5947
5948 for (i = 0; i < le16_to_cpu(header->xh_count); i++) {
5949 xe = &header->xh_entries[i];
5950
5951 if (ocfs2_xattr_is_local(xe))
5952 continue;
5953
5954 xv = (struct ocfs2_xattr_value_root *)((void *)header +
5955 le16_to_cpu(xe->xe_name_offset) +
5956 OCFS2_XATTR_SIZE(xe->xe_name_len));
5957
5958 vb->vb_xv = xv;
5959 ocfs2_init_xattr_value_extent_tree(&et, INODE_CACHE(inode), vb);
5960
5961 ret = ocfs2_xattr_value_attach_refcount(inode, xv, &et,
5962 ref_ci, ref_root_bh,
5963 dealloc, NULL);
5964 if (ret) {
5965 mlog_errno(ret);
5966 break;
5967 }
5968 }
5969
5970 return ret;
5971 }
5972
5973 static int ocfs2_xattr_inline_attach_refcount(struct inode *inode,
5974 struct buffer_head *fe_bh,
5975 struct ocfs2_caching_info *ref_ci,
5976 struct buffer_head *ref_root_bh,
5977 struct ocfs2_cached_dealloc_ctxt *dealloc)
5978 {
5979 struct ocfs2_dinode *di = (struct ocfs2_dinode *)fe_bh->b_data;
5980 struct ocfs2_xattr_header *header = (struct ocfs2_xattr_header *)
5981 (fe_bh->b_data + inode->i_sb->s_blocksize -
5982 le16_to_cpu(di->i_xattr_inline_size));
5983 struct ocfs2_xattr_value_buf vb = {
5984 .vb_bh = fe_bh,
5985 .vb_access = ocfs2_journal_access_di,
5986 };
5987
5988 return ocfs2_xattr_attach_refcount_normal(inode, &vb, header,
5989 ref_ci, ref_root_bh, dealloc);
5990 }
5991
5992 struct ocfs2_xattr_tree_value_refcount_para {
5993 struct ocfs2_caching_info *ref_ci;
5994 struct buffer_head *ref_root_bh;
5995 struct ocfs2_cached_dealloc_ctxt *dealloc;
5996 };
5997
5998 static int ocfs2_get_xattr_tree_value_root(struct super_block *sb,
5999 struct ocfs2_xattr_bucket *bucket,
6000 int offset,
6001 struct ocfs2_xattr_value_root **xv,
6002 struct buffer_head **bh)
6003 {
6004 int ret, block_off, name_offset;
6005 struct ocfs2_xattr_header *xh = bucket_xh(bucket);
6006 struct ocfs2_xattr_entry *xe = &xh->xh_entries[offset];
6007 void *base;
6008
6009 ret = ocfs2_xattr_bucket_get_name_value(sb,
6010 bucket_xh(bucket),
6011 offset,
6012 &block_off,
6013 &name_offset);
6014 if (ret) {
6015 mlog_errno(ret);
6016 goto out;
6017 }
6018
6019 base = bucket_block(bucket, block_off);
6020
6021 *xv = (struct ocfs2_xattr_value_root *)(base + name_offset +
6022 OCFS2_XATTR_SIZE(xe->xe_name_len));
6023
6024 if (bh)
6025 *bh = bucket->bu_bhs[block_off];
6026 out:
6027 return ret;
6028 }
6029
6030
6031
6032
6033
6034 static int ocfs2_xattr_bucket_value_refcount(struct inode *inode,
6035 struct ocfs2_xattr_bucket *bucket,
6036 void *para)
6037 {
6038 int i, ret = 0;
6039 struct ocfs2_extent_tree et;
6040 struct ocfs2_xattr_tree_value_refcount_para *ref =
6041 (struct ocfs2_xattr_tree_value_refcount_para *)para;
6042 struct ocfs2_xattr_header *xh =
6043 (struct ocfs2_xattr_header *)bucket->bu_bhs[0]->b_data;
6044 struct ocfs2_xattr_entry *xe;
6045 struct ocfs2_xattr_value_buf vb = {
6046 .vb_access = ocfs2_journal_access,
6047 };
6048 struct ocfs2_post_refcount refcount = {
6049 .credits = bucket->bu_blocks,
6050 .para = bucket,
6051 .func = ocfs2_xattr_bucket_post_refcount,
6052 };
6053 struct ocfs2_post_refcount *p = NULL;
6054
6055
6056 if (ocfs2_meta_ecc(OCFS2_SB(inode->i_sb)))
6057 p = &refcount;
6058
6059 trace_ocfs2_xattr_bucket_value_refcount(
6060 (unsigned long long)bucket_blkno(bucket),
6061 le16_to_cpu(xh->xh_count));
6062 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) {
6063 xe = &xh->xh_entries[i];
6064
6065 if (ocfs2_xattr_is_local(xe))
6066 continue;
6067
6068 ret = ocfs2_get_xattr_tree_value_root(inode->i_sb, bucket, i,
6069 &vb.vb_xv, &vb.vb_bh);
6070 if (ret) {
6071 mlog_errno(ret);
6072 break;
6073 }
6074
6075 ocfs2_init_xattr_value_extent_tree(&et,
6076 INODE_CACHE(inode), &vb);
6077
6078 ret = ocfs2_xattr_value_attach_refcount(inode, vb.vb_xv,
6079 &et, ref->ref_ci,
6080 ref->ref_root_bh,
6081 ref->dealloc, p);
6082 if (ret) {
6083 mlog_errno(ret);
6084 break;
6085 }
6086 }
6087
6088 return ret;
6089
6090 }
6091
6092 static int ocfs2_refcount_xattr_tree_rec(struct inode *inode,
6093 struct buffer_head *root_bh,
6094 u64 blkno, u32 cpos, u32 len, void *para)
6095 {
6096 return ocfs2_iterate_xattr_buckets(inode, blkno, len,
6097 ocfs2_xattr_bucket_value_refcount,
6098 para);
6099 }
6100
6101 static int ocfs2_xattr_block_attach_refcount(struct inode *inode,
6102 struct buffer_head *blk_bh,
6103 struct ocfs2_caching_info *ref_ci,
6104 struct buffer_head *ref_root_bh,
6105 struct ocfs2_cached_dealloc_ctxt *dealloc)
6106 {
6107 int ret = 0;
6108 struct ocfs2_xattr_block *xb =
6109 (struct ocfs2_xattr_block *)blk_bh->b_data;
6110
6111 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
6112 struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header;
6113 struct ocfs2_xattr_value_buf vb = {
6114 .vb_bh = blk_bh,
6115 .vb_access = ocfs2_journal_access_xb,
6116 };
6117
6118 ret = ocfs2_xattr_attach_refcount_normal(inode, &vb, header,
6119 ref_ci, ref_root_bh,
6120 dealloc);
6121 } else {
6122 struct ocfs2_xattr_tree_value_refcount_para para = {
6123 .ref_ci = ref_ci,
6124 .ref_root_bh = ref_root_bh,
6125 .dealloc = dealloc,
6126 };
6127
6128 ret = ocfs2_iterate_xattr_index_block(inode, blk_bh,
6129 ocfs2_refcount_xattr_tree_rec,
6130 ¶);
6131 }
6132
6133 return ret;
6134 }
6135
6136 int ocfs2_xattr_attach_refcount_tree(struct inode *inode,
6137 struct buffer_head *fe_bh,
6138 struct ocfs2_caching_info *ref_ci,
6139 struct buffer_head *ref_root_bh,
6140 struct ocfs2_cached_dealloc_ctxt *dealloc)
6141 {
6142 int ret = 0;
6143 struct ocfs2_inode_info *oi = OCFS2_I(inode);
6144 struct ocfs2_dinode *di = (struct ocfs2_dinode *)fe_bh->b_data;
6145 struct buffer_head *blk_bh = NULL;
6146
6147 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) {
6148 ret = ocfs2_xattr_inline_attach_refcount(inode, fe_bh,
6149 ref_ci, ref_root_bh,
6150 dealloc);
6151 if (ret) {
6152 mlog_errno(ret);
6153 goto out;
6154 }
6155 }
6156
6157 if (!di->i_xattr_loc)
6158 goto out;
6159
6160 ret = ocfs2_read_xattr_block(inode, le64_to_cpu(di->i_xattr_loc),
6161 &blk_bh);
6162 if (ret < 0) {
6163 mlog_errno(ret);
6164 goto out;
6165 }
6166
6167 ret = ocfs2_xattr_block_attach_refcount(inode, blk_bh, ref_ci,
6168 ref_root_bh, dealloc);
6169 if (ret)
6170 mlog_errno(ret);
6171
6172 brelse(blk_bh);
6173 out:
6174
6175 return ret;
6176 }
6177
6178 typedef int (should_xattr_reflinked)(struct ocfs2_xattr_entry *xe);
6179
6180
6181
6182
6183 struct ocfs2_xattr_reflink {
6184 struct inode *old_inode;
6185 struct inode *new_inode;
6186 struct buffer_head *old_bh;
6187 struct buffer_head *new_bh;
6188 struct ocfs2_caching_info *ref_ci;
6189 struct buffer_head *ref_root_bh;
6190 struct ocfs2_cached_dealloc_ctxt *dealloc;
6191 should_xattr_reflinked *xattr_reflinked;
6192 };
6193
6194
6195
6196
6197
6198
6199 typedef int (get_xattr_value_root)(struct super_block *sb,
6200 struct buffer_head *bh,
6201 struct ocfs2_xattr_header *xh,
6202 int offset,
6203 struct ocfs2_xattr_value_root **xv,
6204 struct buffer_head **ret_bh,
6205 void *para);
6206
6207
6208
6209
6210
6211
6212 static int ocfs2_value_metas_in_xattr_header(struct super_block *sb,
6213 struct buffer_head *bh,
6214 struct ocfs2_xattr_header *xh,
6215 int *metas, int *credits,
6216 int *num_recs,
6217 get_xattr_value_root *func,
6218 void *para)
6219 {
6220 int i, ret = 0;
6221 struct ocfs2_xattr_value_root *xv;
6222 struct ocfs2_xattr_entry *xe;
6223
6224 for (i = 0; i < le16_to_cpu(xh->xh_count); i++) {
6225 xe = &xh->xh_entries[i];
6226 if (ocfs2_xattr_is_local(xe))
6227 continue;
6228
6229 ret = func(sb, bh, xh, i, &xv, NULL, para);
6230 if (ret) {
6231 mlog_errno(ret);
6232 break;
6233 }
6234
6235 *metas += le16_to_cpu(xv->xr_list.l_tree_depth) *
6236 le16_to_cpu(xv->xr_list.l_next_free_rec);
6237
6238 *credits += ocfs2_calc_extend_credits(sb,
6239 &def_xv.xv.xr_list);
6240
6241
6242
6243
6244
6245 if (!xv->xr_list.l_tree_depth)
6246 *num_recs += le16_to_cpu(xv->xr_list.l_next_free_rec);
6247 else
6248 *num_recs += ocfs2_clusters_for_bytes(sb,
6249 XATTR_SIZE_MAX);
6250 }
6251
6252 return ret;
6253 }
6254
6255
6256 static int ocfs2_get_xattr_value_root(struct super_block *sb,
6257 struct buffer_head *bh,
6258 struct ocfs2_xattr_header *xh,
6259 int offset,
6260 struct ocfs2_xattr_value_root **xv,
6261 struct buffer_head **ret_bh,
6262 void *para)
6263 {
6264 struct ocfs2_xattr_entry *xe = &xh->xh_entries[offset];
6265
6266 *xv = (struct ocfs2_xattr_value_root *)((void *)xh +
6267 le16_to_cpu(xe->xe_name_offset) +
6268 OCFS2_XATTR_SIZE(xe->xe_name_len));
6269
6270 if (ret_bh)
6271 *ret_bh = bh;
6272
6273 return 0;
6274 }
6275
6276
6277
6278
6279
6280 static int ocfs2_reflink_lock_xattr_allocators(struct ocfs2_super *osb,
6281 struct ocfs2_xattr_header *xh,
6282 struct buffer_head *ref_root_bh,
6283 int *credits,
6284 struct ocfs2_alloc_context **meta_ac)
6285 {
6286 int ret, meta_add = 0, num_recs = 0;
6287 struct ocfs2_refcount_block *rb =
6288 (struct ocfs2_refcount_block *)ref_root_bh->b_data;
6289
6290 *credits = 0;
6291
6292 ret = ocfs2_value_metas_in_xattr_header(osb->sb, NULL, xh,
6293 &meta_add, credits, &num_recs,
6294 ocfs2_get_xattr_value_root,
6295 NULL);
6296 if (ret) {
6297 mlog_errno(ret);
6298 goto out;
6299 }
6300
6301
6302
6303
6304
6305
6306
6307
6308 num_recs = num_recs / ocfs2_refcount_recs_per_rb(osb->sb) * 2;
6309 meta_add += num_recs;
6310 *credits += num_recs + num_recs * OCFS2_EXPAND_REFCOUNT_TREE_CREDITS;
6311 if (le32_to_cpu(rb->rf_flags) & OCFS2_REFCOUNT_TREE_FL)
6312 *credits += le16_to_cpu(rb->rf_list.l_tree_depth) *
6313 le16_to_cpu(rb->rf_list.l_next_free_rec) + 1;
6314 else
6315 *credits += 1;
6316
6317 ret = ocfs2_reserve_new_metadata_blocks(osb, meta_add, meta_ac);
6318 if (ret)
6319 mlog_errno(ret);
6320
6321 out:
6322 return ret;
6323 }
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336 static int ocfs2_reflink_xattr_header(handle_t *handle,
6337 struct ocfs2_xattr_reflink *args,
6338 struct buffer_head *old_bh,
6339 struct ocfs2_xattr_header *xh,
6340 struct buffer_head *new_bh,
6341 struct ocfs2_xattr_header *new_xh,
6342 struct ocfs2_xattr_value_buf *vb,
6343 struct ocfs2_alloc_context *meta_ac,
6344 get_xattr_value_root *func,
6345 void *para)
6346 {
6347 int ret = 0, i, j;
6348 struct super_block *sb = args->old_inode->i_sb;
6349 struct buffer_head *value_bh;
6350 struct ocfs2_xattr_entry *xe, *last;
6351 struct ocfs2_xattr_value_root *xv, *new_xv;
6352 struct ocfs2_extent_tree data_et;
6353 u32 clusters, cpos, p_cluster, num_clusters;
6354 unsigned int ext_flags = 0;
6355
6356 trace_ocfs2_reflink_xattr_header((unsigned long long)old_bh->b_blocknr,
6357 le16_to_cpu(xh->xh_count));
6358
6359 last = &new_xh->xh_entries[le16_to_cpu(new_xh->xh_count)];
6360 for (i = 0, j = 0; i < le16_to_cpu(xh->xh_count); i++, j++) {
6361 xe = &xh->xh_entries[i];
6362
6363 if (args->xattr_reflinked && !args->xattr_reflinked(xe)) {
6364 xe = &new_xh->xh_entries[j];
6365
6366 le16_add_cpu(&new_xh->xh_count, -1);
6367 if (new_xh->xh_count) {
6368 memmove(xe, xe + 1,
6369 (void *)last - (void *)xe);
6370 memset(last, 0,
6371 sizeof(struct ocfs2_xattr_entry));
6372 }
6373
6374
6375
6376
6377
6378 j--;
6379 continue;
6380 }
6381
6382 if (ocfs2_xattr_is_local(xe))
6383 continue;
6384
6385 ret = func(sb, old_bh, xh, i, &xv, NULL, para);
6386 if (ret) {
6387 mlog_errno(ret);
6388 break;
6389 }
6390
6391 ret = func(sb, new_bh, new_xh, j, &new_xv, &value_bh, para);
6392 if (ret) {
6393 mlog_errno(ret);
6394 break;
6395 }
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407 if (xv->xr_list.l_tree_depth) {
6408 memcpy(new_xv, &def_xv, OCFS2_XATTR_ROOT_SIZE);
6409 vb->vb_xv = new_xv;
6410 vb->vb_bh = value_bh;
6411 ocfs2_init_xattr_value_extent_tree(&data_et,
6412 INODE_CACHE(args->new_inode), vb);
6413 }
6414
6415 clusters = le32_to_cpu(xv->xr_clusters);
6416 cpos = 0;
6417 while (cpos < clusters) {
6418 ret = ocfs2_xattr_get_clusters(args->old_inode,
6419 cpos,
6420 &p_cluster,
6421 &num_clusters,
6422 &xv->xr_list,
6423 &ext_flags);
6424 if (ret) {
6425 mlog_errno(ret);
6426 goto out;
6427 }
6428
6429 BUG_ON(!p_cluster);
6430
6431 if (xv->xr_list.l_tree_depth) {
6432 ret = ocfs2_insert_extent(handle,
6433 &data_et, cpos,
6434 ocfs2_clusters_to_blocks(
6435 args->old_inode->i_sb,
6436 p_cluster),
6437 num_clusters, ext_flags,
6438 meta_ac);
6439 if (ret) {
6440 mlog_errno(ret);
6441 goto out;
6442 }
6443 }
6444
6445 ret = ocfs2_increase_refcount(handle, args->ref_ci,
6446 args->ref_root_bh,
6447 p_cluster, num_clusters,
6448 meta_ac, args->dealloc);
6449 if (ret) {
6450 mlog_errno(ret);
6451 goto out;
6452 }
6453
6454 cpos += num_clusters;
6455 }
6456 }
6457
6458 out:
6459 return ret;
6460 }
6461
6462 static int ocfs2_reflink_xattr_inline(struct ocfs2_xattr_reflink *args)
6463 {
6464 int ret = 0, credits = 0;
6465 handle_t *handle;
6466 struct ocfs2_super *osb = OCFS2_SB(args->old_inode->i_sb);
6467 struct ocfs2_dinode *di = (struct ocfs2_dinode *)args->old_bh->b_data;
6468 int inline_size = le16_to_cpu(di->i_xattr_inline_size);
6469 int header_off = osb->sb->s_blocksize - inline_size;
6470 struct ocfs2_xattr_header *xh = (struct ocfs2_xattr_header *)
6471 (args->old_bh->b_data + header_off);
6472 struct ocfs2_xattr_header *new_xh = (struct ocfs2_xattr_header *)
6473 (args->new_bh->b_data + header_off);
6474 struct ocfs2_alloc_context *meta_ac = NULL;
6475 struct ocfs2_inode_info *new_oi;
6476 struct ocfs2_dinode *new_di;
6477 struct ocfs2_xattr_value_buf vb = {
6478 .vb_bh = args->new_bh,
6479 .vb_access = ocfs2_journal_access_di,
6480 };
6481
6482 ret = ocfs2_reflink_lock_xattr_allocators(osb, xh, args->ref_root_bh,
6483 &credits, &meta_ac);
6484 if (ret) {
6485 mlog_errno(ret);
6486 goto out;
6487 }
6488
6489 handle = ocfs2_start_trans(osb, credits);
6490 if (IS_ERR(handle)) {
6491 ret = PTR_ERR(handle);
6492 mlog_errno(ret);
6493 goto out;
6494 }
6495
6496 ret = ocfs2_journal_access_di(handle, INODE_CACHE(args->new_inode),
6497 args->new_bh, OCFS2_JOURNAL_ACCESS_WRITE);
6498 if (ret) {
6499 mlog_errno(ret);
6500 goto out_commit;
6501 }
6502
6503 memcpy(args->new_bh->b_data + header_off,
6504 args->old_bh->b_data + header_off, inline_size);
6505
6506 new_di = (struct ocfs2_dinode *)args->new_bh->b_data;
6507 new_di->i_xattr_inline_size = cpu_to_le16(inline_size);
6508
6509 ret = ocfs2_reflink_xattr_header(handle, args, args->old_bh, xh,
6510 args->new_bh, new_xh, &vb, meta_ac,
6511 ocfs2_get_xattr_value_root, NULL);
6512 if (ret) {
6513 mlog_errno(ret);
6514 goto out_commit;
6515 }
6516
6517 new_oi = OCFS2_I(args->new_inode);
6518
6519
6520
6521
6522 if (!(new_oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) &&
6523 !(ocfs2_inode_is_fast_symlink(args->new_inode))) {
6524 struct ocfs2_extent_list *el = &new_di->id2.i_list;
6525 le16_add_cpu(&el->l_count, -(inline_size /
6526 sizeof(struct ocfs2_extent_rec)));
6527 }
6528 spin_lock(&new_oi->ip_lock);
6529 new_oi->ip_dyn_features |= OCFS2_HAS_XATTR_FL | OCFS2_INLINE_XATTR_FL;
6530 new_di->i_dyn_features = cpu_to_le16(new_oi->ip_dyn_features);
6531 spin_unlock(&new_oi->ip_lock);
6532
6533 ocfs2_journal_dirty(handle, args->new_bh);
6534
6535 out_commit:
6536 ocfs2_commit_trans(osb, handle);
6537
6538 out:
6539 if (meta_ac)
6540 ocfs2_free_alloc_context(meta_ac);
6541 return ret;
6542 }
6543
6544 static int ocfs2_create_empty_xattr_block(struct inode *inode,
6545 struct buffer_head *fe_bh,
6546 struct buffer_head **ret_bh,
6547 int indexed)
6548 {
6549 int ret;
6550 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
6551 struct ocfs2_xattr_set_ctxt ctxt;
6552
6553 memset(&ctxt, 0, sizeof(ctxt));
6554 ret = ocfs2_reserve_new_metadata_blocks(osb, 1, &ctxt.meta_ac);
6555 if (ret < 0) {
6556 mlog_errno(ret);
6557 return ret;
6558 }
6559
6560 ctxt.handle = ocfs2_start_trans(osb, OCFS2_XATTR_BLOCK_CREATE_CREDITS);
6561 if (IS_ERR(ctxt.handle)) {
6562 ret = PTR_ERR(ctxt.handle);
6563 mlog_errno(ret);
6564 goto out;
6565 }
6566
6567 trace_ocfs2_create_empty_xattr_block(
6568 (unsigned long long)fe_bh->b_blocknr, indexed);
6569 ret = ocfs2_create_xattr_block(inode, fe_bh, &ctxt, indexed,
6570 ret_bh);
6571 if (ret)
6572 mlog_errno(ret);
6573
6574 ocfs2_commit_trans(osb, ctxt.handle);
6575 out:
6576 ocfs2_free_alloc_context(ctxt.meta_ac);
6577 return ret;
6578 }
6579
6580 static int ocfs2_reflink_xattr_block(struct ocfs2_xattr_reflink *args,
6581 struct buffer_head *blk_bh,
6582 struct buffer_head *new_blk_bh)
6583 {
6584 int ret = 0, credits = 0;
6585 handle_t *handle;
6586 struct ocfs2_inode_info *new_oi = OCFS2_I(args->new_inode);
6587 struct ocfs2_dinode *new_di;
6588 struct ocfs2_super *osb = OCFS2_SB(args->new_inode->i_sb);
6589 int header_off = offsetof(struct ocfs2_xattr_block, xb_attrs.xb_header);
6590 struct ocfs2_xattr_block *xb =
6591 (struct ocfs2_xattr_block *)blk_bh->b_data;
6592 struct ocfs2_xattr_header *xh = &xb->xb_attrs.xb_header;
6593 struct ocfs2_xattr_block *new_xb =
6594 (struct ocfs2_xattr_block *)new_blk_bh->b_data;
6595 struct ocfs2_xattr_header *new_xh = &new_xb->xb_attrs.xb_header;
6596 struct ocfs2_alloc_context *meta_ac;
6597 struct ocfs2_xattr_value_buf vb = {
6598 .vb_bh = new_blk_bh,
6599 .vb_access = ocfs2_journal_access_xb,
6600 };
6601
6602 ret = ocfs2_reflink_lock_xattr_allocators(osb, xh, args->ref_root_bh,
6603 &credits, &meta_ac);
6604 if (ret) {
6605 mlog_errno(ret);
6606 return ret;
6607 }
6608
6609
6610 handle = ocfs2_start_trans(osb, credits + 1);
6611 if (IS_ERR(handle)) {
6612 ret = PTR_ERR(handle);
6613 mlog_errno(ret);
6614 goto out;
6615 }
6616
6617 if (!(new_oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) {
6618 ret = ocfs2_journal_access_di(handle,
6619 INODE_CACHE(args->new_inode),
6620 args->new_bh,
6621 OCFS2_JOURNAL_ACCESS_WRITE);
6622 if (ret) {
6623 mlog_errno(ret);
6624 goto out_commit;
6625 }
6626 }
6627
6628 ret = ocfs2_journal_access_xb(handle, INODE_CACHE(args->new_inode),
6629 new_blk_bh, OCFS2_JOURNAL_ACCESS_WRITE);
6630 if (ret) {
6631 mlog_errno(ret);
6632 goto out_commit;
6633 }
6634
6635 memcpy(new_blk_bh->b_data + header_off, blk_bh->b_data + header_off,
6636 osb->sb->s_blocksize - header_off);
6637
6638 ret = ocfs2_reflink_xattr_header(handle, args, blk_bh, xh,
6639 new_blk_bh, new_xh, &vb, meta_ac,
6640 ocfs2_get_xattr_value_root, NULL);
6641 if (ret) {
6642 mlog_errno(ret);
6643 goto out_commit;
6644 }
6645
6646 ocfs2_journal_dirty(handle, new_blk_bh);
6647
6648 if (!(new_oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) {
6649 new_di = (struct ocfs2_dinode *)args->new_bh->b_data;
6650 spin_lock(&new_oi->ip_lock);
6651 new_oi->ip_dyn_features |= OCFS2_HAS_XATTR_FL;
6652 new_di->i_dyn_features = cpu_to_le16(new_oi->ip_dyn_features);
6653 spin_unlock(&new_oi->ip_lock);
6654
6655 ocfs2_journal_dirty(handle, args->new_bh);
6656 }
6657
6658 out_commit:
6659 ocfs2_commit_trans(osb, handle);
6660
6661 out:
6662 ocfs2_free_alloc_context(meta_ac);
6663 return ret;
6664 }
6665
6666 struct ocfs2_reflink_xattr_tree_args {
6667 struct ocfs2_xattr_reflink *reflink;
6668 struct buffer_head *old_blk_bh;
6669 struct buffer_head *new_blk_bh;
6670 struct ocfs2_xattr_bucket *old_bucket;
6671 struct ocfs2_xattr_bucket *new_bucket;
6672 };
6673
6674
6675
6676
6677
6678
6679
6680 static int ocfs2_get_reflink_xattr_value_root(struct super_block *sb,
6681 struct buffer_head *bh,
6682 struct ocfs2_xattr_header *xh,
6683 int offset,
6684 struct ocfs2_xattr_value_root **xv,
6685 struct buffer_head **ret_bh,
6686 void *para)
6687 {
6688 struct ocfs2_reflink_xattr_tree_args *args =
6689 (struct ocfs2_reflink_xattr_tree_args *)para;
6690 struct ocfs2_xattr_bucket *bucket;
6691
6692 if (bh == args->old_bucket->bu_bhs[0])
6693 bucket = args->old_bucket;
6694 else
6695 bucket = args->new_bucket;
6696
6697 return ocfs2_get_xattr_tree_value_root(sb, bucket, offset,
6698 xv, ret_bh);
6699 }
6700
6701 struct ocfs2_value_tree_metas {
6702 int num_metas;
6703 int credits;
6704 int num_recs;
6705 };
6706
6707 static int ocfs2_value_tree_metas_in_bucket(struct super_block *sb,
6708 struct buffer_head *bh,
6709 struct ocfs2_xattr_header *xh,
6710 int offset,
6711 struct ocfs2_xattr_value_root **xv,
6712 struct buffer_head **ret_bh,
6713 void *para)
6714 {
6715 struct ocfs2_xattr_bucket *bucket =
6716 (struct ocfs2_xattr_bucket *)para;
6717
6718 return ocfs2_get_xattr_tree_value_root(sb, bucket, offset,
6719 xv, ret_bh);
6720 }
6721
6722 static int ocfs2_calc_value_tree_metas(struct inode *inode,
6723 struct ocfs2_xattr_bucket *bucket,
6724 void *para)
6725 {
6726 struct ocfs2_value_tree_metas *metas =
6727 (struct ocfs2_value_tree_metas *)para;
6728 struct ocfs2_xattr_header *xh =
6729 (struct ocfs2_xattr_header *)bucket->bu_bhs[0]->b_data;
6730
6731
6732 metas->credits += bucket->bu_blocks;
6733 return ocfs2_value_metas_in_xattr_header(inode->i_sb, bucket->bu_bhs[0],
6734 xh, &metas->num_metas,
6735 &metas->credits, &metas->num_recs,
6736 ocfs2_value_tree_metas_in_bucket,
6737 bucket);
6738 }
6739
6740
6741
6742
6743
6744
6745 static int ocfs2_lock_reflink_xattr_rec_allocators(
6746 struct ocfs2_reflink_xattr_tree_args *args,
6747 struct ocfs2_extent_tree *xt_et,
6748 u64 blkno, u32 len, int *credits,
6749 struct ocfs2_alloc_context **meta_ac,
6750 struct ocfs2_alloc_context **data_ac)
6751 {
6752 int ret, num_free_extents;
6753 struct ocfs2_value_tree_metas metas;
6754 struct ocfs2_super *osb = OCFS2_SB(args->reflink->old_inode->i_sb);
6755 struct ocfs2_refcount_block *rb;
6756
6757 memset(&metas, 0, sizeof(metas));
6758
6759 ret = ocfs2_iterate_xattr_buckets(args->reflink->old_inode, blkno, len,
6760 ocfs2_calc_value_tree_metas, &metas);
6761 if (ret) {
6762 mlog_errno(ret);
6763 goto out;
6764 }
6765
6766 *credits = metas.credits;
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779 rb = (struct ocfs2_refcount_block *)args->reflink->ref_root_bh->b_data;
6780 metas.num_recs =
6781 (metas.num_recs + ocfs2_refcount_recs_per_rb(osb->sb) - 1) /
6782 ocfs2_refcount_recs_per_rb(osb->sb) * 2;
6783 metas.num_metas += metas.num_recs;
6784 *credits += metas.num_recs +
6785 metas.num_recs * OCFS2_EXPAND_REFCOUNT_TREE_CREDITS;
6786 if (le32_to_cpu(rb->rf_flags) & OCFS2_REFCOUNT_TREE_FL)
6787 *credits += le16_to_cpu(rb->rf_list.l_tree_depth) *
6788 le16_to_cpu(rb->rf_list.l_next_free_rec) + 1;
6789 else
6790 *credits += 1;
6791
6792
6793 num_free_extents = ocfs2_num_free_extents(xt_et);
6794 if (num_free_extents < 0) {
6795 ret = num_free_extents;
6796 mlog_errno(ret);
6797 goto out;
6798 }
6799
6800 if (num_free_extents < len)
6801 metas.num_metas += ocfs2_extend_meta_needed(xt_et->et_root_el);
6802
6803 *credits += ocfs2_calc_extend_credits(osb->sb,
6804 xt_et->et_root_el);
6805
6806 if (metas.num_metas) {
6807 ret = ocfs2_reserve_new_metadata_blocks(osb, metas.num_metas,
6808 meta_ac);
6809 if (ret) {
6810 mlog_errno(ret);
6811 goto out;
6812 }
6813 }
6814
6815 if (len) {
6816 ret = ocfs2_reserve_clusters(osb, len, data_ac);
6817 if (ret)
6818 mlog_errno(ret);
6819 }
6820 out:
6821 if (ret) {
6822 if (*meta_ac) {
6823 ocfs2_free_alloc_context(*meta_ac);
6824 *meta_ac = NULL;
6825 }
6826 }
6827
6828 return ret;
6829 }
6830
6831 static int ocfs2_reflink_xattr_bucket(handle_t *handle,
6832 u64 blkno, u64 new_blkno, u32 clusters,
6833 u32 *cpos, int num_buckets,
6834 struct ocfs2_alloc_context *meta_ac,
6835 struct ocfs2_alloc_context *data_ac,
6836 struct ocfs2_reflink_xattr_tree_args *args)
6837 {
6838 int i, j, ret = 0;
6839 struct super_block *sb = args->reflink->old_inode->i_sb;
6840 int bpb = args->old_bucket->bu_blocks;
6841 struct ocfs2_xattr_value_buf vb = {
6842 .vb_access = ocfs2_journal_access,
6843 };
6844
6845 for (i = 0; i < num_buckets; i++, blkno += bpb, new_blkno += bpb) {
6846 ret = ocfs2_read_xattr_bucket(args->old_bucket, blkno);
6847 if (ret) {
6848 mlog_errno(ret);
6849 break;
6850 }
6851
6852 ret = ocfs2_init_xattr_bucket(args->new_bucket, new_blkno, 1);
6853 if (ret) {
6854 mlog_errno(ret);
6855 break;
6856 }
6857
6858 ret = ocfs2_xattr_bucket_journal_access(handle,
6859 args->new_bucket,
6860 OCFS2_JOURNAL_ACCESS_CREATE);
6861 if (ret) {
6862 mlog_errno(ret);
6863 break;
6864 }
6865
6866 for (j = 0; j < bpb; j++)
6867 memcpy(bucket_block(args->new_bucket, j),
6868 bucket_block(args->old_bucket, j),
6869 sb->s_blocksize);
6870
6871
6872
6873
6874
6875
6876 if (i == 0) {
6877 *cpos = le32_to_cpu(bucket_xh(args->new_bucket)->
6878 xh_entries[0].xe_name_hash);
6879 bucket_xh(args->new_bucket)->xh_num_buckets =
6880 cpu_to_le16(num_buckets);
6881 }
6882
6883 ocfs2_xattr_bucket_journal_dirty(handle, args->new_bucket);
6884
6885 ret = ocfs2_reflink_xattr_header(handle, args->reflink,
6886 args->old_bucket->bu_bhs[0],
6887 bucket_xh(args->old_bucket),
6888 args->new_bucket->bu_bhs[0],
6889 bucket_xh(args->new_bucket),
6890 &vb, meta_ac,
6891 ocfs2_get_reflink_xattr_value_root,
6892 args);
6893 if (ret) {
6894 mlog_errno(ret);
6895 break;
6896 }
6897
6898
6899
6900
6901
6902
6903 ret = ocfs2_xattr_bucket_journal_access(handle,
6904 args->new_bucket,
6905 OCFS2_JOURNAL_ACCESS_WRITE);
6906 if (ret) {
6907 mlog_errno(ret);
6908 break;
6909 }
6910
6911 ocfs2_xattr_bucket_journal_dirty(handle, args->new_bucket);
6912
6913 ocfs2_xattr_bucket_relse(args->old_bucket);
6914 ocfs2_xattr_bucket_relse(args->new_bucket);
6915 }
6916
6917 ocfs2_xattr_bucket_relse(args->old_bucket);
6918 ocfs2_xattr_bucket_relse(args->new_bucket);
6919 return ret;
6920 }
6921
6922 static int ocfs2_reflink_xattr_buckets(handle_t *handle,
6923 struct inode *inode,
6924 struct ocfs2_reflink_xattr_tree_args *args,
6925 struct ocfs2_extent_tree *et,
6926 struct ocfs2_alloc_context *meta_ac,
6927 struct ocfs2_alloc_context *data_ac,
6928 u64 blkno, u32 cpos, u32 len)
6929 {
6930 int ret, first_inserted = 0;
6931 u32 p_cluster, num_clusters, reflink_cpos = 0;
6932 u64 new_blkno;
6933 unsigned int num_buckets, reflink_buckets;
6934 unsigned int bpc =
6935 ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb));
6936
6937 ret = ocfs2_read_xattr_bucket(args->old_bucket, blkno);
6938 if (ret) {
6939 mlog_errno(ret);
6940 goto out;
6941 }
6942 num_buckets = le16_to_cpu(bucket_xh(args->old_bucket)->xh_num_buckets);
6943 ocfs2_xattr_bucket_relse(args->old_bucket);
6944
6945 while (len && num_buckets) {
6946 ret = ocfs2_claim_clusters(handle, data_ac,
6947 1, &p_cluster, &num_clusters);
6948 if (ret) {
6949 mlog_errno(ret);
6950 goto out;
6951 }
6952
6953 new_blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster);
6954 reflink_buckets = min(num_buckets, bpc * num_clusters);
6955
6956 ret = ocfs2_reflink_xattr_bucket(handle, blkno,
6957 new_blkno, num_clusters,
6958 &reflink_cpos, reflink_buckets,
6959 meta_ac, data_ac, args);
6960 if (ret) {
6961 mlog_errno(ret);
6962 goto out;
6963 }
6964
6965
6966
6967
6968
6969
6970 if (!first_inserted) {
6971 reflink_cpos = cpos;
6972 first_inserted = 1;
6973 }
6974 ret = ocfs2_insert_extent(handle, et, reflink_cpos, new_blkno,
6975 num_clusters, 0, meta_ac);
6976 if (ret)
6977 mlog_errno(ret);
6978
6979 trace_ocfs2_reflink_xattr_buckets((unsigned long long)new_blkno,
6980 num_clusters, reflink_cpos);
6981
6982 len -= num_clusters;
6983 blkno += ocfs2_clusters_to_blocks(inode->i_sb, num_clusters);
6984 num_buckets -= reflink_buckets;
6985 }
6986 out:
6987 return ret;
6988 }
6989
6990
6991
6992
6993 static int ocfs2_reflink_xattr_rec(struct inode *inode,
6994 struct buffer_head *root_bh,
6995 u64 blkno,
6996 u32 cpos,
6997 u32 len,
6998 void *para)
6999 {
7000 int ret, credits = 0;
7001 handle_t *handle;
7002 struct ocfs2_reflink_xattr_tree_args *args =
7003 (struct ocfs2_reflink_xattr_tree_args *)para;
7004 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
7005 struct ocfs2_alloc_context *meta_ac = NULL;
7006 struct ocfs2_alloc_context *data_ac = NULL;
7007 struct ocfs2_extent_tree et;
7008
7009 trace_ocfs2_reflink_xattr_rec((unsigned long long)blkno, len);
7010
7011 ocfs2_init_xattr_tree_extent_tree(&et,
7012 INODE_CACHE(args->reflink->new_inode),
7013 args->new_blk_bh);
7014
7015 ret = ocfs2_lock_reflink_xattr_rec_allocators(args, &et, blkno,
7016 len, &credits,
7017 &meta_ac, &data_ac);
7018 if (ret) {
7019 mlog_errno(ret);
7020 goto out;
7021 }
7022
7023 handle = ocfs2_start_trans(osb, credits);
7024 if (IS_ERR(handle)) {
7025 ret = PTR_ERR(handle);
7026 mlog_errno(ret);
7027 goto out;
7028 }
7029
7030 ret = ocfs2_reflink_xattr_buckets(handle, inode, args, &et,
7031 meta_ac, data_ac,
7032 blkno, cpos, len);
7033 if (ret)
7034 mlog_errno(ret);
7035
7036 ocfs2_commit_trans(osb, handle);
7037
7038 out:
7039 if (meta_ac)
7040 ocfs2_free_alloc_context(meta_ac);
7041 if (data_ac)
7042 ocfs2_free_alloc_context(data_ac);
7043 return ret;
7044 }
7045
7046
7047
7048
7049
7050
7051 static int ocfs2_reflink_xattr_tree(struct ocfs2_xattr_reflink *args,
7052 struct buffer_head *blk_bh,
7053 struct buffer_head *new_blk_bh)
7054 {
7055 int ret;
7056 struct ocfs2_reflink_xattr_tree_args para;
7057
7058 memset(¶, 0, sizeof(para));
7059 para.reflink = args;
7060 para.old_blk_bh = blk_bh;
7061 para.new_blk_bh = new_blk_bh;
7062
7063 para.old_bucket = ocfs2_xattr_bucket_new(args->old_inode);
7064 if (!para.old_bucket) {
7065 mlog_errno(-ENOMEM);
7066 return -ENOMEM;
7067 }
7068
7069 para.new_bucket = ocfs2_xattr_bucket_new(args->new_inode);
7070 if (!para.new_bucket) {
7071 ret = -ENOMEM;
7072 mlog_errno(ret);
7073 goto out;
7074 }
7075
7076 ret = ocfs2_iterate_xattr_index_block(args->old_inode, blk_bh,
7077 ocfs2_reflink_xattr_rec,
7078 ¶);
7079 if (ret)
7080 mlog_errno(ret);
7081
7082 out:
7083 ocfs2_xattr_bucket_free(para.old_bucket);
7084 ocfs2_xattr_bucket_free(para.new_bucket);
7085 return ret;
7086 }
7087
7088 static int ocfs2_reflink_xattr_in_block(struct ocfs2_xattr_reflink *args,
7089 struct buffer_head *blk_bh)
7090 {
7091 int ret, indexed = 0;
7092 struct buffer_head *new_blk_bh = NULL;
7093 struct ocfs2_xattr_block *xb =
7094 (struct ocfs2_xattr_block *)blk_bh->b_data;
7095
7096
7097 if (le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)
7098 indexed = 1;
7099
7100 ret = ocfs2_create_empty_xattr_block(args->new_inode, args->new_bh,
7101 &new_blk_bh, indexed);
7102 if (ret) {
7103 mlog_errno(ret);
7104 goto out;
7105 }
7106
7107 if (!indexed)
7108 ret = ocfs2_reflink_xattr_block(args, blk_bh, new_blk_bh);
7109 else
7110 ret = ocfs2_reflink_xattr_tree(args, blk_bh, new_blk_bh);
7111 if (ret)
7112 mlog_errno(ret);
7113
7114 out:
7115 brelse(new_blk_bh);
7116 return ret;
7117 }
7118
7119 static int ocfs2_reflink_xattr_no_security(struct ocfs2_xattr_entry *xe)
7120 {
7121 int type = ocfs2_xattr_get_type(xe);
7122
7123 return type != OCFS2_XATTR_INDEX_SECURITY &&
7124 type != OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS &&
7125 type != OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT;
7126 }
7127
7128 int ocfs2_reflink_xattrs(struct inode *old_inode,
7129 struct buffer_head *old_bh,
7130 struct inode *new_inode,
7131 struct buffer_head *new_bh,
7132 bool preserve_security)
7133 {
7134 int ret;
7135 struct ocfs2_xattr_reflink args;
7136 struct ocfs2_inode_info *oi = OCFS2_I(old_inode);
7137 struct ocfs2_dinode *di = (struct ocfs2_dinode *)old_bh->b_data;
7138 struct buffer_head *blk_bh = NULL;
7139 struct ocfs2_cached_dealloc_ctxt dealloc;
7140 struct ocfs2_refcount_tree *ref_tree;
7141 struct buffer_head *ref_root_bh = NULL;
7142
7143 ret = ocfs2_lock_refcount_tree(OCFS2_SB(old_inode->i_sb),
7144 le64_to_cpu(di->i_refcount_loc),
7145 1, &ref_tree, &ref_root_bh);
7146 if (ret) {
7147 mlog_errno(ret);
7148 goto out;
7149 }
7150
7151 ocfs2_init_dealloc_ctxt(&dealloc);
7152
7153 args.old_inode = old_inode;
7154 args.new_inode = new_inode;
7155 args.old_bh = old_bh;
7156 args.new_bh = new_bh;
7157 args.ref_ci = &ref_tree->rf_ci;
7158 args.ref_root_bh = ref_root_bh;
7159 args.dealloc = &dealloc;
7160 if (preserve_security)
7161 args.xattr_reflinked = NULL;
7162 else
7163 args.xattr_reflinked = ocfs2_reflink_xattr_no_security;
7164
7165 if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) {
7166 ret = ocfs2_reflink_xattr_inline(&args);
7167 if (ret) {
7168 mlog_errno(ret);
7169 goto out_unlock;
7170 }
7171 }
7172
7173 if (!di->i_xattr_loc)
7174 goto out_unlock;
7175
7176 ret = ocfs2_read_xattr_block(old_inode, le64_to_cpu(di->i_xattr_loc),
7177 &blk_bh);
7178 if (ret < 0) {
7179 mlog_errno(ret);
7180 goto out_unlock;
7181 }
7182
7183 ret = ocfs2_reflink_xattr_in_block(&args, blk_bh);
7184 if (ret)
7185 mlog_errno(ret);
7186
7187 brelse(blk_bh);
7188
7189 out_unlock:
7190 ocfs2_unlock_refcount_tree(OCFS2_SB(old_inode->i_sb),
7191 ref_tree, 1);
7192 brelse(ref_root_bh);
7193
7194 if (ocfs2_dealloc_has_cluster(&dealloc)) {
7195 ocfs2_schedule_truncate_log_flush(OCFS2_SB(old_inode->i_sb), 1);
7196 ocfs2_run_deallocs(OCFS2_SB(old_inode->i_sb), &dealloc);
7197 }
7198
7199 out:
7200 return ret;
7201 }
7202
7203
7204
7205
7206
7207
7208
7209
7210 int ocfs2_init_security_and_acl(struct inode *dir,
7211 struct inode *inode,
7212 const struct qstr *qstr)
7213 {
7214 int ret = 0;
7215 struct buffer_head *dir_bh = NULL;
7216
7217 ret = ocfs2_init_security_get(inode, dir, qstr, NULL);
7218 if (ret) {
7219 mlog_errno(ret);
7220 goto leave;
7221 }
7222
7223 ret = ocfs2_inode_lock(dir, &dir_bh, 0);
7224 if (ret) {
7225 mlog_errno(ret);
7226 goto leave;
7227 }
7228 ret = ocfs2_init_acl(NULL, inode, dir, NULL, dir_bh, NULL, NULL);
7229 if (ret)
7230 mlog_errno(ret);
7231
7232 ocfs2_inode_unlock(dir, 0);
7233 brelse(dir_bh);
7234 leave:
7235 return ret;
7236 }
7237
7238
7239
7240
7241 static int ocfs2_xattr_security_get(const struct xattr_handler *handler,
7242 struct dentry *unused, struct inode *inode,
7243 const char *name, void *buffer, size_t size)
7244 {
7245 return ocfs2_xattr_get(inode, OCFS2_XATTR_INDEX_SECURITY,
7246 name, buffer, size);
7247 }
7248
7249 static int ocfs2_xattr_security_set(const struct xattr_handler *handler,
7250 struct user_namespace *mnt_userns,
7251 struct dentry *unused, struct inode *inode,
7252 const char *name, const void *value,
7253 size_t size, int flags)
7254 {
7255 return ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_SECURITY,
7256 name, value, size, flags);
7257 }
7258
7259 static int ocfs2_initxattrs(struct inode *inode, const struct xattr *xattr_array,
7260 void *fs_info)
7261 {
7262 const struct xattr *xattr;
7263 int err = 0;
7264
7265 for (xattr = xattr_array; xattr->name != NULL; xattr++) {
7266 err = ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_SECURITY,
7267 xattr->name, xattr->value,
7268 xattr->value_len, XATTR_CREATE);
7269 if (err)
7270 break;
7271 }
7272 return err;
7273 }
7274
7275 int ocfs2_init_security_get(struct inode *inode,
7276 struct inode *dir,
7277 const struct qstr *qstr,
7278 struct ocfs2_security_xattr_info *si)
7279 {
7280
7281 if (!ocfs2_supports_xattr(OCFS2_SB(dir->i_sb)))
7282 return -EOPNOTSUPP;
7283 if (si)
7284 return security_old_inode_init_security(inode, dir, qstr,
7285 &si->name, &si->value,
7286 &si->value_len);
7287
7288 return security_inode_init_security(inode, dir, qstr,
7289 &ocfs2_initxattrs, NULL);
7290 }
7291
7292 int ocfs2_init_security_set(handle_t *handle,
7293 struct inode *inode,
7294 struct buffer_head *di_bh,
7295 struct ocfs2_security_xattr_info *si,
7296 struct ocfs2_alloc_context *xattr_ac,
7297 struct ocfs2_alloc_context *data_ac)
7298 {
7299 return ocfs2_xattr_set_handle(handle, inode, di_bh,
7300 OCFS2_XATTR_INDEX_SECURITY,
7301 si->name, si->value, si->value_len, 0,
7302 xattr_ac, data_ac);
7303 }
7304
7305 const struct xattr_handler ocfs2_xattr_security_handler = {
7306 .prefix = XATTR_SECURITY_PREFIX,
7307 .get = ocfs2_xattr_security_get,
7308 .set = ocfs2_xattr_security_set,
7309 };
7310
7311
7312
7313
7314 static int ocfs2_xattr_trusted_get(const struct xattr_handler *handler,
7315 struct dentry *unused, struct inode *inode,
7316 const char *name, void *buffer, size_t size)
7317 {
7318 return ocfs2_xattr_get(inode, OCFS2_XATTR_INDEX_TRUSTED,
7319 name, buffer, size);
7320 }
7321
7322 static int ocfs2_xattr_trusted_set(const struct xattr_handler *handler,
7323 struct user_namespace *mnt_userns,
7324 struct dentry *unused, struct inode *inode,
7325 const char *name, const void *value,
7326 size_t size, int flags)
7327 {
7328 return ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_TRUSTED,
7329 name, value, size, flags);
7330 }
7331
7332 const struct xattr_handler ocfs2_xattr_trusted_handler = {
7333 .prefix = XATTR_TRUSTED_PREFIX,
7334 .get = ocfs2_xattr_trusted_get,
7335 .set = ocfs2_xattr_trusted_set,
7336 };
7337
7338
7339
7340
7341 static int ocfs2_xattr_user_get(const struct xattr_handler *handler,
7342 struct dentry *unused, struct inode *inode,
7343 const char *name, void *buffer, size_t size)
7344 {
7345 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
7346
7347 if (osb->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR)
7348 return -EOPNOTSUPP;
7349 return ocfs2_xattr_get(inode, OCFS2_XATTR_INDEX_USER, name,
7350 buffer, size);
7351 }
7352
7353 static int ocfs2_xattr_user_set(const struct xattr_handler *handler,
7354 struct user_namespace *mnt_userns,
7355 struct dentry *unused, struct inode *inode,
7356 const char *name, const void *value,
7357 size_t size, int flags)
7358 {
7359 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
7360
7361 if (osb->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR)
7362 return -EOPNOTSUPP;
7363
7364 return ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_USER,
7365 name, value, size, flags);
7366 }
7367
7368 const struct xattr_handler ocfs2_xattr_user_handler = {
7369 .prefix = XATTR_USER_PREFIX,
7370 .get = ocfs2_xattr_user_get,
7371 .set = ocfs2_xattr_user_set,
7372 };