xattr.h 9.6 KB
Newer Older
1
/*
2
  File: fs/ext4/xattr.h
3

4
  On-disk format of extended attributes for the ext4 filesystem.
5 6 7 8 9 10 11

  (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
*/

#include <linux/xattr.h>

/* Magic value in attribute blocks */
12
#define EXT4_XATTR_MAGIC		0xEA020000
13 14

/* Maximum number of references to one attribute block */
15
#define EXT4_XATTR_REFCOUNT_MAX		1024
16 17

/* Name indexes */
18 19 20 21 22 23
#define EXT4_XATTR_INDEX_USER			1
#define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS	2
#define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT	3
#define EXT4_XATTR_INDEX_TRUSTED		4
#define	EXT4_XATTR_INDEX_LUSTRE			5
#define EXT4_XATTR_INDEX_SECURITY	        6
24
#define EXT4_XATTR_INDEX_SYSTEM			7
25 26

struct ext4_xattr_header {
27 28 29 30
	__le32	h_magic;	/* magic number for identification */
	__le32	h_refcount;	/* reference count */
	__le32	h_blocks;	/* number of disk blocks used */
	__le32	h_hash;		/* hash value of all attributes */
31 32 33
	__le32	h_checksum;	/* crc32c(uuid+id+xattrblock) */
				/* id = inum if refcount=1, blknum otherwise */
	__u32	h_reserved[3];	/* zero right now */
34 35
};

36
struct ext4_xattr_ibody_header {
37 38 39
	__le32	h_magic;	/* magic number for identification */
};

40
struct ext4_xattr_entry {
41 42 43 44 45 46 47 48 49
	__u8	e_name_len;	/* length of name */
	__u8	e_name_index;	/* attribute name index */
	__le16	e_value_offs;	/* offset in disk block of value */
	__le32	e_value_block;	/* disk block attribute is stored on (n/i) */
	__le32	e_value_size;	/* size of attribute value */
	__le32	e_hash;		/* hash value of name and value */
	char	e_name[0];	/* attribute name */
};

50 51 52 53 54 55 56
#define EXT4_XATTR_PAD_BITS		2
#define EXT4_XATTR_PAD		(1<<EXT4_XATTR_PAD_BITS)
#define EXT4_XATTR_ROUND		(EXT4_XATTR_PAD-1)
#define EXT4_XATTR_LEN(name_len) \
	(((name_len) + EXT4_XATTR_ROUND + \
	sizeof(struct ext4_xattr_entry)) & ~EXT4_XATTR_ROUND)
#define EXT4_XATTR_NEXT(entry) \
57 58
	((struct ext4_xattr_entry *)( \
	 (char *)(entry) + EXT4_XATTR_LEN((entry)->e_name_len)))
59 60
#define EXT4_XATTR_SIZE(size) \
	(((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND)
61

62 63 64 65 66 67 68
#define IHDR(inode, raw_inode) \
	((struct ext4_xattr_ibody_header *) \
		((void *)raw_inode + \
		EXT4_GOOD_OLD_INODE_SIZE + \
		EXT4_I(inode)->i_extra_isize))
#define IFIRST(hdr) ((struct ext4_xattr_entry *)((hdr)+1))

T
Tao Ma 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
#define BHDR(bh) ((struct ext4_xattr_header *)((bh)->b_data))
#define ENTRY(ptr) ((struct ext4_xattr_entry *)(ptr))
#define BFIRST(bh) ENTRY(BHDR(bh)+1)
#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0)


struct ext4_xattr_info {
	int name_index;
	const char *name;
	const void *value;
	size_t value_len;
};

struct ext4_xattr_search {
	struct ext4_xattr_entry *first;
	void *base;
	void *end;
	struct ext4_xattr_entry *here;
	int not_found;
};

struct ext4_xattr_ibody_find {
	struct ext4_xattr_search s;
	struct ext4_iloc iloc;
};

T
Theodore Ts'o 已提交
95
# ifdef CONFIG_EXT4_FS_XATTR
96

S
Stephen Hemminger 已提交
97 98 99 100 101
extern const struct xattr_handler ext4_xattr_user_handler;
extern const struct xattr_handler ext4_xattr_trusted_handler;
extern const struct xattr_handler ext4_xattr_acl_access_handler;
extern const struct xattr_handler ext4_xattr_acl_default_handler;
extern const struct xattr_handler ext4_xattr_security_handler;
102

103
extern ssize_t ext4_listxattr(struct dentry *, char *, size_t);
104

105 106 107
extern int ext4_xattr_get(struct inode *, int, const char *, void *, size_t);
extern int ext4_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
extern int ext4_xattr_set_handle(handle_t *, struct inode *, int, const char *, const void *, size_t, int);
108

109 110
extern void ext4_xattr_delete_inode(handle_t *, struct inode *);
extern void ext4_xattr_put_super(struct super_block *);
111

112 113 114
extern int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
			    struct ext4_inode *raw_inode, handle_t *handle);

115 116
extern int __init ext4_init_xattr(void);
extern void ext4_exit_xattr(void);
117

S
Stephen Hemminger 已提交
118
extern const struct xattr_handler *ext4_xattr_handlers[];
119

T
Tao Ma 已提交
120 121 122 123 124 125 126 127 128
extern int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i,
				 struct ext4_xattr_ibody_find *is);
