reiserfs_xattr.h 4.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
  File: linux/reiserfs_xattr.h
*/

5 6 7 8
#ifndef _LINUX_REISERFS_XATTR_H
#define _LINUX_REISERFS_XATTR_H

#include <linux/types.h>
L
Linus Torvalds 已提交
9 10

/* Magic value in header */
11
#define REISERFS_XATTR_MAGIC 0x52465841	/* "RFXA" */
L
Linus Torvalds 已提交
12 13

struct reiserfs_xattr_header {
14 15
	__le32 h_magic;		/* magic number for identification */
	__le32 h_hash;		/* hash of the value */
L
Linus Torvalds 已提交
16 17
};

18 19 20 21 22 23
struct reiserfs_security_handle {
	char *name;
	void *value;
	size_t length;
};

L
Linus Torvalds 已提交
24
#ifdef __KERNEL__
25

26
#include <linux/init.h>
27 28 29 30 31 32 33 34 35 36
#include <linux/list.h>
#include <linux/rwsem.h>
#include <linux/reiserfs_fs_i.h>
#include <linux/reiserfs_fs.h>

struct inode;
struct dentry;
struct iattr;
struct super_block;
struct nameidata;
L
Linus Torvalds 已提交
37

38 39 40
int reiserfs_xattr_register_handlers(void) __init;
void reiserfs_xattr_unregister_handlers(void);
int reiserfs_xattr_init(struct super_block *sb, int mount_flags);
41
int reiserfs_lookup_privroot(struct super_block *sb);
42 43 44
int reiserfs_delete_xattrs(struct inode *inode);
int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs);

L
Linus Torvalds 已提交
45 46
#ifdef CONFIG_REISERFS_FS_XATTR
#define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir)
47 48 49 50 51 52
ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name,
			  void *buffer, size_t size);
int reiserfs_setxattr(struct dentry *dentry, const char *name,
		      const void *value, size_t size, int flags);
ssize_t reiserfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
int reiserfs_removexattr(struct dentry *dentry, const char *name);
53
int reiserfs_permission(struct inode *inode, int mask);
54

55
int reiserfs_xattr_get(struct inode *, const char *, void *, size_t);
56
int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int);
J
Jeff Mahoney 已提交
57 58 59
int reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *,
			      struct inode *, const char *, const void *,
			      size_t, int);
L
Linus Torvalds 已提交
60

61 62 63
extern struct xattr_handler reiserfs_xattr_user_handler;
extern struct xattr_handler reiserfs_xattr_trusted_handler;
extern struct xattr_handler reiserfs_xattr_security_handler;
64 65 66 67 68 69 70 71
#ifdef CONFIG_REISERFS_FS_SECURITY
int reiserfs_security_init(struct inode *dir, struct inode *inode,
			   struct reiserfs_security_handle *sec);
int reiserfs_security_write(struct reiserfs_transaction_handle *th,
			    struct inode *inode,
			    struct reiserfs_security_handle *sec);
void reiserfs_security_free(struct reiserfs_security_handle *sec);
#endif
L
Linus Torvalds 已提交
72

J
Jeff Mahoney 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header))
static inline loff_t reiserfs_xattr_nblocks(struct inode *inode, loff_t size)
{
	loff_t ret = 0;
	if (reiserfs_file_data_log(inode)) {
		ret = _ROUND_UP(xattr_size(size), inode->i_sb->s_blocksize);
		ret >>= inode->i_sb->s_blocksize_bits;
	}
	return ret;
}

/* We may have to create up to 3 objects: xattr root, xattr dir, xattr file.
 * Let's try to be smart about it.
 * xattr root: We cache it. If it's not cached, we may need to create it.
 * xattr dir: If anything has been loaded for this inode, we can set a flag
 *            saying so.
 * xattr file: Since we don't cache xattrs, we can't tell. We always include
 *             blocks for it.
 *
 * However, since root and dir can be created between calls - YOU MUST SAVE
 * THIS VALUE.
 */
static inline size_t reiserfs_xattr_jcreate_nblocks(struct inode *inode)
{
	size_t nblocks = JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);

	if ((REISERFS_I(inode)->i_flags & i_has_xattr_dir) == 0) {
		nblocks += JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
101
		if (!REISERFS_SB(inode->i_sb)->xattr_root->d_inode)
J
Jeff Mahoney 已提交
102 103 104 105 106 107
			nblocks += JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
	}

	return nblocks;
}

108 109
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
{
110
	init_rwsem(&REISERFS_I(inode)->i_xattr_sem);
111 112
}

L
Linus Torvalds 已提交
113 114 115 116 117 118 119 120 121
#else

#define reiserfs_getxattr NULL
#define reiserfs_setxattr NULL
#define reiserfs_listxattr NULL
#define reiserfs_removexattr NULL

#define reiserfs_permission NULL

122 123 124
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
{
}
125 126
#endif  /*  CONFIG_REISERFS_FS_XATTR  */

127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
#ifndef CONFIG_REISERFS_FS_SECURITY
static inline int reiserfs_security_init(struct inode *dir,
					 struct inode *inode,
					 struct reiserfs_security_handle *sec)
{
	return 0;
}
static inline int
reiserfs_security_write(struct reiserfs_transaction_handle *th,
			struct inode *inode,
			struct reiserfs_security_handle *sec)
{
	return 0;
}
static inline void reiserfs_security_free(struct reiserfs_security_handle *sec)
{}
#endif

145
#endif  /*  __KERNEL__  */
L
Linus Torvalds 已提交
146

147
#endif  /*  _LINUX_REISERFS_XATTR_H  */