xattr.h 11.3 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
Tao Ma 已提交
171 172 173
extern int ext4_read_inline_dir(struct file *filp,
				void *dirent, filldir_t filldir,
				int *has_inline_data);
174 175 176 177
extern struct buffer_head *ext4_find_inline_entry(struct inode *dir,
					const struct qstr *d_name,
					struct ext4_dir_entry_2 **res_dir,
					int *has_inline_data);
178 179 180 181 182
extern int ext4_delete_inline_entry(handle_t *handle,
				    struct inode *dir,
				    struct ext4_dir_entry_2 *de_del,
				    struct buffer_head *bh,
				    int *has_inline_data);
T
Tao Ma 已提交
183
extern int empty_inline_dir(struct inode *dir, int *has_inline_data);
T
Tao Ma 已提交
184 185 186
extern struct buffer_head *ext4_get_first_inline_block(struct inode *inode,
					struct ext4_dir_entry_2 **parent_de,
					int *retval);
T
Tao Ma 已提交
187 188 189
extern int ext4_inline_data_fiemap(struct inode *inode,
				   struct fiemap_extent_info *fieinfo,
				   int *has_inline);
T
Theodore Ts'o 已提交
190
# else  /* CONFIG_EXT4_FS_XATTR */
191 192

static inline int
193
ext4_xattr_get(struct inode *inode, int name_index, const char *name,
194 195 196 197 198 199
	       void *buffer, size_t size, int flags)
{
	return -EOPNOTSUPP;
}

static inline int
200
ext4_xattr_set(struct inode *inode, int name_index, const char *name,
201 202 203 204 205 206
	       const void *value, size_t size, int flags)
{
	return -EOPNOTSUPP;
}

static inline int
207
ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
208 209 210 211 212 213
	       const char *name, const void *value, size_t size, int flags)
{
	return -EOPNOTSUPP;
}

static inline void
214
ext4_xattr_delete_inode(handle_t *handle, struct inode *inode)
215 216 217 218
{
}

static inline void
219
ext4_xattr_put_super(struct super_block *sb)
220 221 222
{
}

223
static __init inline int
224
ext4_init_xattr(void)
225 226 227 228 229
{
	return 0;
}

static inline void
230
ext4_exit_xattr(void)
231 232 233
{
}

234 235 236 237 238 239 240
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;
}

241
#define ext4_xattr_handlers	NULL
242

T
Tao Ma 已提交
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
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;
}

266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
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 已提交
306 307 308 309 310

static inline int ext4_readpage_inline(struct inode *inode, struct page *page)
{
	return 0;
}
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327

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;
}
328 329 330 331 332 333 334 335

static inline struct buffer_head *
ext4_journalled_write_inline_data(struct inode *inode,
				  unsigned len,
				  struct page *page)
{
	return NULL;
}
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353

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;
}
354 355 356 357 358 359 360 361 362 363 364 365 366 367

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
Tao Ma 已提交
368 369 370 371 372 373
static inline int ext4_read_inline_dir(struct file *filp,
				       void *dirent, filldir_t filldir,
				       int *has_inline_data)
{
	return 0;
}
374 375 376 377 378 379 380 381 382

static inline struct buffer_head *
ext4_find_inline_entry(struct inode *dir,
		       const struct qstr *d_name,
		       struct ext4_dir_entry_2 **res_dir,
		       int *has_inline_data)
{
	return NULL;
}
383 384 385 386 387 388 389 390
static inline int ext4_delete_inline_entry(handle_t *handle,
					   struct inode *dir,
					   struct ext4_dir_entry_2 *de_del,
					   struct buffer_head *bh,
					   int *has_inline_data)
{
	return 0;
}
T
Tao Ma 已提交
391 392 393 394 395

static inline int empty_inline_dir(struct inode *dir, int *has_inline_data)
{
	return 0;
}
T
Tao Ma 已提交
396 397 398 399 400 401 402 403

static inline struct buffer_head *
ext4_get_first_inline_block(struct inode *inode,
			    struct ext4_dir_entry_2 **parent_de,
			    int *retval)
{
	return NULL;
}
T
Tao Ma 已提交
404 405 406 407 408 409 410

static inline int ext4_inline_data_fiemap(struct inode *inode,
					  struct fiemap_extent_info *fieinfo,
					  int *has_inline)
{
	return 0;
}
T
Theodore Ts'o 已提交
411
# endif  /* CONFIG_EXT4_FS_XATTR */
412

T
Theodore Ts'o 已提交
413
#ifdef CONFIG_EXT4_FS_SECURITY
414
extern int ext4_init_security(handle_t *handle, struct inode *inode,
415
			      struct inode *dir, const struct qstr *qstr);
416
#else
417
static inline int ext4_init_security(handle_t *handle, struct inode *inode,
418
				     struct inode *dir, const struct qstr *qstr)
419 420 421 422
{
	return 0;
}
#endif