extern int ext4_xattr_ibody_get(struct inode *inode, int name_index,
				const char *name,
				void *buffer, size_t buffer_size);
extern int ext4_xattr_ibody_set(handle_t *handle, struct inode *inode,
				struct ext4_xattr_info *i,
				struct ext4_xattr_ibody_find *is);

129 130 131 132 133 134 135 136 137 138 139 140 141
extern int ext4_has_inline_data(struct inode *inode);
extern int ext4_get_inline_size(struct inode *inode);
extern int ext4_get_max_inline_size(struct inode *inode);
extern int ext4_find_inline_data_nolock(struct inode *inode);
extern void ext4_write_inline_data(struct inode *inode,
				   struct ext4_iloc *iloc,
				   void *buffer, loff_t pos,
				   unsigned int len);
extern int ext4_prepare_inline_data(handle_t *handle, struct inode *inode,
				    unsigned int len);
extern int ext4_init_inline_data(handle_t *handle, struct inode *inode,
				 unsigned int len);
extern int ext4_destroy_inline_data(handle_t *handle, struct inode *inode);
T
Tao Ma 已提交
142 143

extern int ext4_readpage_inline(struct inode *inode, struct page *page);
144 145 146 147 148 149 150 151 152
extern int ext4_try_to_write_inline_data(struct address_space *mapping,
					 struct inode *inode,
					 loff_t pos, unsigned len,
					 unsigned flags,
					 struct page **pagep);
extern int ext4_write_inline_data_end(struct inode *inode,
				      loff_t pos, unsigned len,
				      unsigned copied,
				      struct page *page);
153 154 155 156
extern struct buffer_head *
ext4_journalled_write_inline_data(struct inode *inode,
				  unsigned len,
				  struct page *page);
157 158 159 160 161 162 163 164 165
extern int ext4_da_write_inline_data_begin(struct address_space *mapping,
					   struct inode *inode,
					   loff_t pos, unsigned len,
					   unsigned flags,
					   struct page **pagep,
					   void **fsdata);
extern int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos,
					 unsigned len, unsigned copied,
					 struct page *page);
166 167 168 169 170
extern int ext4_try_add_inline_entry(handle_t *handle, struct dentry *dentry,
				     struct inode *inode);
extern int ext4_try_create_inline_dir(handle_t *handle,
				      struct inode *parent,
				      struct inode *inode);
T
Theodore Ts'o 已提交
171
# else  /* CONFIG_EXT4_FS_XATTR */
172 173

static inline int
174
ext4_xattr_get(struct inode *inode, int name_index, const char *name,
175 176 177 178 179 180
	       void *buffer, size_t size, int flags)
{
	return -EOPNOTSUPP;
}

static inline int
181
ext4_xattr_set(struct inode *inode, int name_index, const char *name,
182 183 184 185 186 187
	       const void *value, size_t size, int flags)
{
	return -EOPNOTSUPP;
}

