]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - fs/ocfs2/xattr.c
ocfs2: Add xattr bucket iteration for large numbers of EAs
[linux-2.6-omap-h63xx.git] / fs / ocfs2 / xattr.c
1 /* -*- mode: c; c-basic-offset: 8; -*-
2  * vim: noexpandtab sw=8 ts=8 sts=0:
3  *
4  * xattr.c
5  *
6  * Copyright (C) 2008 Oracle.  All rights reserved.
7  *
8  * CREDITS:
9  * Lots of code in this file is taken from ext3.
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public
22  * License along with this program; if not, write to the
23  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24  * Boston, MA 021110-1307, USA.
25  */
26
27 #include <linux/capability.h>
28 #include <linux/fs.h>
29 #include <linux/types.h>
30 #include <linux/slab.h>
31 #include <linux/highmem.h>
32 #include <linux/pagemap.h>
33 #include <linux/uio.h>
34 #include <linux/sched.h>
35 #include <linux/splice.h>
36 #include <linux/mount.h>
37 #include <linux/writeback.h>
38 #include <linux/falloc.h>
39
40 #define MLOG_MASK_PREFIX ML_XATTR
41 #include <cluster/masklog.h>
42
43 #include "ocfs2.h"
44 #include "alloc.h"
45 #include "dlmglue.h"
46 #include "file.h"
47 #include "symlink.h"
48 #include "sysfile.h"
49 #include "inode.h"
50 #include "journal.h"
51 #include "ocfs2_fs.h"
52 #include "suballoc.h"
53 #include "uptodate.h"
54 #include "buffer_head_io.h"
55 #include "super.h"
56 #include "xattr.h"
57
58
59 struct ocfs2_xattr_def_value_root {
60         struct ocfs2_xattr_value_root   xv;
61         struct ocfs2_extent_rec         er;
62 };
63
64 struct ocfs2_xattr_bucket {
65         struct buffer_head *bhs[OCFS2_XATTR_MAX_BLOCKS_PER_BUCKET];
66         struct ocfs2_xattr_header *xh;
67 };
68
69 #define OCFS2_XATTR_ROOT_SIZE   (sizeof(struct ocfs2_xattr_def_value_root))
70 #define OCFS2_XATTR_INLINE_SIZE 80
71
72 static struct ocfs2_xattr_def_value_root def_xv = {
73         .xv.xr_list.l_count = cpu_to_le16(1),
74 };
75
76 struct xattr_handler *ocfs2_xattr_handlers[] = {
77         &ocfs2_xattr_user_handler,
78         &ocfs2_xattr_trusted_handler,
79         NULL
80 };
81
82 static struct xattr_handler *ocfs2_xattr_handler_map[] = {
83         [OCFS2_XATTR_INDEX_USER]        = &ocfs2_xattr_user_handler,
84         [OCFS2_XATTR_INDEX_TRUSTED]     = &ocfs2_xattr_trusted_handler,
85 };
86
87 struct ocfs2_xattr_info {
88         int name_index;
89         const char *name;
90         const void *value;
91         size_t value_len;
92 };
93
94 struct ocfs2_xattr_search {
95         struct buffer_head *inode_bh;
96         /*
97          * xattr_bh point to the block buffer head which has extended attribute
98          * when extended attribute in inode, xattr_bh is equal to inode_bh.
99          */
100         struct buffer_head *xattr_bh;
101         struct ocfs2_xattr_header *header;
102         void *base;
103         void *end;
104         struct ocfs2_xattr_entry *here;
105         int not_found;
106 };
107
108 static int ocfs2_xattr_tree_list_index_block(struct inode *inode,
109                                         struct ocfs2_xattr_tree_root *xt,
110                                         char *buffer,
111                                         size_t buffer_size);
112
113 static inline struct xattr_handler *ocfs2_xattr_handler(int name_index)
114 {
115         struct xattr_handler *handler = NULL;
116
117         if (name_index > 0 && name_index < OCFS2_XATTR_MAX)
118                 handler = ocfs2_xattr_handler_map[name_index];
119
120         return handler;
121 }
122
123 static inline u32 ocfs2_xattr_name_hash(struct inode *inode,
124                                         char *prefix,
125                                         int prefix_len,
126                                         char *name,
127                                         int name_len)
128 {
129         /* Get hash value of uuid from super block */
130         u32 hash = OCFS2_SB(inode->i_sb)->uuid_hash;
131         int i;
132
133         /* hash extended attribute prefix */
134         for (i = 0; i < prefix_len; i++) {
135                 hash = (hash << OCFS2_HASH_SHIFT) ^
136                        (hash >> (8*sizeof(hash) - OCFS2_HASH_SHIFT)) ^
137                        *prefix++;
138         }
139         /* hash extended attribute name */
140         for (i = 0; i < name_len; i++) {
141                 hash = (hash << OCFS2_HASH_SHIFT) ^
142                        (hash >> (8*sizeof(hash) - OCFS2_HASH_SHIFT)) ^
143                        *name++;
144         }
145
146         return hash;
147 }
148
149 /*
150  * ocfs2_xattr_hash_entry()
151  *
152  * Compute the hash of an extended attribute.
153  */
154 static void ocfs2_xattr_hash_entry(struct inode *inode,
155                                    struct ocfs2_xattr_header *header,
156                                    struct ocfs2_xattr_entry *entry)
157 {
158         u32 hash = 0;
159         struct xattr_handler *handler =
160                         ocfs2_xattr_handler(ocfs2_xattr_get_type(entry));
161         char *prefix = handler->prefix;
162         char *name = (char *)header + le16_to_cpu(entry->xe_name_offset);
163         int prefix_len = strlen(handler->prefix);
164
165         hash = ocfs2_xattr_name_hash(inode, prefix, prefix_len, name,
166                                      entry->xe_name_len);
167         entry->xe_name_hash = cpu_to_le32(hash);
168
169         return;
170 }
171
172 static int ocfs2_xattr_extend_allocation(struct inode *inode,
173                                          u32 clusters_to_add,
174                                          struct buffer_head *xattr_bh,
175                                          struct ocfs2_xattr_value_root *xv)
176 {
177         int status = 0;
178         int restart_func = 0;
179         int credits = 0;
180         handle_t *handle = NULL;
181         struct ocfs2_alloc_context *data_ac = NULL;
182         struct ocfs2_alloc_context *meta_ac = NULL;
183         enum ocfs2_alloc_restarted why;
184         struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
185         struct ocfs2_extent_list *root_el = &xv->xr_list;
186         u32 prev_clusters, logical_start = le32_to_cpu(xv->xr_clusters);
187
188         mlog(0, "(clusters_to_add for xattr= %u)\n", clusters_to_add);
189
190 restart_all:
191
192         status = ocfs2_lock_allocators(inode, xattr_bh, root_el,
193                                        clusters_to_add, 0, &data_ac,
194                                        &meta_ac, OCFS2_XATTR_VALUE_EXTENT, xv);
195         if (status) {
196                 mlog_errno(status);
197                 goto leave;
198         }
199
200         credits = ocfs2_calc_extend_credits(osb->sb, root_el, clusters_to_add);
201         handle = ocfs2_start_trans(osb, credits);
202         if (IS_ERR(handle)) {
203                 status = PTR_ERR(handle);
204                 handle = NULL;
205                 mlog_errno(status);
206                 goto leave;
207         }
208
209 restarted_transaction:
210         status = ocfs2_journal_access(handle, inode, xattr_bh,
211                                       OCFS2_JOURNAL_ACCESS_WRITE);
212         if (status < 0) {
213                 mlog_errno(status);
214                 goto leave;
215         }
216
217         prev_clusters = le32_to_cpu(xv->xr_clusters);
218         status = ocfs2_add_clusters_in_btree(osb,
219                                              inode,
220                                              &logical_start,
221                                              clusters_to_add,
222                                              0,
223                                              xattr_bh,
224                                              root_el,
225                                              handle,
226                                              data_ac,
227                                              meta_ac,
228                                              &why,
229                                              OCFS2_XATTR_VALUE_EXTENT,
230                                              xv);
231         if ((status < 0) && (status != -EAGAIN)) {
232                 if (status != -ENOSPC)
233                         mlog_errno(status);
234                 goto leave;
235         }
236
237         status = ocfs2_journal_dirty(handle, xattr_bh);
238         if (status < 0) {
239                 mlog_errno(status);
240                 goto leave;
241         }
242
243         clusters_to_add -= le32_to_cpu(xv->xr_clusters) - prev_clusters;
244
245         if (why != RESTART_NONE && clusters_to_add) {
246                 if (why == RESTART_META) {
247                         mlog(0, "restarting function.\n");
248                         restart_func = 1;
249                 } else {
250                         BUG_ON(why != RESTART_TRANS);
251
252                         mlog(0, "restarting transaction.\n");
253                         /* TODO: This can be more intelligent. */
254                         credits = ocfs2_calc_extend_credits(osb->sb,
255                                                             root_el,
256                                                             clusters_to_add);
257                         status = ocfs2_extend_trans(handle, credits);
258                         if (status < 0) {
259                                 /* handle still has to be committed at
260                                  * this point. */
261                                 status = -ENOMEM;
262                                 mlog_errno(status);
263                                 goto leave;
264                         }
265                         goto restarted_transaction;
266                 }
267         }
268
269 leave:
270         if (handle) {
271                 ocfs2_commit_trans(osb, handle);
272                 handle = NULL;
273         }
274         if (data_ac) {
275                 ocfs2_free_alloc_context(data_ac);
276                 data_ac = NULL;
277         }
278         if (meta_ac) {
279                 ocfs2_free_alloc_context(meta_ac);
280                 meta_ac = NULL;
281         }
282         if ((!status) && restart_func) {
283                 restart_func = 0;
284                 goto restart_all;
285         }
286
287         return status;
288 }
289
290 static int __ocfs2_remove_xattr_range(struct inode *inode,
291                                       struct buffer_head *root_bh,
292                                       struct ocfs2_xattr_value_root *xv,
293                                       u32 cpos, u32 phys_cpos, u32 len,
294                                       struct ocfs2_cached_dealloc_ctxt *dealloc)
295 {
296         int ret;
297         u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos);
298         struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
299         struct inode *tl_inode = osb->osb_tl_inode;
300         handle_t *handle;
301         struct ocfs2_alloc_context *meta_ac = NULL;
302
303         ret = ocfs2_lock_allocators(inode, root_bh, &xv->xr_list,
304                                     0, 1, NULL, &meta_ac,
305                                     OCFS2_XATTR_VALUE_EXTENT, xv);
306         if (ret) {
307                 mlog_errno(ret);
308                 return ret;
309         }
310
311         mutex_lock(&tl_inode->i_mutex);
312
313         if (ocfs2_truncate_log_needs_flush(osb)) {
314                 ret = __ocfs2_flush_truncate_log(osb);
315                 if (ret < 0) {
316                         mlog_errno(ret);
317                         goto out;
318                 }
319         }
320
321         handle = ocfs2_start_trans(osb, OCFS2_REMOVE_EXTENT_CREDITS);
322         if (IS_ERR(handle)) {
323                 ret = PTR_ERR(handle);
324                 mlog_errno(ret);
325                 goto out;
326         }
327
328         ret = ocfs2_journal_access(handle, inode, root_bh,
329                                    OCFS2_JOURNAL_ACCESS_WRITE);
330         if (ret) {
331                 mlog_errno(ret);
332                 goto out_commit;
333         }
334
335         ret = ocfs2_remove_extent(inode, root_bh, cpos, len, handle, meta_ac,
336                                   dealloc, OCFS2_XATTR_VALUE_EXTENT, xv);
337         if (ret) {
338                 mlog_errno(ret);
339                 goto out_commit;
340         }
341
342         le32_add_cpu(&xv->xr_clusters, -len);
343
344         ret = ocfs2_journal_dirty(handle, root_bh);
345         if (ret) {
346                 mlog_errno(ret);
347                 goto out_commit;
348         }
349
350         ret = ocfs2_truncate_log_append(osb, handle, phys_blkno, len);
351         if (ret)
352                 mlog_errno(ret);
353
354 out_commit:
355         ocfs2_commit_trans(osb, handle);
356 out:
357         mutex_unlock(&tl_inode->i_mutex);
358
359         if (meta_ac)
360                 ocfs2_free_alloc_context(meta_ac);
361
362         return ret;
363 }
364
365 static int ocfs2_xattr_shrink_size(struct inode *inode,
366                                    u32 old_clusters,
367                                    u32 new_clusters,
368                                    struct buffer_head *root_bh,
369                                    struct ocfs2_xattr_value_root *xv)
370 {
371         int ret = 0;
372         u32 trunc_len, cpos, phys_cpos, alloc_size;
373         u64 block;
374         struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
375         struct ocfs2_cached_dealloc_ctxt dealloc;
376
377         ocfs2_init_dealloc_ctxt(&dealloc);
378
379         if (old_clusters <= new_clusters)
380                 return 0;
381
382         cpos = new_clusters;
383         trunc_len = old_clusters - new_clusters;
384         while (trunc_len) {
385                 ret = ocfs2_xattr_get_clusters(inode, cpos, &phys_cpos,
386                                                &alloc_size, &xv->xr_list);
387                 if (ret) {
388                         mlog_errno(ret);
389                         goto out;
390                 }
391
392                 if (alloc_size > trunc_len)
393                         alloc_size = trunc_len;
394
395                 ret = __ocfs2_remove_xattr_range(inode, root_bh, xv, cpos,
396                                                  phys_cpos, alloc_size,
397                                                  &dealloc);
398                 if (ret) {
399                         mlog_errno(ret);
400                         goto out;
401                 }
402
403                 block = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos);
404                 ocfs2_remove_xattr_clusters_from_cache(inode, block,
405                                                        alloc_size);
406                 cpos += alloc_size;
407                 trunc_len -= alloc_size;
408         }
409
410 out:
411         ocfs2_schedule_truncate_log_flush(osb, 1);
412         ocfs2_run_deallocs(osb, &dealloc);
413
414         return ret;
415 }
416
417 static int ocfs2_xattr_value_truncate(struct inode *inode,
418                                       struct buffer_head *root_bh,
419                                       struct ocfs2_xattr_value_root *xv,
420                                       int len)
421 {
422         int ret;
423         u32 new_clusters = ocfs2_clusters_for_bytes(inode->i_sb, len);
424         u32 old_clusters = le32_to_cpu(xv->xr_clusters);
425
426         if (new_clusters == old_clusters)
427                 return 0;
428
429         if (new_clusters > old_clusters)
430                 ret = ocfs2_xattr_extend_allocation(inode,
431                                                     new_clusters - old_clusters,
432                                                     root_bh, xv);
433         else
434                 ret = ocfs2_xattr_shrink_size(inode,
435                                               old_clusters, new_clusters,
436                                               root_bh, xv);
437
438         return ret;
439 }
440
441 static int ocfs2_xattr_list_entries(struct inode *inode,
442                                     struct ocfs2_xattr_header *header,
443                                     char *buffer, size_t buffer_size)
444 {
445         size_t rest = buffer_size;
446         int i;
447
448         for (i = 0 ; i < le16_to_cpu(header->xh_count); i++) {
449                 struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
450                 struct xattr_handler *handler =
451                         ocfs2_xattr_handler(ocfs2_xattr_get_type(entry));
452
453                 if (handler) {
454                         size_t size = handler->list(inode, buffer, rest,
455                                         ((char *)header +
456                                         le16_to_cpu(entry->xe_name_offset)),
457                                         entry->xe_name_len);
458                         if (buffer) {
459                                 if (size > rest)
460                                         return -ERANGE;
461                                 buffer += size;
462                         }
463                         rest -= size;
464                 }
465         }
466
467         return buffer_size - rest;
468 }
469
470 static int ocfs2_xattr_ibody_list(struct inode *inode,
471                                   struct ocfs2_dinode *di,
472                                   char *buffer,
473                                   size_t buffer_size)
474 {
475         struct ocfs2_xattr_header *header = NULL;
476         struct ocfs2_inode_info *oi = OCFS2_I(inode);
477         int ret = 0;
478
479         if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL))
480                 return ret;
481
482         header = (struct ocfs2_xattr_header *)
483                  ((void *)di + inode->i_sb->s_blocksize -
484                  le16_to_cpu(di->i_xattr_inline_size));
485
486         ret = ocfs2_xattr_list_entries(inode, header, buffer, buffer_size);
487
488         return ret;
489 }
490
491 static int ocfs2_xattr_block_list(struct inode *inode,
492                                   struct ocfs2_dinode *di,
493                                   char *buffer,
494                                   size_t buffer_size)
495 {
496         struct buffer_head *blk_bh = NULL;
497         struct ocfs2_xattr_block *xb;
498         int ret = 0;
499
500         if (!di->i_xattr_loc)
501                 return ret;
502
503         ret = ocfs2_read_block(OCFS2_SB(inode->i_sb),
504                                le64_to_cpu(di->i_xattr_loc),
505                                &blk_bh, OCFS2_BH_CACHED, inode);
506         if (ret < 0) {
507                 mlog_errno(ret);
508                 return ret;
509         }
510         /*Verify the signature of xattr block*/
511         if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE,
512                    strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) {
513                 ret = -EFAULT;
514                 goto cleanup;
515         }
516
517         xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
518
519         if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
520                 struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header;
521                 ret = ocfs2_xattr_list_entries(inode, header,
522                                                buffer, buffer_size);
523         } else {
524                 struct ocfs2_xattr_tree_root *xt = &xb->xb_attrs.xb_root;
525                 ret = ocfs2_xattr_tree_list_index_block(inode, xt,
526                                                    buffer, buffer_size);
527         }
528 cleanup:
529         brelse(blk_bh);
530
531         return ret;
532 }
533
534 ssize_t ocfs2_listxattr(struct dentry *dentry,
535                         char *buffer,
536                         size_t size)
537 {
538         int ret = 0, i_ret = 0, b_ret = 0;
539         struct buffer_head *di_bh = NULL;
540         struct ocfs2_dinode *di = NULL;
541         struct ocfs2_inode_info *oi = OCFS2_I(dentry->d_inode);
542
543         if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
544                 return ret;
545
546         ret = ocfs2_inode_lock(dentry->d_inode, &di_bh, 0);
547         if (ret < 0) {
548                 mlog_errno(ret);
549                 return ret;
550         }
551
552         di = (struct ocfs2_dinode *)di_bh->b_data;
553
554         down_read(&oi->ip_xattr_sem);
555         i_ret = ocfs2_xattr_ibody_list(dentry->d_inode, di, buffer, size);
556         if (i_ret < 0)
557                 b_ret = 0;
558         else {
559                 if (buffer) {
560                         buffer += i_ret;
561                         size -= i_ret;
562                 }
563                 b_ret = ocfs2_xattr_block_list(dentry->d_inode, di,
564                                                buffer, size);
565                 if (b_ret < 0)
566                         i_ret = 0;
567         }
568         up_read(&oi->ip_xattr_sem);
569         ocfs2_inode_unlock(dentry->d_inode, 0);
570
571         brelse(di_bh);
572
573         return i_ret + b_ret;
574 }
575
576 static int ocfs2_xattr_find_entry(int name_index,
577                                   const char *name,
578                                   struct ocfs2_xattr_search *xs)
579 {
580         struct ocfs2_xattr_entry *entry;
581         size_t name_len;
582         int i, cmp = 1;
583
584         if (name == NULL)
585                 return -EINVAL;
586
587         name_len = strlen(name);
588         entry = xs->here;
589         for (i = 0; i < le16_to_cpu(xs->header->xh_count); i++) {
590                 cmp = name_index - ocfs2_xattr_get_type(entry);
591                 if (!cmp)
592                         cmp = name_len - entry->xe_name_len;
593                 if (!cmp)
594                         cmp = memcmp(name, (xs->base +
595                                      le16_to_cpu(entry->xe_name_offset)),
596                                      name_len);
597                 if (cmp == 0)
598                         break;
599                 entry += 1;
600         }
601         xs->here = entry;
602
603         return cmp ? -ENODATA : 0;
604 }
605
606 static int ocfs2_xattr_get_value_outside(struct inode *inode,
607                                          struct ocfs2_xattr_search *xs,
608                                          void *buffer,
609                                          size_t len)
610 {
611         u32 cpos, p_cluster, num_clusters, bpc, clusters;
612         u64 blkno;
613         int i, ret = 0;
614         size_t cplen, blocksize;
615         struct buffer_head *bh = NULL;
616         struct ocfs2_xattr_value_root *xv;
617         struct ocfs2_extent_list *el;
618
619         xv = (struct ocfs2_xattr_value_root *)
620                 (xs->base + le16_to_cpu(xs->here->xe_name_offset) +
621                 OCFS2_XATTR_SIZE(xs->here->xe_name_len));
622         el = &xv->xr_list;
623         clusters = le32_to_cpu(xv->xr_clusters);
624         bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
625         blocksize = inode->i_sb->s_blocksize;
626
627         cpos = 0;
628         while (cpos < clusters) {
629                 ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
630                                                &num_clusters, el);
631                 if (ret) {
632                         mlog_errno(ret);
633                         goto out;
634                 }
635
636                 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster);
637                 /* Copy ocfs2_xattr_value */
638                 for (i = 0; i < num_clusters * bpc; i++, blkno++) {
639                         ret = ocfs2_read_block(OCFS2_SB(inode->i_sb), blkno,
640                                                &bh, OCFS2_BH_CACHED, inode);
641                         if (ret) {
642                                 mlog_errno(ret);
643                                 goto out;
644                         }
645
646                         cplen = len >= blocksize ? blocksize : len;
647                         memcpy(buffer, bh->b_data, cplen);
648                         len -= cplen;
649                         buffer += cplen;
650
651                         brelse(bh);
652                         bh = NULL;
653                         if (len == 0)
654                                 break;
655                 }
656                 cpos += num_clusters;
657         }
658 out:
659         return ret;
660 }
661
662 static int ocfs2_xattr_ibody_get(struct inode *inode,
663                                  int name_index,
664                                  const char *name,
665                                  void *buffer,
666                                  size_t buffer_size,
667                                  struct ocfs2_xattr_search *xs)
668 {
669         struct ocfs2_inode_info *oi = OCFS2_I(inode);
670         struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
671         size_t size;
672         int ret = 0;
673
674         if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL))
675                 return -ENODATA;
676
677         xs->end = (void *)di + inode->i_sb->s_blocksize;
678         xs->header = (struct ocfs2_xattr_header *)
679                         (xs->end - le16_to_cpu(di->i_xattr_inline_size));
680         xs->base = (void *)xs->header;
681         xs->here = xs->header->xh_entries;
682
683         ret = ocfs2_xattr_find_entry(name_index, name, xs);
684         if (ret)
685                 return ret;
686         size = le64_to_cpu(xs->here->xe_value_size);
687         if (buffer) {
688                 if (size > buffer_size)
689                         return -ERANGE;
690                 if (ocfs2_xattr_is_local(xs->here)) {
691                         memcpy(buffer, (void *)xs->base +
692                                le16_to_cpu(xs->here->xe_name_offset) +
693                                OCFS2_XATTR_SIZE(xs->here->xe_name_len), size);
694                 } else {
695                         ret = ocfs2_xattr_get_value_outside(inode, xs,
696                                                             buffer, size);
697                         if (ret < 0) {
698                                 mlog_errno(ret);
699                                 return ret;
700                         }
701                 }
702         }
703
704         return size;
705 }
706
707 static int ocfs2_xattr_block_get(struct inode *inode,
708                                  int name_index,
709                                  const char *name,
710                                  void *buffer,
711                                  size_t buffer_size,
712                                  struct ocfs2_xattr_search *xs)
713 {
714         struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
715         struct buffer_head *blk_bh = NULL;
716         struct ocfs2_xattr_block *xb;
717         size_t size;
718         int ret = -ENODATA;
719
720         if (!di->i_xattr_loc)
721                 return ret;
722
723         ret = ocfs2_read_block(OCFS2_SB(inode->i_sb),
724                                le64_to_cpu(di->i_xattr_loc),
725                                &blk_bh, OCFS2_BH_CACHED, inode);
726         if (ret < 0) {
727                 mlog_errno(ret);
728                 return ret;
729         }
730         /*Verify the signature of xattr block*/
731         if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE,
732                    strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) {
733                 ret = -EFAULT;
734                 goto cleanup;
735         }
736
737         xs->xattr_bh = blk_bh;
738         xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
739         xs->header = &xb->xb_attrs.xb_header;
740         xs->base = (void *)xs->header;
741         xs->end = (void *)(blk_bh->b_data) + blk_bh->b_size;
742         xs->here = xs->header->xh_entries;
743
744         ret = ocfs2_xattr_find_entry(name_index, name, xs);
745         if (ret)
746                 goto cleanup;
747         size = le64_to_cpu(xs->here->xe_value_size);
748         if (buffer) {
749                 ret = -ERANGE;
750                 if (size > buffer_size)
751                         goto cleanup;
752                 if (ocfs2_xattr_is_local(xs->here)) {
753                         memcpy(buffer, (void *)xs->base +
754                                le16_to_cpu(xs->here->xe_name_offset) +
755                                OCFS2_XATTR_SIZE(xs->here->xe_name_len), size);
756                 } else {
757                         ret = ocfs2_xattr_get_value_outside(inode, xs,
758                                                             buffer, size);
759                         if (ret < 0) {
760                                 mlog_errno(ret);
761                                 goto cleanup;
762                         }
763                 }
764         }
765         ret = size;
766 cleanup:
767         brelse(blk_bh);
768
769         return ret;
770 }
771
772 /* ocfs2_xattr_get()
773  *
774  * Copy an extended attribute into the buffer provided.
775  * Buffer is NULL to compute the size of buffer required.
776  */
777 int ocfs2_xattr_get(struct inode *inode,
778                     int name_index,
779                     const char *name,
780                     void *buffer,
781                     size_t buffer_size)
782 {
783         int ret;
784         struct ocfs2_dinode *di = NULL;
785         struct buffer_head *di_bh = NULL;
786         struct ocfs2_inode_info *oi = OCFS2_I(inode);
787         struct ocfs2_xattr_search xis = {
788                 .not_found = -ENODATA,
789         };
790         struct ocfs2_xattr_search xbs = {
791                 .not_found = -ENODATA,
792         };
793
794         if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
795                 ret = -ENODATA;
796
797         ret = ocfs2_inode_lock(inode, &di_bh, 0);
798         if (ret < 0) {
799                 mlog_errno(ret);
800                 return ret;
801         }
802         xis.inode_bh = xbs.inode_bh = di_bh;
803         di = (struct ocfs2_dinode *)di_bh->b_data;
804
805         down_read(&oi->ip_xattr_sem);
806         ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer,
807                                     buffer_size, &xis);
808         if (ret == -ENODATA)
809                 ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
810                                             buffer_size, &xbs);
811         up_read(&oi->ip_xattr_sem);
812         ocfs2_inode_unlock(inode, 0);
813
814         brelse(di_bh);
815
816         return ret;
817 }
818
819 static int __ocfs2_xattr_set_value_outside(struct inode *inode,
820                                            struct ocfs2_xattr_value_root *xv,
821                                            const void *value,
822                                            int value_len)
823 {
824         int ret = 0, i, cp_len, credits;
825         u16 blocksize = inode->i_sb->s_blocksize;
826         u32 p_cluster, num_clusters;
827         u32 cpos = 0, bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
828         u32 clusters = ocfs2_clusters_for_bytes(inode->i_sb, value_len);
829         u64 blkno;
830         struct buffer_head *bh = NULL;
831         handle_t *handle;
832
833         BUG_ON(clusters > le32_to_cpu(xv->xr_clusters));
834
835         credits = clusters * bpc;
836         handle = ocfs2_start_trans(OCFS2_SB(inode->i_sb), credits);
837         if (IS_ERR(handle)) {
838                 ret = PTR_ERR(handle);
839                 mlog_errno(ret);
840                 goto out;
841         }
842
843         while (cpos < clusters) {
844                 ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
845                                                &num_clusters, &xv->xr_list);
846                 if (ret) {
847                         mlog_errno(ret);
848                         goto out_commit;
849                 }
850
851                 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster);
852
853                 for (i = 0; i < num_clusters * bpc; i++, blkno++) {
854                         ret = ocfs2_read_block(OCFS2_SB(inode->i_sb), blkno,
855                                                &bh, OCFS2_BH_CACHED, inode);
856                         if (ret) {
857                                 mlog_errno(ret);
858                                 goto out_commit;
859                         }
860
861                         ret = ocfs2_journal_access(handle,
862                                                    inode,
863                                                    bh,
864                                                    OCFS2_JOURNAL_ACCESS_WRITE);
865                         if (ret < 0) {
866                                 mlog_errno(ret);
867                                 goto out_commit;
868                         }
869
870                         cp_len = value_len > blocksize ? blocksize : value_len;
871                         memcpy(bh->b_data, value, cp_len);
872                         value_len -= cp_len;
873                         value += cp_len;
874                         if (cp_len < blocksize)
875                                 memset(bh->b_data + cp_len, 0,
876                                        blocksize - cp_len);
877
878                         ret = ocfs2_journal_dirty(handle, bh);
879                         if (ret < 0) {
880                                 mlog_errno(ret);
881                                 goto out_commit;
882                         }
883                         brelse(bh);
884                         bh = NULL;
885
886                         /*
887                          * XXX: do we need to empty all the following
888                          * blocks in this cluster?
889                          */
890                         if (!value_len)
891                                 break;
892                 }
893                 cpos += num_clusters;
894         }
895 out_commit:
896         ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle);
897 out:
898         brelse(bh);
899
900         return ret;
901 }
902
903 static int ocfs2_xattr_cleanup(struct inode *inode,
904                                struct ocfs2_xattr_info *xi,
905                                struct ocfs2_xattr_search *xs,
906                                size_t offs)
907 {
908         handle_t *handle = NULL;
909         int ret = 0;
910         size_t name_len = strlen(xi->name);
911         void *val = xs->base + offs;
912         size_t size = OCFS2_XATTR_SIZE(name_len) + OCFS2_XATTR_ROOT_SIZE;
913
914         handle = ocfs2_start_trans((OCFS2_SB(inode->i_sb)),
915                                    OCFS2_XATTR_BLOCK_UPDATE_CREDITS);
916         if (IS_ERR(handle)) {
917                 ret = PTR_ERR(handle);
918                 mlog_errno(ret);
919                 goto out;
920         }
921         ret = ocfs2_journal_access(handle, inode, xs->xattr_bh,
922                                    OCFS2_JOURNAL_ACCESS_WRITE);
923         if (ret) {
924                 mlog_errno(ret);
925                 goto out_commit;
926         }
927         /* Decrease xattr count */
928         le16_add_cpu(&xs->header->xh_count, -1);
929         /* Remove the xattr entry and tree root which has already be set*/
930         memset((void *)xs->here, 0, sizeof(struct ocfs2_xattr_entry));
931         memset(val, 0, size);
932
933         ret = ocfs2_journal_dirty(handle, xs->xattr_bh);
934         if (ret < 0)
935                 mlog_errno(ret);
936 out_commit:
937         ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle);
938 out:
939         return ret;
940 }
941
942 static int ocfs2_xattr_update_entry(struct inode *inode,
943                                     struct ocfs2_xattr_info *xi,
944                                     struct ocfs2_xattr_search *xs,
945                                     size_t offs)
946 {
947         handle_t *handle = NULL;
948         int ret = 0;
949
950         handle = ocfs2_start_trans((OCFS2_SB(inode->i_sb)),
951                                    OCFS2_XATTR_BLOCK_UPDATE_CREDITS);
952         if (IS_ERR(handle)) {
953                 ret = PTR_ERR(handle);
954                 mlog_errno(ret);
955                 goto out;
956         }
957         ret = ocfs2_journal_access(handle, inode, xs->xattr_bh,
958                                    OCFS2_JOURNAL_ACCESS_WRITE);
959         if (ret) {
960                 mlog_errno(ret);
961                 goto out_commit;
962         }
963
964         xs->here->xe_name_offset = cpu_to_le16(offs);
965         xs->here->xe_value_size = cpu_to_le64(xi->value_len);
966         if (xi->value_len <= OCFS2_XATTR_INLINE_SIZE)
967                 ocfs2_xattr_set_local(xs->here, 1);
968         else
969                 ocfs2_xattr_set_local(xs->here, 0);
970         ocfs2_xattr_hash_entry(inode, xs->header, xs->here);
971
972         ret = ocfs2_journal_dirty(handle, xs->xattr_bh);
973         if (ret < 0)
974                 mlog_errno(ret);
975 out_commit:
976         ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle);
977 out:
978         return ret;
979 }
980
981 /*
982  * ocfs2_xattr_set_value_outside()
983  *
984  * Set large size value in B tree.
985  */
986 static int ocfs2_xattr_set_value_outside(struct inode *inode,
987                                          struct ocfs2_xattr_info *xi,
988                                          struct ocfs2_xattr_search *xs,
989                                          size_t offs)
990 {
991         size_t name_len = strlen(xi->name);
992         void *val = xs->base + offs;
993         struct ocfs2_xattr_value_root *xv = NULL;
994         size_t size = OCFS2_XATTR_SIZE(name_len) + OCFS2_XATTR_ROOT_SIZE;
995         int ret = 0;
996
997         memset(val, 0, size);
998         memcpy(val, xi->name, name_len);
999         xv = (struct ocfs2_xattr_value_root *)
1000                 (val + OCFS2_XATTR_SIZE(name_len));
1001         xv->xr_clusters = 0;
1002         xv->xr_last_eb_blk = 0;
1003         xv->xr_list.l_tree_depth = 0;
1004         xv->xr_list.l_count = cpu_to_le16(1);
1005         xv->xr_list.l_next_free_rec = 0;
1006
1007         ret = ocfs2_xattr_value_truncate(inode, xs->xattr_bh, xv,
1008                                          xi->value_len);
1009         if (ret < 0) {
1010                 mlog_errno(ret);
1011                 return ret;
1012         }
1013         ret = __ocfs2_xattr_set_value_outside(inode, xv, xi->value,
1014                                               xi->value_len);
1015         if (ret < 0) {
1016                 mlog_errno(ret);
1017                 return ret;
1018         }
1019         ret = ocfs2_xattr_update_entry(inode, xi, xs, offs);
1020         if (ret < 0)
1021                 mlog_errno(ret);
1022
1023         return ret;
1024 }
1025
1026 /*
1027  * ocfs2_xattr_set_entry_local()
1028  *
1029  * Set, replace or remove extended attribute in local.
1030  */
1031 static void ocfs2_xattr_set_entry_local(struct inode *inode,
1032                                         struct ocfs2_xattr_info *xi,
1033                                         struct ocfs2_xattr_search *xs,
1034                                         struct ocfs2_xattr_entry *last,
1035                                         size_t min_offs)
1036 {
1037         size_t name_len = strlen(xi->name);
1038         int i;
1039
1040         if (xi->value && xs->not_found) {
1041                 /* Insert the new xattr entry. */
1042                 le16_add_cpu(&xs->header->xh_count, 1);
1043                 ocfs2_xattr_set_type(last, xi->name_index);
1044                 ocfs2_xattr_set_local(last, 1);
1045                 last->xe_name_len = name_len;
1046         } else {
1047                 void *first_val;
1048                 void *val;
1049                 size_t offs, size;
1050
1051                 first_val = xs->base + min_offs;
1052                 offs = le16_to_cpu(xs->here->xe_name_offset);
1053                 val = xs->base + offs;
1054
1055                 if (le64_to_cpu(xs->here->xe_value_size) >
1056                     OCFS2_XATTR_INLINE_SIZE)
1057                         size = OCFS2_XATTR_SIZE(name_len) +
1058                                 OCFS2_XATTR_ROOT_SIZE;
1059                 else
1060                         size = OCFS2_XATTR_SIZE(name_len) +
1061                         OCFS2_XATTR_SIZE(le64_to_cpu(xs->here->xe_value_size));
1062
1063                 if (xi->value && size == OCFS2_XATTR_SIZE(name_len) +
1064                                 OCFS2_XATTR_SIZE(xi->value_len)) {
1065                         /* The old and the new value have the
1066                            same size. Just replace the value. */
1067                         ocfs2_xattr_set_local(xs->here, 1);
1068                         xs->here->xe_value_size = cpu_to_le64(xi->value_len);
1069                         /* Clear value bytes. */
1070                         memset(val + OCFS2_XATTR_SIZE(name_len),
1071                                0,
1072                                OCFS2_XATTR_SIZE(xi->value_len));
1073                         memcpy(val + OCFS2_XATTR_SIZE(name_len),
1074                                xi->value,
1075                                xi->value_len);
1076                         return;
1077                 }
1078                 /* Remove the old name+value. */
1079                 memmove(first_val + size, first_val, val - first_val);
1080                 memset(first_val, 0, size);
1081                 xs->here->xe_name_hash = 0;
1082                 xs->here->xe_name_offset = 0;
1083                 ocfs2_xattr_set_local(xs->here, 1);
1084                 xs->here->xe_value_size = 0;
1085
1086                 min_offs += size;
1087
1088                 /* Adjust all value offsets. */
1089                 last = xs->header->xh_entries;
1090                 for (i = 0 ; i < le16_to_cpu(xs->header->xh_count); i++) {
1091                         size_t o = le16_to_cpu(last->xe_name_offset);
1092
1093                         if (o < offs)
1094                                 last->xe_name_offset = cpu_to_le16(o + size);
1095                         last += 1;
1096                 }
1097
1098                 if (!xi->value) {
1099                         /* Remove the old entry. */
1100                         last -= 1;
1101                         memmove(xs->here, xs->here + 1,
1102                                 (void *)last - (void *)xs->here);
1103                         memset(last, 0, sizeof(struct ocfs2_xattr_entry));
1104                         le16_add_cpu(&xs->header->xh_count, -1);
1105                 }
1106         }
1107         if (xi->value) {
1108                 /* Insert the new name+value. */
1109                 size_t size = OCFS2_XATTR_SIZE(name_len) +
1110                                 OCFS2_XATTR_SIZE(xi->value_len);
1111                 void *val = xs->base + min_offs - size;
1112
1113                 xs->here->xe_name_offset = cpu_to_le16(min_offs - size);
1114                 memset(val, 0, size);
1115                 memcpy(val, xi->name, name_len);
1116                 memcpy(val + OCFS2_XATTR_SIZE(name_len),
1117                        xi->value,
1118                        xi->value_len);
1119                 xs->here->xe_value_size = cpu_to_le64(xi->value_len);
1120                 ocfs2_xattr_set_local(xs->here, 1);
1121                 ocfs2_xattr_hash_entry(inode, xs->header, xs->here);
1122         }
1123
1124         return;
1125 }
1126
1127 /*
1128  * ocfs2_xattr_set_entry()
1129  *
1130  * Set extended attribute entry into inode or block.
1131  *
1132  * If extended attribute value size > OCFS2_XATTR_INLINE_SIZE,
1133  * We first insert tree root(ocfs2_xattr_value_root) with set_entry_local(),
1134  * then set value in B tree with set_value_outside().
1135  */
1136 static int ocfs2_xattr_set_entry(struct inode *inode,
1137                                  struct ocfs2_xattr_info *xi,
1138                                  struct ocfs2_xattr_search *xs,
1139                                  int flag)
1140 {
1141         struct ocfs2_xattr_entry *last;
1142         struct ocfs2_inode_info *oi = OCFS2_I(inode);
1143         struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
1144         size_t min_offs = xs->end - xs->base, name_len = strlen(xi->name);
1145         size_t size_l = 0;
1146         handle_t *handle = NULL;
1147         int free, i, ret;
1148         struct ocfs2_xattr_info xi_l = {
1149                 .name_index = xi->name_index,
1150                 .name = xi->name,
1151                 .value = xi->value,
1152                 .value_len = xi->value_len,
1153         };
1154
1155         /* Compute min_offs, last and free space. */
1156         last = xs->header->xh_entries;
1157
1158         for (i = 0 ; i < le16_to_cpu(xs->header->xh_count); i++) {
1159                 size_t offs = le16_to_cpu(last->xe_name_offset);
1160                 if (offs < min_offs)
1161                         min_offs = offs;
1162                 last += 1;
1163         }
1164
1165         free = min_offs - ((void *)last - xs->base) - sizeof(__u32);
1166         if (free < 0)
1167                 return -EFAULT;
1168
1169         if (!xs->not_found) {
1170                 size_t size = 0;
1171                 if (ocfs2_xattr_is_local(xs->here))
1172                         size = OCFS2_XATTR_SIZE(name_len) +
1173                         OCFS2_XATTR_SIZE(le64_to_cpu(xs->here->xe_value_size));
1174                 else
1175                         size = OCFS2_XATTR_SIZE(name_len) +
1176                                 OCFS2_XATTR_ROOT_SIZE;
1177                 free += (size + sizeof(struct ocfs2_xattr_entry));
1178         }
1179         /* Check free space in inode or block */
1180         if (xi->value && xi->value_len > OCFS2_XATTR_INLINE_SIZE) {
1181                 if (free < sizeof(struct ocfs2_xattr_entry) +
1182                            OCFS2_XATTR_SIZE(name_len) +
1183                            OCFS2_XATTR_ROOT_SIZE) {
1184                         ret = -ENOSPC;
1185                         goto out;
1186                 }
1187                 size_l = OCFS2_XATTR_SIZE(name_len) + OCFS2_XATTR_ROOT_SIZE;
1188                 xi_l.value = (void *)&def_xv;
1189                 xi_l.value_len = OCFS2_XATTR_ROOT_SIZE;
1190         } else if (xi->value) {
1191                 if (free < sizeof(struct ocfs2_xattr_entry) +
1192                            OCFS2_XATTR_SIZE(name_len) +
1193                            OCFS2_XATTR_SIZE(xi->value_len)) {
1194                         ret = -ENOSPC;
1195                         goto out;
1196                 }
1197         }
1198
1199         if (!xs->not_found) {
1200                 /* For existing extended attribute */
1201                 size_t size = OCFS2_XATTR_SIZE(name_len) +
1202                         OCFS2_XATTR_SIZE(le64_to_cpu(xs->here->xe_value_size));
1203                 size_t offs = le16_to_cpu(xs->here->xe_name_offset);
1204                 void *val = xs->base + offs;
1205
1206                 if (ocfs2_xattr_is_local(xs->here) && size == size_l) {
1207                         /* Replace existing local xattr with tree root */
1208                         ret = ocfs2_xattr_set_value_outside(inode, xi, xs,
1209                                                             offs);
1210                         if (ret < 0)
1211                                 mlog_errno(ret);
1212                         goto out;
1213                 } else if (!ocfs2_xattr_is_local(xs->here)) {
1214                         /* For existing xattr which has value outside */
1215                         struct ocfs2_xattr_value_root *xv = NULL;
1216                         xv = (struct ocfs2_xattr_value_root *)(val +
1217                                 OCFS2_XATTR_SIZE(name_len));
1218
1219                         if (xi->value_len > OCFS2_XATTR_INLINE_SIZE) {
1220                                 /*
1221                                  * If new value need set outside also,
1222                                  * first truncate old value to new value,
1223                                  * then set new value with set_value_outside().
1224                                  */
1225                                 ret = ocfs2_xattr_value_truncate(inode,
1226                                                                  xs->xattr_bh,
1227                                                                  xv,
1228                                                                  xi->value_len);
1229                                 if (ret < 0) {
1230                                         mlog_errno(ret);
1231                                         goto out;
1232                                 }
1233
1234                                 ret = __ocfs2_xattr_set_value_outside(inode,
1235                                                                 xv,
1236                                                                 xi->value,
1237                                                                 xi->value_len);
1238                                 if (ret < 0) {
1239                                         mlog_errno(ret);
1240                                         goto out;
1241                                 }
1242
1243                                 ret = ocfs2_xattr_update_entry(inode,
1244                                                                xi,
1245                                                                xs,
1246                                                                offs);
1247                                 if (ret < 0)
1248                                         mlog_errno(ret);
1249                                 goto out;
1250                         } else {
1251                                 /*
1252                                  * If new value need set in local,
1253                                  * just trucate old value to zero.
1254                                  */
1255                                  ret = ocfs2_xattr_value_truncate(inode,
1256                                                                  xs->xattr_bh,
1257                                                                  xv,
1258                                                                  0);
1259                                 if (ret < 0)
1260                                         mlog_errno(ret);
1261                         }
1262                 }
1263         }
1264
1265         handle = ocfs2_start_trans((OCFS2_SB(inode->i_sb)),
1266                                    OCFS2_INODE_UPDATE_CREDITS);
1267         if (IS_ERR(handle)) {
1268                 ret = PTR_ERR(handle);
1269                 mlog_errno(ret);
1270                 goto out;
1271         }
1272
1273         ret = ocfs2_journal_access(handle, inode, xs->inode_bh,
1274                                    OCFS2_JOURNAL_ACCESS_WRITE);
1275         if (ret) {
1276                 mlog_errno(ret);
1277                 goto out_commit;
1278         }
1279
1280         if (!(flag & OCFS2_INLINE_XATTR_FL)) {
1281                 /*set extended attribue in external blcok*/
1282                 ret = ocfs2_extend_trans(handle,
1283                                          OCFS2_XATTR_BLOCK_UPDATE_CREDITS);
1284                 if (ret) {
1285                         mlog_errno(ret);
1286                         goto out_commit;
1287                 }
1288                 ret = ocfs2_journal_access(handle, inode, xs->xattr_bh,
1289                                            OCFS2_JOURNAL_ACCESS_WRITE);
1290                 if (ret) {
1291                         mlog_errno(ret);
1292                         goto out_commit;
1293                 }
1294         }
1295
1296         /*
1297          * Set value in local, include set tree root in local.
1298          * This is the first step for value size >INLINE_SIZE.
1299          */
1300         ocfs2_xattr_set_entry_local(inode, &xi_l, xs, last, min_offs);
1301
1302         if (!(flag & OCFS2_INLINE_XATTR_FL)) {
1303                 ret = ocfs2_journal_dirty(handle, xs->xattr_bh);
1304                 if (ret < 0) {
1305                         mlog_errno(ret);
1306                         goto out_commit;
1307                 }
1308         }
1309
1310         if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) &&
1311             (flag & OCFS2_INLINE_XATTR_FL)) {
1312                 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1313                 unsigned int xattrsize = osb->s_xattr_inline_size;
1314
1315                 /*
1316                  * Adjust extent record count or inline data size
1317                  * to reserve space for extended attribute.
1318                  */
1319                 if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
1320                         struct ocfs2_inline_data *idata = &di->id2.i_data;
1321                         le16_add_cpu(&idata->id_count, -xattrsize);
1322                 } else if (!(ocfs2_inode_is_fast_symlink(inode))) {
1323                         struct ocfs2_extent_list *el = &di->id2.i_list;
1324                         le16_add_cpu(&el->l_count, -(xattrsize /
1325                                         sizeof(struct ocfs2_extent_rec)));
1326                 }
1327                 di->i_xattr_inline_size = cpu_to_le16(xattrsize);
1328         }
1329         /* Update xattr flag */
1330         spin_lock(&oi->ip_lock);
1331         oi->ip_dyn_features |= flag;
1332         di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features);
1333         spin_unlock(&oi->ip_lock);
1334         /* Update inode ctime */
1335         inode->i_ctime = CURRENT_TIME;
1336         di->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
1337         di->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
1338
1339         ret = ocfs2_journal_dirty(handle, xs->inode_bh);
1340         if (ret < 0)
1341                 mlog_errno(ret);
1342
1343 out_commit:
1344         ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle);
1345
1346         if (!ret && xi->value_len > OCFS2_XATTR_INLINE_SIZE) {
1347                 /*
1348                  * Set value outside in B tree.
1349                  * This is the second step for value size > INLINE_SIZE.
1350                  */
1351                 size_t offs = le16_to_cpu(xs->here->xe_name_offset);
1352                 ret = ocfs2_xattr_set_value_outside(inode, xi, xs, offs);
1353                 if (ret < 0) {
1354                         int ret2;
1355
1356                         mlog_errno(ret);
1357                         /*
1358                          * If set value outside failed, we have to clean
1359                          * the junk tree root we have already set in local.
1360                          */
1361                         ret2 = ocfs2_xattr_cleanup(inode, xi, xs, offs);
1362                         if (ret2 < 0)
1363                                 mlog_errno(ret2);
1364                 }
1365         }
1366 out:
1367         return ret;
1368
1369 }
1370
1371 static int ocfs2_xattr_free_block(handle_t *handle,
1372                                   struct ocfs2_super *osb,
1373                                   struct ocfs2_xattr_block *xb)
1374 {
1375         struct inode *xb_alloc_inode;
1376         struct buffer_head *xb_alloc_bh = NULL;
1377         u64 blk = le64_to_cpu(xb->xb_blkno);
1378         u16 bit = le16_to_cpu(xb->xb_suballoc_bit);
1379         u64 bg_blkno = ocfs2_which_suballoc_group(blk, bit);
1380         int ret = 0;
1381
1382         xb_alloc_inode = ocfs2_get_system_file_inode(osb,
1383                                 EXTENT_ALLOC_SYSTEM_INODE,
1384                                 le16_to_cpu(xb->xb_suballoc_slot));
1385         if (!xb_alloc_inode) {
1386                 ret = -ENOMEM;
1387                 mlog_errno(ret);
1388                 goto out;
1389         }
1390         mutex_lock(&xb_alloc_inode->i_mutex);
1391
1392         ret = ocfs2_inode_lock(xb_alloc_inode, &xb_alloc_bh, 1);
1393         if (ret < 0) {
1394                 mlog_errno(ret);
1395                 goto out_mutex;
1396         }
1397         ret = ocfs2_extend_trans(handle, OCFS2_SUBALLOC_FREE);
1398         if (ret < 0) {
1399                 mlog_errno(ret);
1400                 goto out_unlock;
1401         }
1402         ret = ocfs2_free_suballoc_bits(handle, xb_alloc_inode, xb_alloc_bh,
1403                                        bit, bg_blkno, 1);
1404         if (ret < 0)
1405                 mlog_errno(ret);
1406 out_unlock:
1407         ocfs2_inode_unlock(xb_alloc_inode, 1);
1408         brelse(xb_alloc_bh);
1409 out_mutex:
1410         mutex_unlock(&xb_alloc_inode->i_mutex);
1411         iput(xb_alloc_inode);
1412 out:
1413         return ret;
1414 }
1415
1416 static int ocfs2_remove_value_outside(struct inode*inode,
1417                                       struct buffer_head *bh,
1418                                       struct ocfs2_xattr_header *header)
1419 {
1420         int ret = 0, i;
1421
1422         for (i = 0; i < le16_to_cpu(header->xh_count); i++) {
1423                 struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
1424
1425                 if (!ocfs2_xattr_is_local(entry)) {
1426                         struct ocfs2_xattr_value_root *xv;
1427                         void *val;
1428
1429                         val = (void *)header +
1430                                 le16_to_cpu(entry->xe_name_offset);
1431                         xv = (struct ocfs2_xattr_value_root *)
1432                                 (val + OCFS2_XATTR_SIZE(entry->xe_name_len));
1433                         ret = ocfs2_xattr_value_truncate(inode, bh, xv, 0);
1434                         if (ret < 0) {
1435                                 mlog_errno(ret);
1436                                 return ret;
1437                         }
1438                 }
1439         }
1440
1441         return ret;
1442 }
1443
1444 static int ocfs2_xattr_ibody_remove(struct inode *inode,
1445                                     struct buffer_head *di_bh)
1446 {
1447
1448         struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
1449         struct ocfs2_xattr_header *header;
1450         int ret;
1451
1452         header = (struct ocfs2_xattr_header *)
1453                  ((void *)di + inode->i_sb->s_blocksize -
1454                  le16_to_cpu(di->i_xattr_inline_size));
1455
1456         ret = ocfs2_remove_value_outside(inode, di_bh, header);
1457
1458         return ret;
1459 }
1460
1461 static int ocfs2_xattr_block_remove(struct inode *inode,
1462                                     struct buffer_head *blk_bh)
1463 {
1464         struct ocfs2_xattr_block *xb;
1465         struct ocfs2_xattr_header *header;
1466         int ret = 0;
1467
1468         xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
1469         header = &(xb->xb_attrs.xb_header);
1470
1471         ret = ocfs2_remove_value_outside(inode, blk_bh, header);
1472
1473         return ret;
1474 }
1475
1476 /*
1477  * ocfs2_xattr_remove()
1478  *
1479  * Free extended attribute resources associated with this inode.
1480  */
1481 int ocfs2_xattr_remove(struct inode *inode, struct buffer_head *di_bh)
1482 {
1483         struct ocfs2_xattr_block *xb;
1484         struct buffer_head *blk_bh = NULL;
1485         struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1486         struct ocfs2_inode_info *oi = OCFS2_I(inode);
1487         struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
1488         handle_t *handle;
1489         int ret;
1490
1491         if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
1492                 return 0;
1493
1494         if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) {
1495                 ret = ocfs2_xattr_ibody_remove(inode, di_bh);
1496                 if (ret < 0) {
1497                         mlog_errno(ret);
1498                         goto out;
1499                 }
1500         }
1501         if (di->i_xattr_loc) {
1502                 ret = ocfs2_read_block(OCFS2_SB(inode->i_sb),
1503                                        le64_to_cpu(di->i_xattr_loc),
1504                                        &blk_bh, OCFS2_BH_CACHED, inode);
1505                 if (ret < 0) {
1506                         mlog_errno(ret);
1507                         return ret;
1508                 }
1509                 /*Verify the signature of xattr block*/
1510                 if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE,
1511                            strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) {
1512                         ret = -EFAULT;
1513                         goto out;
1514                 }
1515
1516                 ret = ocfs2_xattr_block_remove(inode, blk_bh);
1517                 if (ret < 0) {
1518                         mlog_errno(ret);
1519                         goto out;
1520                 }
1521         }
1522
1523         handle = ocfs2_start_trans((OCFS2_SB(inode->i_sb)),
1524                                    OCFS2_INODE_UPDATE_CREDITS);
1525         if (IS_ERR(handle)) {
1526                 ret = PTR_ERR(handle);
1527                 mlog_errno(ret);
1528                 goto out;
1529         }
1530         ret = ocfs2_journal_access(handle, inode, di_bh,
1531                                    OCFS2_JOURNAL_ACCESS_WRITE);
1532         if (ret) {
1533                 mlog_errno(ret);
1534                 goto out_commit;
1535         }
1536
1537         if (di->i_xattr_loc) {
1538                 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
1539                 ocfs2_xattr_free_block(handle, osb, xb);
1540                 di->i_xattr_loc = cpu_to_le64(0);
1541         }
1542
1543         spin_lock(&oi->ip_lock);
1544         oi->ip_dyn_features &= ~(OCFS2_INLINE_XATTR_FL | OCFS2_HAS_XATTR_FL);
1545         di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features);
1546         spin_unlock(&oi->ip_lock);
1547
1548         ret = ocfs2_journal_dirty(handle, di_bh);
1549         if (ret < 0)
1550                 mlog_errno(ret);
1551 out_commit:
1552         ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle);
1553 out:
1554         brelse(blk_bh);
1555
1556         return ret;
1557 }
1558
1559 static int ocfs2_xattr_has_space_inline(struct inode *inode,
1560                                         struct ocfs2_dinode *di)
1561 {
1562         struct ocfs2_inode_info *oi = OCFS2_I(inode);
1563         unsigned int xattrsize = OCFS2_SB(inode->i_sb)->s_xattr_inline_size;
1564         int free;
1565
1566         if (xattrsize < OCFS2_MIN_XATTR_INLINE_SIZE)
1567                 return 0;
1568
1569         if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
1570                 struct ocfs2_inline_data *idata = &di->id2.i_data;
1571                 free = le16_to_cpu(idata->id_count) - le64_to_cpu(di->i_size);
1572         } else if (ocfs2_inode_is_fast_symlink(inode)) {
1573                 free = ocfs2_fast_symlink_chars(inode->i_sb) -
1574                         le64_to_cpu(di->i_size);
1575         } else {
1576                 struct ocfs2_extent_list *el = &di->id2.i_list;
1577                 free = (le16_to_cpu(el->l_count) -
1578                         le16_to_cpu(el->l_next_free_rec)) *
1579                         sizeof(struct ocfs2_extent_rec);
1580         }
1581         if (free >= xattrsize)
1582                 return 1;
1583
1584         return 0;
1585 }
1586
1587 /*
1588  * ocfs2_xattr_ibody_find()
1589  *
1590  * Find extended attribute in inode block and
1591  * fill search info into struct ocfs2_xattr_search.
1592  */
1593 static int ocfs2_xattr_ibody_find(struct inode *inode,
1594                                   int name_index,
1595                                   const char *name,
1596                                   struct ocfs2_xattr_search *xs)
1597 {
1598         struct ocfs2_inode_info *oi = OCFS2_I(inode);
1599         struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
1600         int ret;
1601         int has_space = 0;
1602
1603         if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE)
1604                 return 0;
1605
1606         if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) {
1607                 down_read(&oi->ip_alloc_sem);
1608                 has_space = ocfs2_xattr_has_space_inline(inode, di);
1609                 up_read(&oi->ip_alloc_sem);
1610                 if (!has_space)
1611                         return 0;
1612         }
1613
1614         xs->xattr_bh = xs->inode_bh;
1615         xs->end = (void *)di + inode->i_sb->s_blocksize;
1616         if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)
1617                 xs->header = (struct ocfs2_xattr_header *)
1618                         (xs->end - le16_to_cpu(di->i_xattr_inline_size));
1619         else
1620                 xs->header = (struct ocfs2_xattr_header *)
1621                         (xs->end - OCFS2_SB(inode->i_sb)->s_xattr_inline_size);
1622         xs->base = (void *)xs->header;
1623         xs->here = xs->header->xh_entries;
1624
1625         /* Find the named attribute. */
1626         if (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL) {
1627                 ret = ocfs2_xattr_find_entry(name_index, name, xs);
1628                 if (ret && ret != -ENODATA)
1629                         return ret;
1630                 xs->not_found = ret;
1631         }
1632
1633         return 0;
1634 }
1635
1636 /*
1637  * ocfs2_xattr_ibody_set()
1638  *
1639  * Set, replace or remove an extended attribute into inode block.
1640  *
1641  */
1642 static int ocfs2_xattr_ibody_set(struct inode *inode,
1643                                  struct ocfs2_xattr_info *xi,
1644                                  struct ocfs2_xattr_search *xs)
1645 {
1646         struct ocfs2_inode_info *oi = OCFS2_I(inode);
1647         struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
1648         int ret;
1649
1650         if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE)
1651                 return -ENOSPC;
1652
1653         down_write(&oi->ip_alloc_sem);
1654         if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) {
1655                 if (!ocfs2_xattr_has_space_inline(inode, di)) {
1656                         ret = -ENOSPC;
1657                         goto out;
1658                 }
1659         }
1660
1661         ret = ocfs2_xattr_set_entry(inode, xi, xs,
1662                                 (OCFS2_INLINE_XATTR_FL | OCFS2_HAS_XATTR_FL));
1663 out:
1664         up_write(&oi->ip_alloc_sem);
1665
1666         return ret;
1667 }
1668
1669 /*
1670  * ocfs2_xattr_block_find()
1671  *
1672  * Find extended attribute in external block and
1673  * fill search info into struct ocfs2_xattr_search.
1674  */
1675 static int ocfs2_xattr_block_find(struct inode *inode,
1676                                   int name_index,
1677                                   const char *name,
1678                                   struct ocfs2_xattr_search *xs)
1679 {
1680         struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
1681         struct buffer_head *blk_bh = NULL;
1682         int ret = 0;
1683
1684         if (!di->i_xattr_loc)
1685                 return ret;
1686
1687         ret = ocfs2_read_block(OCFS2_SB(inode->i_sb),
1688                                le64_to_cpu(di->i_xattr_loc),
1689                                &blk_bh, OCFS2_BH_CACHED, inode);
1690         if (ret < 0) {
1691                 mlog_errno(ret);
1692                 return ret;
1693         }
1694         /*Verify the signature of xattr block*/
1695         if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE,
1696                    strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) {
1697                         ret = -EFAULT;
1698                         goto cleanup;
1699         }
1700
1701         xs->xattr_bh = blk_bh;
1702         xs->header = &((struct ocfs2_xattr_block *)blk_bh->b_data)->
1703                         xb_attrs.xb_header;
1704         xs->base = (void *)xs->header;
1705         xs->end = (void *)(blk_bh->b_data) + blk_bh->b_size;
1706         xs->here = xs->header->xh_entries;
1707
1708         ret = ocfs2_xattr_find_entry(name_index, name, xs);
1709         if (ret && ret != -ENODATA) {
1710                 xs->xattr_bh = NULL;
1711                 goto cleanup;
1712         }
1713         xs->not_found = ret;
1714         return 0;
1715
1716 cleanup:
1717         brelse(blk_bh);
1718
1719         return ret;
1720 }
1721
1722 /*
1723  * ocfs2_xattr_block_set()
1724  *
1725  * Set, replace or remove an extended attribute into external block.
1726  *
1727  */
1728 static int ocfs2_xattr_block_set(struct inode *inode,
1729                                  struct ocfs2_xattr_info *xi,
1730                                  struct ocfs2_xattr_search *xs)
1731 {
1732         struct buffer_head *new_bh = NULL;
1733         struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1734         struct ocfs2_dinode *di =  (struct ocfs2_dinode *)xs->inode_bh->b_data;
1735         struct ocfs2_alloc_context *meta_ac = NULL;
1736         handle_t *handle = NULL;
1737         struct ocfs2_xattr_block *xblk = NULL;
1738         u16 suballoc_bit_start;
1739         u32 num_got;
1740         u64 first_blkno;
1741         int ret;
1742
1743         if (!xs->xattr_bh) {
1744                 /*
1745                  * Alloc one external block for extended attribute
1746                  * outside of inode.
1747                  */
1748                 ret = ocfs2_reserve_new_metadata_blocks(osb, 1, &meta_ac);
1749                 if (ret < 0) {
1750                         mlog_errno(ret);
1751                         goto out;
1752                 }
1753                 handle = ocfs2_start_trans(osb,
1754                                            OCFS2_XATTR_BLOCK_CREATE_CREDITS);
1755                 if (IS_ERR(handle)) {
1756                         ret = PTR_ERR(handle);
1757                         mlog_errno(ret);
1758                         goto out;
1759                 }
1760                 ret = ocfs2_journal_access(handle, inode, xs->inode_bh,
1761                                            OCFS2_JOURNAL_ACCESS_CREATE);
1762                 if (ret < 0) {
1763                         mlog_errno(ret);
1764                         goto out_commit;
1765                 }
1766
1767                 ret = ocfs2_claim_metadata(osb, handle, meta_ac, 1,
1768                                            &suballoc_bit_start, &num_got,
1769                                            &first_blkno);
1770                 if (ret < 0) {
1771                         mlog_errno(ret);
1772                         goto out_commit;
1773                 }
1774
1775                 new_bh = sb_getblk(inode->i_sb, first_blkno);
1776                 ocfs2_set_new_buffer_uptodate(inode, new_bh);
1777
1778                 ret = ocfs2_journal_access(handle, inode, new_bh,
1779                                            OCFS2_JOURNAL_ACCESS_CREATE);
1780                 if (ret < 0) {
1781                         mlog_errno(ret);
1782                         goto out_commit;
1783                 }
1784
1785                 /* Initialize ocfs2_xattr_block */
1786                 xs->xattr_bh = new_bh;
1787                 xblk = (struct ocfs2_xattr_block *)new_bh->b_data;
1788                 memset(xblk, 0, inode->i_sb->s_blocksize);
1789                 strcpy((void *)xblk, OCFS2_XATTR_BLOCK_SIGNATURE);
1790                 xblk->xb_suballoc_slot = cpu_to_le16(osb->slot_num);
1791                 xblk->xb_suballoc_bit = cpu_to_le16(suballoc_bit_start);
1792                 xblk->xb_fs_generation = cpu_to_le32(osb->fs_generation);
1793                 xblk->xb_blkno = cpu_to_le64(first_blkno);
1794
1795                 xs->header = &xblk->xb_attrs.xb_header;
1796                 xs->base = (void *)xs->header;
1797                 xs->end = (void *)xblk + inode->i_sb->s_blocksize;
1798                 xs->here = xs->header->xh_entries;
1799
1800
1801                 ret = ocfs2_journal_dirty(handle, new_bh);
1802                 if (ret < 0) {
1803                         mlog_errno(ret);
1804                         goto out_commit;
1805                 }
1806                 di->i_xattr_loc = cpu_to_le64(first_blkno);
1807                 ret = ocfs2_journal_dirty(handle, xs->inode_bh);
1808                 if (ret < 0)
1809                         mlog_errno(ret);
1810 out_commit:
1811                 ocfs2_commit_trans(osb, handle);
1812 out:
1813                 if (meta_ac)
1814                         ocfs2_free_alloc_context(meta_ac);
1815                 if (ret < 0)
1816                         return ret;
1817         }
1818
1819         /* Set extended attribute into external block */
1820         ret = ocfs2_xattr_set_entry(inode, xi, xs, OCFS2_HAS_XATTR_FL);
1821
1822         return ret;
1823 }
1824
1825 /*
1826  * ocfs2_xattr_set()
1827  *
1828  * Set, replace or remove an extended attribute for this inode.
1829  * value is NULL to remove an existing extended attribute, else either
1830  * create or replace an extended attribute.
1831  */
1832 int ocfs2_xattr_set(struct inode *inode,
1833                     int name_index,
1834                     const char *name,
1835                     const void *value,
1836                     size_t value_len,
1837                     int flags)
1838 {
1839         struct buffer_head *di_bh = NULL;
1840         struct ocfs2_dinode *di;
1841         int ret;
1842
1843         struct ocfs2_xattr_info xi = {
1844                 .name_index = name_index,
1845                 .name = name,
1846                 .value = value,
1847                 .value_len = value_len,
1848         };
1849
1850         struct ocfs2_xattr_search xis = {
1851                 .not_found = -ENODATA,
1852         };
1853
1854         struct ocfs2_xattr_search xbs = {
1855                 .not_found = -ENODATA,
1856         };
1857
1858         ret = ocfs2_inode_lock(inode, &di_bh, 1);
1859         if (ret < 0) {
1860                 mlog_errno(ret);
1861                 return ret;
1862         }
1863         xis.inode_bh = xbs.inode_bh = di_bh;
1864         di = (struct ocfs2_dinode *)di_bh->b_data;
1865
1866         down_write(&OCFS2_I(inode)->ip_xattr_sem);
1867         /*
1868          * Scan inode and external block to find the same name
1869          * extended attribute and collect search infomation.
1870          */
1871         ret = ocfs2_xattr_ibody_find(inode, name_index, name, &xis);
1872         if (ret)
1873                 goto cleanup;
1874         if (xis.not_found) {
1875                 ret = ocfs2_xattr_block_find(inode, name_index, name, &xbs);
1876                 if (ret)
1877                         goto cleanup;
1878         }
1879
1880         if (xis.not_found && xbs.not_found) {
1881                 ret = -ENODATA;
1882                 if (flags & XATTR_REPLACE)
1883                         goto cleanup;
1884                 ret = 0;
1885                 if (!value)
1886                         goto cleanup;
1887         } else {
1888                 ret = -EEXIST;
1889                 if (flags & XATTR_CREATE)
1890                         goto cleanup;
1891         }
1892
1893         if (!value) {
1894                 /* Remove existing extended attribute */
1895                 if (!xis.not_found)
1896                         ret = ocfs2_xattr_ibody_set(inode, &xi, &xis);
1897                 else if (!xbs.not_found)
1898                         ret = ocfs2_xattr_block_set(inode, &xi, &xbs);
1899         } else {
1900                 /* We always try to set extended attribute into inode first*/
1901                 ret = ocfs2_xattr_ibody_set(inode, &xi, &xis);
1902                 if (!ret && !xbs.not_found) {
1903                         /*
1904                          * If succeed and that extended attribute existing in
1905                          * external block, then we will remove it.
1906                          */
1907                         xi.value = NULL;
1908                         xi.value_len = 0;
1909                         ret = ocfs2_xattr_block_set(inode, &xi, &xbs);
1910                 } else if (ret == -ENOSPC) {
1911                         if (di->i_xattr_loc && !xbs.xattr_bh) {
1912                                 ret = ocfs2_xattr_block_find(inode, name_index,
1913                                                              name, &xbs);
1914                                 if (ret)
1915                                         goto cleanup;
1916                         }
1917                         /*
1918                          * If no space in inode, we will set extended attribute
1919                          * into external block.
1920                          */
1921                         ret = ocfs2_xattr_block_set(inode, &xi, &xbs);
1922                         if (ret)
1923                                 goto cleanup;
1924                         if (!xis.not_found) {
1925                                 /*
1926                                  * If succeed and that extended attribute
1927                                  * existing in inode, we will remove it.
1928                                  */
1929                                 xi.value = NULL;
1930                                 xi.value_len = 0;
1931                                 ret = ocfs2_xattr_ibody_set(inode, &xi, &xis);
1932                         }
1933                 }
1934         }
1935 cleanup:
1936         up_write(&OCFS2_I(inode)->ip_xattr_sem);
1937         ocfs2_inode_unlock(inode, 1);
1938         brelse(di_bh);
1939         brelse(xbs.xattr_bh);
1940
1941         return ret;
1942 }
1943
1944 /*
1945  * Find the xattr extent rec which may contains name_hash.
1946  * e_cpos will be the first name hash of the xattr rec.
1947  * el must be the ocfs2_xattr_header.xb_attrs.xb_root.xt_list.
1948  */
1949 static int ocfs2_xattr_get_rec(struct inode *inode,
1950                                u32 name_hash,
1951                                u64 *p_blkno,
1952                                u32 *e_cpos,
1953                                u32 *num_clusters,
1954                                struct ocfs2_extent_list *el)
1955 {
1956         int ret = 0, i;
1957         struct buffer_head *eb_bh = NULL;
1958         struct ocfs2_extent_block *eb;
1959         struct ocfs2_extent_rec *rec = NULL;
1960         u64 e_blkno = 0;
1961
1962         if (el->l_tree_depth) {
1963                 ret = ocfs2_find_leaf(inode, el, name_hash, &eb_bh);
1964                 if (ret) {
1965                         mlog_errno(ret);
1966                         goto out;
1967                 }
1968
1969                 eb = (struct ocfs2_extent_block *) eb_bh->b_data;
1970                 el = &eb->h_list;
1971
1972                 if (el->l_tree_depth) {
1973                         ocfs2_error(inode->i_sb,
1974                                     "Inode %lu has non zero tree depth in "
1975                                     "xattr tree block %llu\n", inode->i_ino,
1976                                     (unsigned long long)eb_bh->b_blocknr);
1977                         ret = -EROFS;
1978                         goto out;
1979                 }
1980         }
1981
1982         for (i = le16_to_cpu(el->l_next_free_rec) - 1; i >= 0; i--) {
1983                 rec = &el->l_recs[i];
1984
1985                 if (le32_to_cpu(rec->e_cpos) <= name_hash) {
1986                         e_blkno = le64_to_cpu(rec->e_blkno);
1987                         break;
1988                 }
1989         }
1990
1991         if (!e_blkno) {
1992                 ocfs2_error(inode->i_sb, "Inode %lu has bad extent "
1993                             "record (%u, %u, 0) in xattr", inode->i_ino,
1994                             le32_to_cpu(rec->e_cpos),
1995                             ocfs2_rec_clusters(el, rec));
1996                 ret = -EROFS;
1997                 goto out;
1998         }
1999
2000         *p_blkno = le64_to_cpu(rec->e_blkno);
2001         *num_clusters = le16_to_cpu(rec->e_leaf_clusters);
2002         if (e_cpos)
2003                 *e_cpos = le32_to_cpu(rec->e_cpos);
2004 out:
2005         brelse(eb_bh);
2006         return ret;
2007 }
2008
2009 typedef int (xattr_bucket_func)(struct inode *inode,
2010                                 struct ocfs2_xattr_bucket *bucket,
2011                                 void *para);
2012
2013 static int ocfs2_iterate_xattr_buckets(struct inode *inode,
2014                                        u64 blkno,
2015                                        u32 clusters,
2016                                        xattr_bucket_func *func,
2017                                        void *para)
2018 {
2019         int i, j, ret = 0;
2020         int blk_per_bucket = ocfs2_blocks_per_xattr_bucket(inode->i_sb);
2021         u32 bpc = ocfs2_xattr_buckets_per_cluster(OCFS2_SB(inode->i_sb));
2022         u32 num_buckets = clusters * bpc;
2023         struct ocfs2_xattr_bucket bucket;
2024
2025         memset(&bucket, 0, sizeof(bucket));
2026
2027         mlog(0, "iterating xattr buckets in %u clusters starting from %llu\n",
2028              clusters, blkno);
2029
2030         for (i = 0; i < num_buckets; i++, blkno += blk_per_bucket) {
2031                 ret = ocfs2_read_blocks(OCFS2_SB(inode->i_sb),
2032                                         blkno, blk_per_bucket,
2033                                         bucket.bhs, OCFS2_BH_CACHED, inode);
2034                 if (ret) {
2035                         mlog_errno(ret);
2036                         goto out;
2037                 }
2038
2039                 bucket.xh = (struct ocfs2_xattr_header *)bucket.bhs[0]->b_data;
2040                 /*
2041                  * The real bucket num in this series of blocks is stored
2042                  * in the 1st bucket.
2043                  */
2044                 if (i == 0)
2045                         num_buckets = le16_to_cpu(bucket.xh->xh_num_buckets);
2046
2047                 mlog(0, "iterating xattr bucket %llu\n", blkno);
2048                 if (func) {
2049                         ret = func(inode, &bucket, para);
2050                         if (ret) {
2051                                 mlog_errno(ret);
2052                                 break;
2053                         }
2054                 }
2055
2056                 for (j = 0; j < blk_per_bucket; j++)
2057                         brelse(bucket.bhs[j]);
2058                 memset(&bucket, 0, sizeof(bucket));
2059         }
2060
2061 out:
2062         for (j = 0; j < blk_per_bucket; j++)
2063                 brelse(bucket.bhs[j]);
2064
2065         return ret;
2066 }
2067
2068 struct ocfs2_xattr_tree_list {
2069         char *buffer;
2070         size_t buffer_size;
2071 };
2072
2073 static int ocfs2_xattr_bucket_get_name_value(struct inode *inode,
2074                                              struct ocfs2_xattr_header *xh,
2075                                              int index,
2076                                              int *block_off,
2077                                              int *new_offset)
2078 {
2079         u16 name_offset;
2080
2081         if (index < 0 || index >= le16_to_cpu(xh->xh_count))
2082                 return -EINVAL;
2083
2084         name_offset = le16_to_cpu(xh->xh_entries[index].xe_name_offset);
2085
2086         *block_off = name_offset >> inode->i_sb->s_blocksize_bits;
2087         *new_offset = name_offset % inode->i_sb->s_blocksize;
2088
2089         return 0;
2090 }
2091
2092 static int ocfs2_list_xattr_bucket(struct inode *inode,
2093                                    struct ocfs2_xattr_bucket *bucket,
2094                                    void *para)
2095 {
2096         int ret = 0;
2097         struct ocfs2_xattr_tree_list *xl = (struct ocfs2_xattr_tree_list *)para;
2098         size_t size;
2099         int i, block_off, new_offset;
2100
2101         for (i = 0 ; i < le16_to_cpu(bucket->xh->xh_count); i++) {
2102                 struct ocfs2_xattr_entry *entry = &bucket->xh->xh_entries[i];
2103                 struct xattr_handler *handler =
2104                         ocfs2_xattr_handler(ocfs2_xattr_get_type(entry));
2105
2106                 if (handler) {
2107                         ret = ocfs2_xattr_bucket_get_name_value(inode,
2108                                                                 bucket->xh,
2109                                                                 i,
2110                                                                 &block_off,
2111                                                                 &new_offset);
2112                         if (ret)
2113                                 break;
2114                         size = handler->list(inode, xl->buffer, xl->buffer_size,
2115                                              bucket->bhs[block_off]->b_data +
2116                                              new_offset,
2117                                              entry->xe_name_len);
2118                         if (xl->buffer) {
2119                                 if (size > xl->buffer_size)
2120                                         return -ERANGE;
2121                                 xl->buffer += size;
2122                         }
2123                         xl->buffer_size -= size;
2124                 }
2125         }
2126
2127         return ret;
2128 }
2129
2130 static int ocfs2_xattr_tree_list_index_block(struct inode *inode,
2131                                              struct ocfs2_xattr_tree_root *xt,
2132                                              char *buffer,
2133                                              size_t buffer_size)
2134 {
2135         struct ocfs2_extent_list *el = &xt->xt_list;
2136         int ret = 0;
2137         u32 name_hash = UINT_MAX, e_cpos = 0, num_clusters = 0;
2138         u64 p_blkno = 0;
2139         struct ocfs2_xattr_tree_list xl = {
2140                 .buffer = buffer,
2141                 .buffer_size = buffer_size,
2142         };
2143
2144         if (le16_to_cpu(el->l_next_free_rec) == 0)
2145                 return 0;
2146
2147         while (name_hash > 0) {
2148                 ret = ocfs2_xattr_get_rec(inode, name_hash, &p_blkno,
2149                                           &e_cpos, &num_clusters, el);
2150                 if (ret) {
2151                         mlog_errno(ret);
2152                         goto out;
2153                 }
2154
2155                 ret = ocfs2_iterate_xattr_buckets(inode, p_blkno, num_clusters,
2156                                                   ocfs2_list_xattr_bucket,
2157                                                   &xl);
2158                 if (ret) {
2159                         mlog_errno(ret);
2160                         goto out;
2161                 }
2162
2163                 if (e_cpos == 0)
2164                         break;
2165
2166                 name_hash = e_cpos - 1;
2167         }
2168
2169         ret = buffer_size - xl.buffer_size;
2170 out:
2171         return ret;
2172 }