![Andreas Gruenbacher](/assets/img/avatar_default.png)
The xattr_handler operations are currently all passed a file system specific flags value which the operations can use to disambiguate between different handlers; some file systems use that to distinguish the xattr namespace, for example. In some oprations, it would be useful to also have access to the handler prefix. To allow that, pass a pointer to the handler to operations instead of the flags value alone. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
65 lines
1.7 KiB
C
65 lines
1.7 KiB
C
/*
|
|
* linux/fs/ext4/xattr_user.c
|
|
* Handler for extended user attributes.
|
|
*
|
|
* Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org>
|
|
*/
|
|
|
|
#include <linux/string.h>
|
|
#include <linux/fs.h>
|
|
#include "ext4_jbd2.h"
|
|
#include "ext4.h"
|
|
#include "xattr.h"
|
|
|
|
static size_t
|
|
ext4_xattr_user_list(const struct xattr_handler *handler,
|
|
struct dentry *dentry, char *list, size_t list_size,
|
|
const char *name, size_t name_len)
|
|
{
|
|
const size_t prefix_len = XATTR_USER_PREFIX_LEN;
|
|
const size_t total_len = prefix_len + name_len + 1;
|
|
|
|
if (!test_opt(dentry->d_sb, XATTR_USER))
|
|
return 0;
|
|
|
|
if (list && total_len <= list_size) {
|
|
memcpy(list, XATTR_USER_PREFIX, prefix_len);
|
|
memcpy(list+prefix_len, name, name_len);
|
|
list[prefix_len + name_len] = '\0';
|
|
}
|
|
return total_len;
|
|
}
|
|
|
|
static int
|
|
ext4_xattr_user_get(const struct xattr_handler *handler,
|
|
struct dentry *dentry, const char *name,
|
|
void *buffer, size_t size)
|
|
{
|
|
if (strcmp(name, "") == 0)
|
|
return -EINVAL;
|
|
if (!test_opt(dentry->d_sb, XATTR_USER))
|
|
return -EOPNOTSUPP;
|
|
return ext4_xattr_get(d_inode(dentry), EXT4_XATTR_INDEX_USER,
|
|
name, buffer, size);
|
|
}
|
|
|
|
static int
|
|
ext4_xattr_user_set(const struct xattr_handler *handler,
|
|
struct dentry *dentry, const char *name,
|
|
const void *value, size_t size, int flags)
|
|
{
|
|
if (strcmp(name, "") == 0)
|
|
return -EINVAL;
|
|
if (!test_opt(dentry->d_sb, XATTR_USER))
|
|
return -EOPNOTSUPP;
|
|
return ext4_xattr_set(d_inode(dentry), EXT4_XATTR_INDEX_USER,
|
|
name, value, size, flags);
|
|
}
|
|
|
|
const struct xattr_handler ext4_xattr_user_handler = {
|
|
.prefix = XATTR_USER_PREFIX,
|
|
.list = ext4_xattr_user_list,
|
|
.get = ext4_xattr_user_get,
|
|
.set = ext4_xattr_user_set,
|
|
};
|