static inline int
188
ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
189 190 191 192 193 194
	       const char *name, const void *value, size_t size, int flags)
{
	return -EOPNOTSUPP;
}

static inline void
195
ext4_xattr_delete_inode(handle_t *handle, struct inode *inode)
196 197 198 199
{
}

static inline void
200
ext4_xattr_put_super(struct super_block *sb)
201 202 203
{
}

204
static __init inline int
205
ext4_init_xattr(void)
206 207 208 209 210
{
	return 0;
}

static inline void
211
ext4_exit_xattr(void)
212 213 214
{
}

215 216 217 218 219 220 221
static inline int
ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
			    struct ext4_inode *raw_inode, handle_t *handle)
{
	return -EOPNOTSUPP;
}

222
#define ext4_xattr_handlers	NULL
223

T
Tao Ma 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
static inline int
ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i,
		      struct ext4_xattr_ibody_find *is)
{
	return -EOPNOTSUPP;
}

static inline int
ext4_xattr_ibody_set(handle_t *handle, struct inode *inode,
		     struct ext4_xattr_info *i,
		     struct ext4_xattr_ibody_find *is)
{
	return -EOPNOTSUPP;
}

static inline int
ext4_xattr_ibody_get(struct inode *inode, int name_index,
		     const char *name,
		     void *buffer, size_t buffer_size)
{
	return -EOPNOTSUPP;
}

247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
static inline int ext4_find_inline_data_nolock(struct inode *inode)
{
	return 0;
}

static inline int ext4_has_inline_data(struct inode *inode)
{
	return 0;
}

static inline int ext4_get_inline_size(struct inode *inode)
{
	return 0;
}

static inline int ext4_get_max_inline_size(struct inode *inode)
{
	return 0;
}

static inline void ext4_write_inline_data(struct inode *inode,
					  struct ext4_iloc *iloc,
					  void *buffer, loff_t pos,
					  unsigned int len)
{
	return;
}

static inline int ext4_init_inline_data(handle_t *handle,
					struct inode *inode,
					unsigned int len)
{
	return 0;
}

static inline int ext4_destroy_inline_data(handle_t *handle,
					   struct inode *inode)
{
	return 0;
}
T
Tao Ma 已提交
287 288 289 290 291

static inline int ext4_readpage_inline(struct inode *inode, struct page *page)
{
	return 0;
}
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308

static inline int ext4_try_to_write_inline_data(struct address_space *mapping,
						struct inode *inode,
						loff_t pos, unsigned len,
						unsigned flags,
						struct page **pagep)
{
	return 0;
}

static inline int ext4_write_inline_data_end(struct inode *inode,
					     loff_t pos, unsigned len,
					     unsigned copied,
					     struct page *page)
{
	return 0;
}
309 310 311 312 313 314 315 316

static inline struct buffer_head *
ext4_journalled_write_inline_data(struct inode *inode,
				  unsigned len,
				  struct page *page)
{
	return NULL;
}
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334

static inline int
ext4_da_write_inline_data_begin(struct address_space *mapping,
				struct inode *inode,
				loff_t pos, unsigned len,
				unsigned flags,
				struct page **pagep,
				void **fsdata)
{
	return 0;
}

static inline int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos,
						unsigned len, unsigned copied,
						struct page *page)
{
	return 0;
}
335 336 337 338 339 340 341 342 343 344 345 346 347 348

static inline int ext4_try_add_inline_entry(handle_t *handle,
					    struct dentry *dentry,
					    struct inode *inode)
{
	return 0;
}

static inline int ext4_try_create_inline_dir(handle_t *handle,
					     struct inode *parent,
					     struct inode *inode)
{
	return 0;
}
T
Theodore Ts'o 已提交
349
# endif  /* CONFIG_EXT4_FS_XATTR */
350

T
Theodore Ts'o 已提交
351
#ifdef CONFIG_EXT4_FS_SECURITY
352
extern int ext4_init_security(handle_t *handle, struct inode *inode,
353
			      struct inode *dir, const struct qstr *qstr);
354
#else
355
static inline int ext4_init_security(handle_t *handle, struct inode *inode,
356
				     struct inode *dir, const struct qstr *qstr)
357 358 359 360
{
	return 0;
}
#endif