10a8165d7c2cf1395059db20ab07665baf3758fcdJaegeuk Kim/*
2af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * fs/f2fs/xattr.h
3af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *
4af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *             http://www.samsung.com/
6af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *
7af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * Portions of this code from linux/fs/ext2/xattr.h
8af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *
9af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * On-disk format of extended attributes for the ext2 filesystem.
10af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *
11af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
12af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *
13af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * This program is free software; you can redistribute it and/or modify
14af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * it under the terms of the GNU General Public License version 2 as
15af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * published by the Free Software Foundation.
16af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim */
17af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#ifndef __F2FS_XATTR_H__
18af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define __F2FS_XATTR_H__
19af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
20af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#include <linux/init.h>
21af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#include <linux/xattr.h>
22af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
23af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim/* Magic value in attribute blocks */
24af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_MAGIC                0xF2F52011
25af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
26af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim/* Maximum number of references to one attribute block */
27af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_REFCOUNT_MAX         1024
28af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
29af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim/* Name indexes */
30af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_SYSTEM_ADVISE_PREFIX		"system.advise"
31af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_INDEX_USER			1
32af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_INDEX_POSIX_ACL_ACCESS	2
33af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT	3
34af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_INDEX_TRUSTED		4
35af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_INDEX_LUSTRE			5
36af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_INDEX_SECURITY		6
37af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define F2FS_XATTR_INDEX_ADVISE			7
38af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
39af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kimstruct f2fs_xattr_header {
40af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	__le32  h_magic;        /* magic number for identification */
41af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	__le32  h_refcount;     /* reference count */
42af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	__u32   h_reserved[4];  /* zero right now */
43af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim};
44af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
45af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kimstruct f2fs_xattr_entry {
46af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	__u8    e_name_index;
47af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	__u8    e_name_len;
48af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	__le16  e_value_size;   /* size of attribute value */
49af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	char    e_name[0];      /* attribute name */
50af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim};
51af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
52af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define XATTR_HDR(ptr)		((struct f2fs_xattr_header *)(ptr))
53af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define XATTR_ENTRY(ptr)	((struct f2fs_xattr_entry *)(ptr))
54dd9cfe236f95bbda9ceb5a4ca419b9fb574c95f9Jaegeuk Kim#define XATTR_FIRST_ENTRY(ptr)	(XATTR_ENTRY(XATTR_HDR(ptr) + 1))
55af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define XATTR_ROUND		(3)
56af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
57af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define XATTR_ALIGN(size)	((size + XATTR_ROUND) & ~XATTR_ROUND)
58af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
59af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define ENTRY_SIZE(entry) (XATTR_ALIGN(sizeof(struct f2fs_xattr_entry) + \
60af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim			entry->e_name_len + le16_to_cpu(entry->e_value_size)))
61af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
62af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define XATTR_NEXT_ENTRY(entry)	((struct f2fs_xattr_entry *)((char *)(entry) +\
63af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim			ENTRY_SIZE(entry)))
64af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
65af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define IS_XATTR_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0)
66af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
67af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define list_for_each_xattr(entry, addr) \
68af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim		for (entry = XATTR_FIRST_ENTRY(addr);\
69af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim				!IS_XATTR_LAST_ENTRY(entry);\
70af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim				entry = XATTR_NEXT_ENTRY(entry))
71af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
7265985d935ddd5657c66a8bb3ae9752ed842549b8Jaegeuk Kim#define MIN_OFFSET(i)	XATTR_ALIGN(inline_xattr_size(i) + PAGE_SIZE -	\
7365985d935ddd5657c66a8bb3ae9752ed842549b8Jaegeuk Kim				sizeof(struct node_footer) - sizeof(__u32))
74af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
7565985d935ddd5657c66a8bb3ae9752ed842549b8Jaegeuk Kim#define MAX_VALUE_LEN(i)	(MIN_OFFSET(i) -			\
7665985d935ddd5657c66a8bb3ae9752ed842549b8Jaegeuk Kim				sizeof(struct f2fs_xattr_header) -	\
7765985d935ddd5657c66a8bb3ae9752ed842549b8Jaegeuk Kim				sizeof(struct f2fs_xattr_entry))
78af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
790a8165d7c2cf1395059db20ab07665baf3758fcdJaegeuk Kim/*
80af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * On-disk structure of f2fs_xattr
8165985d935ddd5657c66a8bb3ae9752ed842549b8Jaegeuk Kim * We use inline xattrs space + 1 block for xattr.
82af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *
83af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * +--------------------+
84af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | f2fs_xattr_header  |
85af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * |                    |
86af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * +--------------------+
87af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | f2fs_xattr_entry   |
88af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | .e_name_index = 1  |
89af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | .e_name_len = 3    |
90af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | .e_value_size = 14 |
91af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | .e_name = "foo"    |
92af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | "value_of_xattr"   |<- value_offs = e_name + e_name_len
93af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * +--------------------+
94af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | f2fs_xattr_entry   |
95af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | .e_name_index = 4  |
96af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | .e_name = "bar"    |
97af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * +--------------------+
98af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * |                    |
99af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * |        Free        |
100af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * |                    |
101af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * +--------------------+<- MIN_OFFSET
102af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * |   node_footer      |
103af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * | (nid, ino, offset) |
104af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim * +--------------------+
105af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim *
106af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim **/
107af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
108af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#ifdef CONFIG_F2FS_FS_XATTR
109af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kimextern const struct xattr_handler f2fs_xattr_user_handler;
110af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kimextern const struct xattr_handler f2fs_xattr_trusted_handler;
111af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kimextern const struct xattr_handler f2fs_xattr_advise_handler;
1128ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kimextern const struct xattr_handler f2fs_xattr_security_handler;
113af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
114af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kimextern const struct xattr_handler *f2fs_xattr_handlers[];
115af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
1168ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kimextern int f2fs_setxattr(struct inode *, int, const char *,
117c02745ef684f9a6f98f30388ed048ee460db5483Jaegeuk Kim				const void *, size_t, struct page *, int);
1188ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kimextern int f2fs_getxattr(struct inode *, int, const char *, void *, size_t);
1198ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kimextern ssize_t f2fs_listxattr(struct dentry *, char *, size_t);
120af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#else
121af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
122af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#define f2fs_xattr_handlers	NULL
123e112326805a50ee2016faf0971660122471f7c04Jaegeuk Kimstatic inline int f2fs_setxattr(struct inode *inode, int index,
124c02745ef684f9a6f98f30388ed048ee460db5483Jaegeuk Kim		const char *name, const void *value, size_t size, int flags)
125af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim{
126af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	return -EOPNOTSUPP;
127af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim}
128e112326805a50ee2016faf0971660122471f7c04Jaegeuk Kimstatic inline int f2fs_getxattr(struct inode *inode, int index,
129af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim		const char *name, void *buffer, size_t buffer_size)
130af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim{
131af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	return -EOPNOTSUPP;
132af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim}
133af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kimstatic inline ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer,
134af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim		size_t buffer_size)
135af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim{
136af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim	return -EOPNOTSUPP;
137af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim}
138af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#endif
139af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim
1408ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim#ifdef CONFIG_F2FS_FS_SECURITY
1418ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kimextern int f2fs_init_security(struct inode *, struct inode *,
1428ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim				const struct qstr *, struct page *);
1438ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim#else
1448ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kimstatic inline int f2fs_init_security(struct inode *inode, struct inode *dir,
1458ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim				const struct qstr *qstr, struct page *ipage)
1468ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim{
1478ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim	return 0;
1488ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim}
1498ae8f1627f39bae505b90cade50cd8a911b8bda6Jaegeuk Kim#endif
150af48b85b8cd3fbb12c9b6759c16db6d69c0b03daJaegeuk Kim#endif /* __F2FS_XATTR_H__ */
151