xref: /openbmc/linux/fs/f2fs/xattr.c (revision 9b93eb47)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * fs/f2fs/xattr.c
4  *
5  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6  *             http://www.samsung.com/
7  *
8  * Portions of this code from linux/fs/ext2/xattr.c
9  *
10  * Copyright (C) 2001-2003 Andreas Gruenbacher <agruen@suse.de>
11  *
12  * Fix by Harrison Xing <harrison@mountainviewdata.com>.
13  * Extended attributes for symlinks and special files added per
14  *  suggestion of Luka Renko <luka.renko@hermes.si>.
15  * xattr consolidation Copyright (c) 2004 James Morris <jmorris@redhat.com>,
16  *  Red Hat Inc.
17  */
18 #include <linux/rwsem.h>
19 #include <linux/f2fs_fs.h>
20 #include <linux/security.h>
21 #include <linux/posix_acl_xattr.h>
22 #include "f2fs.h"
23 #include "xattr.h"
24 
25 static int f2fs_xattr_generic_get(const struct xattr_handler *handler,
26 		struct dentry *unused, struct inode *inode,
27 		const char *name, void *buffer, size_t size)
28 {
29 	struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
30 
31 	switch (handler->flags) {
32 	case F2FS_XATTR_INDEX_USER:
33 		if (!test_opt(sbi, XATTR_USER))
34 			return -EOPNOTSUPP;
35 		break;
36 	case F2FS_XATTR_INDEX_TRUSTED:
37 	case F2FS_XATTR_INDEX_SECURITY:
38 		break;
39 	default:
40 		return -EINVAL;
41 	}
42 	return f2fs_getxattr(inode, handler->flags, name,
43 			     buffer, size, NULL);
44 }
45 
46 static int f2fs_xattr_generic_set(const struct xattr_handler *handler,
47 		struct dentry *unused, struct inode *inode,
48 		const char *name, const void *value,
49 		size_t size, int flags)
50 {
51 	struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
52 
53 	switch (handler->flags) {
54 	case F2FS_XATTR_INDEX_USER:
55 		if (!test_opt(sbi, XATTR_USER))
56 			return -EOPNOTSUPP;
57 		break;
58 	case F2FS_XATTR_INDEX_TRUSTED:
59 	case F2FS_XATTR_INDEX_SECURITY:
60 		break;
61 	default:
62 		return -EINVAL;
63 	}
64 	return f2fs_setxattr(inode, handler->flags, name,
65 					value, size, NULL, flags);
66 }
67 
68 static bool f2fs_xattr_user_list(struct dentry *dentry)
69 {
70 	struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
71 
72 	return test_opt(sbi, XATTR_USER);
73 }
74 
75 static bool f2fs_xattr_trusted_list(struct dentry *dentry)
76 {
77 	return capable(CAP_SYS_ADMIN);
78 }
79 
80 static int f2fs_xattr_advise_get(const struct xattr_handler *handler,
81 		struct dentry *unused, struct inode *inode,
82 		const char *name, void *buffer, size_t size)
83 {
84 	if (buffer)
85 		*((char *)buffer) = F2FS_I(inode)->i_advise;
86 	return sizeof(char);
87 }
88 
89 static int f2fs_xattr_advise_set(const struct xattr_handler *handler,
90 		struct dentry *unused, struct inode *inode,
91 		const char *name, const void *value,
92 		size_t size, int flags)
93 {
94 	unsigned char old_advise = F2FS_I(inode)->i_advise;
95 	unsigned char new_advise;
96 
97 	if (!inode_owner_or_capable(inode))
98 		return -EPERM;
99 	if (value == NULL)
100 		return -EINVAL;
101 
102 	new_advise = *(char *)value;
103 	if (new_advise & ~FADVISE_MODIFIABLE_BITS)
104 		return -EINVAL;
105 
106 	new_advise = new_advise & FADVISE_MODIFIABLE_BITS;
107 	new_advise |= old_advise & ~FADVISE_MODIFIABLE_BITS;
108 
109 	F2FS_I(inode)->i_advise = new_advise;
110 	f2fs_mark_inode_dirty_sync(inode, true);
111 	return 0;
112 }
113 
114 #ifdef CONFIG_F2FS_FS_SECURITY
115 static int f2fs_initxattrs(struct inode *inode, const struct xattr *xattr_array,
116 		void *page)
117 {
118 	const struct xattr *xattr;
119 	int err = 0;
120 
121 	for (xattr = xattr_array; xattr->name != NULL; xattr++) {
122 		err = f2fs_setxattr(inode, F2FS_XATTR_INDEX_SECURITY,
123 				xattr->name, xattr->value,
124 				xattr->value_len, (struct page *)page, 0);
125 		if (err < 0)
126 			break;
127 	}
128 	return err;
129 }
130 
131 int f2fs_init_security(struct inode *inode, struct inode *dir,
132 				const struct qstr *qstr, struct page *ipage)
133 {
134 	return security_inode_init_security(inode, dir, qstr,
135 				&f2fs_initxattrs, ipage);
136 }
137 #endif
138 
139 const struct xattr_handler f2fs_xattr_user_handler = {
140 	.prefix	= XATTR_USER_PREFIX,
141 	.flags	= F2FS_XATTR_INDEX_USER,
142 	.list	= f2fs_xattr_user_list,
143 	.get	= f2fs_xattr_generic_get,
144 	.set	= f2fs_xattr_generic_set,
145 };
146 
147 const struct xattr_handler f2fs_xattr_trusted_handler = {
148 	.prefix	= XATTR_TRUSTED_PREFIX,
149 	.flags	= F2FS_XATTR_INDEX_TRUSTED,
150 	.list	= f2fs_xattr_trusted_list,
151 	.get	= f2fs_xattr_generic_get,
152 	.set	= f2fs_xattr_generic_set,
153 };
154 
155 const struct xattr_handler f2fs_xattr_advise_handler = {
156 	.name	= F2FS_SYSTEM_ADVISE_NAME,
157 	.flags	= F2FS_XATTR_INDEX_ADVISE,
158 	.get    = f2fs_xattr_advise_get,
159 	.set    = f2fs_xattr_advise_set,
160 };
161 
162 const struct xattr_handler f2fs_xattr_security_handler = {
163 	.prefix	= XATTR_SECURITY_PREFIX,
164 	.flags	= F2FS_XATTR_INDEX_SECURITY,
165 	.get	= f2fs_xattr_generic_get,
166 	.set	= f2fs_xattr_generic_set,
167 };
168 
169 static const struct xattr_handler *f2fs_xattr_handler_map[] = {
170 	[F2FS_XATTR_INDEX_USER] = &f2fs_xattr_user_handler,
171 #ifdef CONFIG_F2FS_FS_POSIX_ACL
172 	[F2FS_XATTR_INDEX_POSIX_ACL_ACCESS] = &posix_acl_access_xattr_handler,
173 	[F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT] = &posix_acl_default_xattr_handler,
174 #endif
175 	[F2FS_XATTR_INDEX_TRUSTED] = &f2fs_xattr_trusted_handler,
176 #ifdef CONFIG_F2FS_FS_SECURITY
177 	[F2FS_XATTR_INDEX_SECURITY] = &f2fs_xattr_security_handler,
178 #endif
179 	[F2FS_XATTR_INDEX_ADVISE] = &f2fs_xattr_advise_handler,
180 };
181 
182 const struct xattr_handler *f2fs_xattr_handlers[] = {
183 	&f2fs_xattr_user_handler,
184 #ifdef CONFIG_F2FS_FS_POSIX_ACL
185 	&posix_acl_access_xattr_handler,
186 	&posix_acl_default_xattr_handler,
187 #endif
188 	&f2fs_xattr_trusted_handler,
189 #ifdef CONFIG_F2FS_FS_SECURITY
190 	&f2fs_xattr_security_handler,
191 #endif
192 	&f2fs_xattr_advise_handler,
193 	NULL,
194 };
195 
196 static inline const struct xattr_handler *f2fs_xattr_handler(int index)
197 {
198 	const struct xattr_handler *handler = NULL;
199 
200 	if (index > 0 && index < ARRAY_SIZE(f2fs_xattr_handler_map))
201 		handler = f2fs_xattr_handler_map[index];
202 	return handler;
203 }
204 
205 static struct f2fs_xattr_entry *__find_xattr(void *base_addr,
206 				void *last_base_addr, int index,
207 				size_t len, const char *name)
208 {
209 	struct f2fs_xattr_entry *entry;
210 
211 	list_for_each_xattr(entry, base_addr) {
212 		if ((void *)(entry) + sizeof(__u32) > last_base_addr ||
213 			(void *)XATTR_NEXT_ENTRY(entry) > last_base_addr)
214 			return NULL;
215 
216 		if (entry->e_name_index != index)
217 			continue;
218 		if (entry->e_name_len != len)
219 			continue;
220 		if (!memcmp(entry->e_name, name, len))
221 			break;
222 	}
223 	return entry;
224 }
225 
226 static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode,
227 				void *base_addr, void **last_addr, int index,
228 				size_t len, const char *name)
229 {
230 	struct f2fs_xattr_entry *entry;
231 	unsigned int inline_size = inline_xattr_size(inode);
232 	void *max_addr = base_addr + inline_size;
233 
234 	list_for_each_xattr(entry, base_addr) {
235 		if ((void *)entry + sizeof(__u32) > max_addr ||
236 			(void *)XATTR_NEXT_ENTRY(entry) > max_addr) {
237 			*last_addr = entry;
238 			return NULL;
239 		}
240 		if (entry->e_name_index != index)
241 			continue;
242 		if (entry->e_name_len != len)
243 			continue;
244 		if (!memcmp(entry->e_name, name, len))
245 			break;
246 	}
247 
248 	/* inline xattr header or entry across max inline xattr size */
249 	if (IS_XATTR_LAST_ENTRY(entry) &&
250 		(void *)entry + sizeof(__u32) > max_addr) {
251 		*last_addr = entry;
252 		return NULL;
253 	}
254 	return entry;
255 }
256 
257 static int read_inline_xattr(struct inode *inode, struct page *ipage,
258 							void *txattr_addr)
259 {
260 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
261 	unsigned int inline_size = inline_xattr_size(inode);
262 	struct page *page = NULL;
263 	void *inline_addr;
264 
265 	if (ipage) {
266 		inline_addr = inline_xattr_addr(inode, ipage);
267 	} else {
268 		page = f2fs_get_node_page(sbi, inode->i_ino);
269 		if (IS_ERR(page))
270 			return PTR_ERR(page);
271 
272 		inline_addr = inline_xattr_addr(inode, page);
273 	}
274 	memcpy(txattr_addr, inline_addr, inline_size);
275 	f2fs_put_page(page, 1);
276 
277 	return 0;
278 }
279 
280 static int read_xattr_block(struct inode *inode, void *txattr_addr)
281 {
282 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
283 	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
284 	unsigned int inline_size = inline_xattr_size(inode);
285 	struct page *xpage;
286 	void *xattr_addr;
287 
288 	/* The inode already has an extended attribute block. */
289 	xpage = f2fs_get_node_page(sbi, xnid);
290 	if (IS_ERR(xpage))
291 		return PTR_ERR(xpage);
292 
293 	xattr_addr = page_address(xpage);
294 	memcpy(txattr_addr + inline_size, xattr_addr, VALID_XATTR_BLOCK_SIZE);
295 	f2fs_put_page(xpage, 1);
296 
297 	return 0;
298 }
299 
300 static int lookup_all_xattrs(struct inode *inode, struct page *ipage,
301 				unsigned int index, unsigned int len,
302 				const char *name, struct f2fs_xattr_entry **xe,
303 				void **base_addr, int *base_size)
304 {
305 	void *cur_addr, *txattr_addr, *last_txattr_addr;
306 	void *last_addr = NULL;
307 	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
308 	unsigned int inline_size = inline_xattr_size(inode);
309 	int err = 0;
310 
311 	if (!xnid && !inline_size)
312 		return -ENODATA;
313 
314 	*base_size = XATTR_SIZE(xnid, inode) + XATTR_PADDING_SIZE;
315 	txattr_addr = f2fs_kzalloc(F2FS_I_SB(inode), *base_size, GFP_NOFS);
316 	if (!txattr_addr)
317 		return -ENOMEM;
318 
319 	last_txattr_addr = (void *)txattr_addr + XATTR_SIZE(xnid, inode);
320 
321 	/* read from inline xattr */
322 	if (inline_size) {
323 		err = read_inline_xattr(inode, ipage, txattr_addr);
324 		if (err)
325 			goto out;
326 
327 		*xe = __find_inline_xattr(inode, txattr_addr, &last_addr,
328 						index, len, name);
329 		if (*xe) {
330 			*base_size = inline_size;
331 			goto check;
332 		}
333 	}
334 
335 	/* read from xattr node block */
336 	if (xnid) {
337 		err = read_xattr_block(inode, txattr_addr);
338 		if (err)
339 			goto out;
340 	}
341 
342 	if (last_addr)
343 		cur_addr = XATTR_HDR(last_addr) - 1;
344 	else
345 		cur_addr = txattr_addr;
346 
347 	*xe = __find_xattr(cur_addr, last_txattr_addr, index, len, name);
348 	if (!*xe) {
349 		err = -EFAULT;
350 		goto out;
351 	}
352 check:
353 	if (IS_XATTR_LAST_ENTRY(*xe)) {
354 		err = -ENODATA;
355 		goto out;
356 	}
357 
358 	*base_addr = txattr_addr;
359 	return 0;
360 out:
361 	kvfree(txattr_addr);
362 	return err;
363 }
364 
365 static int read_all_xattrs(struct inode *inode, struct page *ipage,
366 							void **base_addr)
367 {
368 	struct f2fs_xattr_header *header;
369 	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
370 	unsigned int size = VALID_XATTR_BLOCK_SIZE;
371 	unsigned int inline_size = inline_xattr_size(inode);
372 	void *txattr_addr;
373 	int err;
374 
375 	txattr_addr = f2fs_kzalloc(F2FS_I_SB(inode),
376 			inline_size + size + XATTR_PADDING_SIZE, GFP_NOFS);
377 	if (!txattr_addr)
378 		return -ENOMEM;
379 
380 	/* read from inline xattr */
381 	if (inline_size) {
382 		err = read_inline_xattr(inode, ipage, txattr_addr);
383 		if (err)
384 			goto fail;
385 	}
386 
387 	/* read from xattr node block */
388 	if (xnid) {
389 		err = read_xattr_block(inode, txattr_addr);
390 		if (err)
391 			goto fail;
392 	}
393 
394 	header = XATTR_HDR(txattr_addr);
395 
396 	/* never been allocated xattrs */
397 	if (le32_to_cpu(header->h_magic) != F2FS_XATTR_MAGIC) {
398 		header->h_magic = cpu_to_le32(F2FS_XATTR_MAGIC);
399 		header->h_refcount = cpu_to_le32(1);
400 	}
401 	*base_addr = txattr_addr;
402 	return 0;
403 fail:
404 	kvfree(txattr_addr);
405 	return err;
406 }
407 
408 static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
409 				void *txattr_addr, struct page *ipage)
410 {
411 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
412 	size_t inline_size = inline_xattr_size(inode);
413 	struct page *in_page = NULL;
414 	void *xattr_addr;
415 	void *inline_addr = NULL;
416 	struct page *xpage;
417 	nid_t new_nid = 0;
418 	int err = 0;
419 
420 	if (hsize > inline_size && !F2FS_I(inode)->i_xattr_nid)
421 		if (!f2fs_alloc_nid(sbi, &new_nid))
422 			return -ENOSPC;
423 
424 	/* write to inline xattr */
425 	if (inline_size) {
426 		if (ipage) {
427 			inline_addr = inline_xattr_addr(inode, ipage);
428 		} else {
429 			in_page = f2fs_get_node_page(sbi, inode->i_ino);
430 			if (IS_ERR(in_page)) {
431 				f2fs_alloc_nid_failed(sbi, new_nid);
432 				return PTR_ERR(in_page);
433 			}
434 			inline_addr = inline_xattr_addr(inode, in_page);
435 		}
436 
437 		f2fs_wait_on_page_writeback(ipage ? ipage : in_page,
438 							NODE, true, true);
439 		/* no need to use xattr node block */
440 		if (hsize <= inline_size) {
441 			err = f2fs_truncate_xattr_node(inode);
442 			f2fs_alloc_nid_failed(sbi, new_nid);
443 			if (err) {
444 				f2fs_put_page(in_page, 1);
445 				return err;
446 			}
447 			memcpy(inline_addr, txattr_addr, inline_size);
448 			set_page_dirty(ipage ? ipage : in_page);
449 			goto in_page_out;
450 		}
451 	}
452 
453 	/* write to xattr node block */
454 	if (F2FS_I(inode)->i_xattr_nid) {
455 		xpage = f2fs_get_node_page(sbi, F2FS_I(inode)->i_xattr_nid);
456 		if (IS_ERR(xpage)) {
457 			err = PTR_ERR(xpage);
458 			f2fs_alloc_nid_failed(sbi, new_nid);
459 			goto in_page_out;
460 		}
461 		f2fs_bug_on(sbi, new_nid);
462 		f2fs_wait_on_page_writeback(xpage, NODE, true, true);
463 	} else {
464 		struct dnode_of_data dn;
465 		set_new_dnode(&dn, inode, NULL, NULL, new_nid);
466 		xpage = f2fs_new_node_page(&dn, XATTR_NODE_OFFSET);
467 		if (IS_ERR(xpage)) {
468 			err = PTR_ERR(xpage);
469 			f2fs_alloc_nid_failed(sbi, new_nid);
470 			goto in_page_out;
471 		}
472 		f2fs_alloc_nid_done(sbi, new_nid);
473 	}
474 	xattr_addr = page_address(xpage);
475 
476 	if (inline_size)
477 		memcpy(inline_addr, txattr_addr, inline_size);
478 	memcpy(xattr_addr, txattr_addr + inline_size, VALID_XATTR_BLOCK_SIZE);
479 
480 	if (inline_size)
481 		set_page_dirty(ipage ? ipage : in_page);
482 	set_page_dirty(xpage);
483 
484 	f2fs_put_page(xpage, 1);
485 in_page_out:
486 	f2fs_put_page(in_page, 1);
487 	return err;
488 }
489 
490 int f2fs_getxattr(struct inode *inode, int index, const char *name,
491 		void *buffer, size_t buffer_size, struct page *ipage)
492 {
493 	struct f2fs_xattr_entry *entry = NULL;
494 	int error = 0;
495 	unsigned int size, len;
496 	void *base_addr = NULL;
497 	int base_size;
498 
499 	if (name == NULL)
500 		return -EINVAL;
501 
502 	len = strlen(name);
503 	if (len > F2FS_NAME_LEN)
504 		return -ERANGE;
505 
506 	down_read(&F2FS_I(inode)->i_xattr_sem);
507 	error = lookup_all_xattrs(inode, ipage, index, len, name,
508 				&entry, &base_addr, &base_size);
509 	up_read(&F2FS_I(inode)->i_xattr_sem);
510 	if (error)
511 		return error;
512 
513 	size = le16_to_cpu(entry->e_value_size);
514 
515 	if (buffer && size > buffer_size) {
516 		error = -ERANGE;
517 		goto out;
518 	}
519 
520 	if (buffer) {
521 		char *pval = entry->e_name + entry->e_name_len;
522 
523 		if (base_size - (pval - (char *)base_addr) < size) {
524 			error = -ERANGE;
525 			goto out;
526 		}
527 		memcpy(buffer, pval, size);
528 	}
529 	error = size;
530 out:
531 	kvfree(base_addr);
532 	return error;
533 }
534 
535 ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
536 {
537 	struct inode *inode = d_inode(dentry);
538 	struct f2fs_xattr_entry *entry;
539 	void *base_addr;
540 	int error = 0;
541 	size_t rest = buffer_size;
542 
543 	down_read(&F2FS_I(inode)->i_xattr_sem);
544 	error = read_all_xattrs(inode, NULL, &base_addr);
545 	up_read(&F2FS_I(inode)->i_xattr_sem);
546 	if (error)
547 		return error;
548 
549 	list_for_each_xattr(entry, base_addr) {
550 		const struct xattr_handler *handler =
551 			f2fs_xattr_handler(entry->e_name_index);
552 		const char *prefix;
553 		size_t prefix_len;
554 		size_t size;
555 
556 		if (!handler || (handler->list && !handler->list(dentry)))
557 			continue;
558 
559 		prefix = xattr_prefix(handler);
560 		prefix_len = strlen(prefix);
561 		size = prefix_len + entry->e_name_len + 1;
562 		if (buffer) {
563 			if (size > rest) {
564 				error = -ERANGE;
565 				goto cleanup;
566 			}
567 			memcpy(buffer, prefix, prefix_len);
568 			buffer += prefix_len;
569 			memcpy(buffer, entry->e_name, entry->e_name_len);
570 			buffer += entry->e_name_len;
571 			*buffer++ = 0;
572 		}
573 		rest -= size;
574 	}
575 	error = buffer_size - rest;
576 cleanup:
577 	kvfree(base_addr);
578 	return error;
579 }
580 
581 static bool f2fs_xattr_value_same(struct f2fs_xattr_entry *entry,
582 					const void *value, size_t size)
583 {
584 	void *pval = entry->e_name + entry->e_name_len;
585 
586 	return (le16_to_cpu(entry->e_value_size) == size) &&
587 					!memcmp(pval, value, size);
588 }
589 
590 static int __f2fs_setxattr(struct inode *inode, int index,
591 			const char *name, const void *value, size_t size,
592 			struct page *ipage, int flags)
593 {
594 	struct f2fs_xattr_entry *here, *last;
595 	void *base_addr, *last_base_addr;
596 	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
597 	int found, newsize;
598 	size_t len;
599 	__u32 new_hsize;
600 	int error = 0;
601 
602 	if (name == NULL)
603 		return -EINVAL;
604 
605 	if (value == NULL)
606 		size = 0;
607 
608 	len = strlen(name);
609 
610 	if (len > F2FS_NAME_LEN)
611 		return -ERANGE;
612 
613 	if (size > MAX_VALUE_LEN(inode))
614 		return -E2BIG;
615 
616 	error = read_all_xattrs(inode, ipage, &base_addr);
617 	if (error)
618 		return error;
619 
620 	last_base_addr = (void *)base_addr + XATTR_SIZE(xnid, inode);
621 
622 	/* find entry with wanted name. */
623 	here = __find_xattr(base_addr, last_base_addr, index, len, name);
624 	if (!here) {
625 		error = -EFAULT;
626 		goto exit;
627 	}
628 
629 	found = IS_XATTR_LAST_ENTRY(here) ? 0 : 1;
630 
631 	if (found) {
632 		if ((flags & XATTR_CREATE)) {
633 			error = -EEXIST;
634 			goto exit;
635 		}
636 
637 		if (value && f2fs_xattr_value_same(here, value, size))
638 			goto exit;
639 	} else if ((flags & XATTR_REPLACE)) {
640 		error = -ENODATA;
641 		goto exit;
642 	}
643 
644 	last = here;
645 	while (!IS_XATTR_LAST_ENTRY(last))
646 		last = XATTR_NEXT_ENTRY(last);
647 
648 	newsize = XATTR_ALIGN(sizeof(struct f2fs_xattr_entry) + len + size);
649 
650 	/* 1. Check space */
651 	if (value) {
652 		int free;
653 		/*
654 		 * If value is NULL, it is remove operation.
655 		 * In case of update operation, we calculate free.
656 		 */
657 		free = MIN_OFFSET(inode) - ((char *)last - (char *)base_addr);
658 		if (found)
659 			free = free + ENTRY_SIZE(here);
660 
661 		if (unlikely(free < newsize)) {
662 			error = -E2BIG;
663 			goto exit;
664 		}
665 	}
666 
667 	/* 2. Remove old entry */
668 	if (found) {
669 		/*
670 		 * If entry is found, remove old entry.
671 		 * If not found, remove operation is not needed.
672 		 */
673 		struct f2fs_xattr_entry *next = XATTR_NEXT_ENTRY(here);
674 		int oldsize = ENTRY_SIZE(here);
675 
676 		memmove(here, next, (char *)last - (char *)next);
677 		last = (struct f2fs_xattr_entry *)((char *)last - oldsize);
678 		memset(last, 0, oldsize);
679 	}
680 
681 	new_hsize = (char *)last - (char *)base_addr;
682 
683 	/* 3. Write new entry */
684 	if (value) {
685 		char *pval;
686 		/*
687 		 * Before we come here, old entry is removed.
688 		 * We just write new entry.
689 		 */
690 		last->e_name_index = index;
691 		last->e_name_len = len;
692 		memcpy(last->e_name, name, len);
693 		pval = last->e_name + len;
694 		memcpy(pval, value, size);
695 		last->e_value_size = cpu_to_le16(size);
696 		new_hsize += newsize;
697 	}
698 
699 	error = write_all_xattrs(inode, new_hsize, base_addr, ipage);
700 	if (error)
701 		goto exit;
702 
703 	if (is_inode_flag_set(inode, FI_ACL_MODE)) {
704 		inode->i_mode = F2FS_I(inode)->i_acl_mode;
705 		inode->i_ctime = current_time(inode);
706 		clear_inode_flag(inode, FI_ACL_MODE);
707 	}
708 	if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
709 			!strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
710 		f2fs_set_encrypted_inode(inode);
711 	f2fs_mark_inode_dirty_sync(inode, true);
712 	if (!error && S_ISDIR(inode->i_mode))
713 		set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_CP);
714 exit:
715 	kvfree(base_addr);
716 	return error;
717 }
718 
719 int f2fs_setxattr(struct inode *inode, int index, const char *name,
720 				const void *value, size_t size,
721 				struct page *ipage, int flags)
722 {
723 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
724 	int err;
725 
726 	err = dquot_initialize(inode);
727 	if (err)
728 		return err;
729 
730 	/* this case is only from f2fs_init_inode_metadata */
731 	if (ipage)
732 		return __f2fs_setxattr(inode, index, name, value,
733 						size, ipage, flags);
734 	f2fs_balance_fs(sbi, true);
735 
736 	f2fs_lock_op(sbi);
737 	/* protect xattr_ver */
738 	down_write(&F2FS_I(inode)->i_sem);
739 	down_write(&F2FS_I(inode)->i_xattr_sem);
740 	err = __f2fs_setxattr(inode, index, name, value, size, ipage, flags);
741 	up_write(&F2FS_I(inode)->i_xattr_sem);
742 	up_write(&F2FS_I(inode)->i_sem);
743 	f2fs_unlock_op(sbi);
744 
745 	f2fs_update_time(sbi, REQ_TIME);
746 	return err;
747 }
748