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