mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
a72bdb1cd2
The current reiserfs xattr implementation will not clean up old xattr files if files are deleted when REISERFS_FS_XATTR is unset. This results in inaccessible lost files, wasting space. This patch compiles in basic xattr knowledge, such as how to delete them and change ownership for quota tracking. If the file system has never used xattrs, then the operation is quite fast: it returns immediately when it sees there is no .reiserfs_priv directory. Signed-off-by: Jeff Mahoney <jeffm@suse.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
131 lines
3.7 KiB
C
131 lines
3.7 KiB
C
/*
|
|
File: linux/reiserfs_xattr.h
|
|
*/
|
|
|
|
#ifndef _LINUX_REISERFS_XATTR_H
|
|
#define _LINUX_REISERFS_XATTR_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
/* Magic value in header */
|
|
#define REISERFS_XATTR_MAGIC 0x52465841 /* "RFXA" */
|
|
|
|
struct reiserfs_xattr_header {
|
|
__le32 h_magic; /* magic number for identification */
|
|
__le32 h_hash; /* hash of the value */
|
|
};
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/init.h>
|
|
#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;
|
|
|
|
struct reiserfs_xattr_handler {
|
|
char *prefix;
|
|
int (*init) (void);
|
|
void (*exit) (void);
|
|
int (*get) (struct inode * inode, const char *name, void *buffer,
|
|
size_t size);
|
|
int (*set) (struct inode * inode, const char *name, const void *buffer,
|
|
size_t size, int flags);
|
|
int (*del) (struct inode * inode, const char *name);
|
|
int (*list) (struct inode * inode, const char *name, int namelen,
|
|
char *out);
|
|
struct list_head handlers;
|
|
};
|
|
|
|
int reiserfs_xattr_register_handlers(void) __init;
|
|
void reiserfs_xattr_unregister_handlers(void);
|
|
int reiserfs_xattr_init(struct super_block *sb, int mount_flags);
|
|
int reiserfs_delete_xattrs(struct inode *inode);
|
|
int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs);
|
|
|
|
#ifdef CONFIG_REISERFS_FS_XATTR
|
|
#define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir)
|
|
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);
|
|
int reiserfs_permission(struct inode *inode, int mask);
|
|
|
|
int reiserfs_xattr_del(struct inode *, const char *);
|
|
int reiserfs_xattr_get(const struct inode *, const char *, void *, size_t);
|
|
int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int);
|
|
|
|
extern struct reiserfs_xattr_handler user_handler;
|
|
extern struct reiserfs_xattr_handler trusted_handler;
|
|
extern struct reiserfs_xattr_handler security_handler;
|
|
|
|
static inline void reiserfs_write_lock_xattrs(struct super_block *sb)
|
|
{
|
|
down_write(&REISERFS_XATTR_DIR_SEM(sb));
|
|
}
|
|
static inline void reiserfs_write_unlock_xattrs(struct super_block *sb)
|
|
{
|
|
up_write(&REISERFS_XATTR_DIR_SEM(sb));
|
|
}
|
|
static inline void reiserfs_read_lock_xattrs(struct super_block *sb)
|
|
{
|
|
down_read(&REISERFS_XATTR_DIR_SEM(sb));
|
|
}
|
|
|
|
static inline void reiserfs_read_unlock_xattrs(struct super_block *sb)
|
|
{
|
|
up_read(&REISERFS_XATTR_DIR_SEM(sb));
|
|
}
|
|
|
|
static inline void reiserfs_write_lock_xattr_i(struct inode *inode)
|
|
{
|
|
down_write(&REISERFS_I(inode)->xattr_sem);
|
|
}
|
|
static inline void reiserfs_write_unlock_xattr_i(struct inode *inode)
|
|
{
|
|
up_write(&REISERFS_I(inode)->xattr_sem);
|
|
}
|
|
static inline void reiserfs_read_lock_xattr_i(struct inode *inode)
|
|
{
|
|
down_read(&REISERFS_I(inode)->xattr_sem);
|
|
}
|
|
|
|
static inline void reiserfs_read_unlock_xattr_i(struct inode *inode)
|
|
{
|
|
up_read(&REISERFS_I(inode)->xattr_sem);
|
|
}
|
|
|
|
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
|
{
|
|
init_rwsem(&REISERFS_I(inode)->xattr_sem);
|
|
}
|
|
|
|
#else
|
|
|
|
#define reiserfs_getxattr NULL
|
|
#define reiserfs_setxattr NULL
|
|
#define reiserfs_listxattr NULL
|
|
#define reiserfs_removexattr NULL
|
|
#define reiserfs_write_lock_xattrs(sb) do {;} while(0)
|
|
#define reiserfs_write_unlock_xattrs(sb) do {;} while(0)
|
|
#define reiserfs_read_lock_xattrs(sb)
|
|
#define reiserfs_read_unlock_xattrs(sb)
|
|
|
|
#define reiserfs_permission NULL
|
|
|
|
static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
|
|
{
|
|
}
|
|
#endif /* CONFIG_REISERFS_FS_XATTR */
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* _LINUX_REISERFS_XATTR_H */
|