mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
ocfs2: Replace list xattr handler operations
The list operations of the ocfs2 xattr handlers were never called anywhere. Remove them and directly check in ocfs2_xattr_list_entry which attributes should be skipped over instead. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Cc: Mark Fasheh <mfasheh@suse.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: ocfs2-devel@oss.oracle.com Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
c4803c497f
commit
1046cb1195
151
fs/ocfs2/xattr.c
151
fs/ocfs2/xattr.c
@ -883,14 +883,39 @@ static int ocfs2_xattr_value_truncate(struct inode *inode,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ocfs2_xattr_list_entry(char *buffer, size_t size,
|
static int ocfs2_xattr_list_entry(struct super_block *sb,
|
||||||
size_t *result, const char *prefix,
|
char *buffer, size_t size,
|
||||||
|
size_t *result, int type,
|
||||||
const char *name, int name_len)
|
const char *name, int name_len)
|
||||||
{
|
{
|
||||||
char *p = buffer + *result;
|
char *p = buffer + *result;
|
||||||
int prefix_len = strlen(prefix);
|
const char *prefix;
|
||||||
int total_len = prefix_len + name_len + 1;
|
int prefix_len;
|
||||||
|
int total_len;
|
||||||
|
|
||||||
|
switch(type) {
|
||||||
|
case OCFS2_XATTR_INDEX_USER:
|
||||||
|
if (OCFS2_SB(sb)->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR)
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS:
|
||||||
|
case OCFS2_XATTR_INDEX_POSIX_ACL_DEFAULT:
|
||||||
|
if (!(sb->s_flags & MS_POSIXACL))
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OCFS2_XATTR_INDEX_TRUSTED:
|
||||||
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix = ocfs2_xattr_prefix(type);
|
||||||
|
if (!prefix)
|
||||||
|
return 0;
|
||||||
|
prefix_len = strlen(prefix);
|
||||||
|
total_len = prefix_len + name_len + 1;
|
||||||
*result += total_len;
|
*result += total_len;
|
||||||
|
|
||||||
/* we are just looking for how big our buffer needs to be */
|
/* we are just looking for how big our buffer needs to be */
|
||||||
@ -913,23 +938,20 @@ static int ocfs2_xattr_list_entries(struct inode *inode,
|
|||||||
{
|
{
|
||||||
size_t result = 0;
|
size_t result = 0;
|
||||||
int i, type, ret;
|
int i, type, ret;
|
||||||
const char *prefix, *name;
|
const char *name;
|
||||||
|
|
||||||
for (i = 0 ; i < le16_to_cpu(header->xh_count); i++) {
|
for (i = 0 ; i < le16_to_cpu(header->xh_count); i++) {
|
||||||
struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
|
struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
|
||||||
type = ocfs2_xattr_get_type(entry);
|
type = ocfs2_xattr_get_type(entry);
|
||||||
prefix = ocfs2_xattr_prefix(type);
|
name = (const char *)header +
|
||||||
|
le16_to_cpu(entry->xe_name_offset);
|
||||||
|
|
||||||
if (prefix) {
|
ret = ocfs2_xattr_list_entry(inode->i_sb,
|
||||||
name = (const char *)header +
|
buffer, buffer_size,
|
||||||
le16_to_cpu(entry->xe_name_offset);
|
&result, type, name,
|
||||||
|
entry->xe_name_len);
|
||||||
ret = ocfs2_xattr_list_entry(buffer, buffer_size,
|
if (ret)
|
||||||
&result, prefix, name,
|
return ret;
|
||||||
entry->xe_name_len);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -4032,32 +4054,30 @@ static int ocfs2_list_xattr_bucket(struct inode *inode,
|
|||||||
int ret = 0, type;
|
int ret = 0, type;
|
||||||
struct ocfs2_xattr_tree_list *xl = (struct ocfs2_xattr_tree_list *)para;
|
struct ocfs2_xattr_tree_list *xl = (struct ocfs2_xattr_tree_list *)para;
|
||||||
int i, block_off, new_offset;
|
int i, block_off, new_offset;
|
||||||
const char *prefix, *name;
|
const char *name;
|
||||||
|
|
||||||
for (i = 0 ; i < le16_to_cpu(bucket_xh(bucket)->xh_count); i++) {
|
for (i = 0 ; i < le16_to_cpu(bucket_xh(bucket)->xh_count); i++) {
|
||||||
struct ocfs2_xattr_entry *entry = &bucket_xh(bucket)->xh_entries[i];
|
struct ocfs2_xattr_entry *entry = &bucket_xh(bucket)->xh_entries[i];
|
||||||
type = ocfs2_xattr_get_type(entry);
|
type = ocfs2_xattr_get_type(entry);
|
||||||
prefix = ocfs2_xattr_prefix(type);
|
|
||||||
|
|
||||||
if (prefix) {
|
ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
|
||||||
ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
|
bucket_xh(bucket),
|
||||||
bucket_xh(bucket),
|
i,
|
||||||
i,
|
&block_off,
|
||||||
&block_off,
|
&new_offset);
|
||||||
&new_offset);
|
if (ret)
|
||||||
if (ret)
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
name = (const char *)bucket_block(bucket, block_off) +
|
name = (const char *)bucket_block(bucket, block_off) +
|
||||||
new_offset;
|
new_offset;
|
||||||
ret = ocfs2_xattr_list_entry(xl->buffer,
|
ret = ocfs2_xattr_list_entry(inode->i_sb,
|
||||||
xl->buffer_size,
|
xl->buffer,
|
||||||
&xl->result,
|
xl->buffer_size,
|
||||||
prefix, name,
|
&xl->result,
|
||||||
entry->xe_name_len);
|
type, name,
|
||||||
if (ret)
|
entry->xe_name_len);
|
||||||
break;
|
if (ret)
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -7225,25 +7245,10 @@ int ocfs2_init_security_and_acl(struct inode *dir,
|
|||||||
leave:
|
leave:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 'security' attributes support
|
* 'security' attributes support
|
||||||
*/
|
*/
|
||||||
static size_t ocfs2_xattr_security_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_SECURITY_PREFIX_LEN;
|
|
||||||
const size_t total_len = prefix_len + name_len + 1;
|
|
||||||
|
|
||||||
if (list && total_len <= list_size) {
|
|
||||||
memcpy(list, XATTR_SECURITY_PREFIX, prefix_len);
|
|
||||||
memcpy(list + prefix_len, name, name_len);
|
|
||||||
list[prefix_len + name_len] = '\0';
|
|
||||||
}
|
|
||||||
return total_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ocfs2_xattr_security_get(const struct xattr_handler *handler,
|
static int ocfs2_xattr_security_get(const struct xattr_handler *handler,
|
||||||
struct dentry *dentry, const char *name,
|
struct dentry *dentry, const char *name,
|
||||||
void *buffer, size_t size)
|
void *buffer, size_t size)
|
||||||
@ -7308,7 +7313,6 @@ int ocfs2_init_security_set(handle_t *handle,
|
|||||||
|
|
||||||
const struct xattr_handler ocfs2_xattr_security_handler = {
|
const struct xattr_handler ocfs2_xattr_security_handler = {
|
||||||
.prefix = XATTR_SECURITY_PREFIX,
|
.prefix = XATTR_SECURITY_PREFIX,
|
||||||
.list = ocfs2_xattr_security_list,
|
|
||||||
.get = ocfs2_xattr_security_get,
|
.get = ocfs2_xattr_security_get,
|
||||||
.set = ocfs2_xattr_security_set,
|
.set = ocfs2_xattr_security_set,
|
||||||
};
|
};
|
||||||
@ -7316,25 +7320,6 @@ const struct xattr_handler ocfs2_xattr_security_handler = {
|
|||||||
/*
|
/*
|
||||||
* 'trusted' attributes support
|
* 'trusted' attributes support
|
||||||
*/
|
*/
|
||||||
static size_t ocfs2_xattr_trusted_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_TRUSTED_PREFIX_LEN;
|
|
||||||
const size_t total_len = prefix_len + name_len + 1;
|
|
||||||
|
|
||||||
if (!capable(CAP_SYS_ADMIN))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (list && total_len <= list_size) {
|
|
||||||
memcpy(list, XATTR_TRUSTED_PREFIX, prefix_len);
|
|
||||||
memcpy(list + prefix_len, name, name_len);
|
|
||||||
list[prefix_len + name_len] = '\0';
|
|
||||||
}
|
|
||||||
return total_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ocfs2_xattr_trusted_get(const struct xattr_handler *handler,
|
static int ocfs2_xattr_trusted_get(const struct xattr_handler *handler,
|
||||||
struct dentry *dentry, const char *name,
|
struct dentry *dentry, const char *name,
|
||||||
void *buffer, size_t size)
|
void *buffer, size_t size)
|
||||||
@ -7353,7 +7338,6 @@ static int ocfs2_xattr_trusted_set(const struct xattr_handler *handler,
|
|||||||
|
|
||||||
const struct xattr_handler ocfs2_xattr_trusted_handler = {
|
const struct xattr_handler ocfs2_xattr_trusted_handler = {
|
||||||
.prefix = XATTR_TRUSTED_PREFIX,
|
.prefix = XATTR_TRUSTED_PREFIX,
|
||||||
.list = ocfs2_xattr_trusted_list,
|
|
||||||
.get = ocfs2_xattr_trusted_get,
|
.get = ocfs2_xattr_trusted_get,
|
||||||
.set = ocfs2_xattr_trusted_set,
|
.set = ocfs2_xattr_trusted_set,
|
||||||
};
|
};
|
||||||
@ -7361,26 +7345,6 @@ const struct xattr_handler ocfs2_xattr_trusted_handler = {
|
|||||||
/*
|
/*
|
||||||
* 'user' attributes support
|
* 'user' attributes support
|
||||||
*/
|
*/
|
||||||
static size_t ocfs2_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;
|
|
||||||
struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb);
|
|
||||||
|
|
||||||
if (osb->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR)
|
|
||||||
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 ocfs2_xattr_user_get(const struct xattr_handler *handler,
|
static int ocfs2_xattr_user_get(const struct xattr_handler *handler,
|
||||||
struct dentry *dentry, const char *name,
|
struct dentry *dentry, const char *name,
|
||||||
void *buffer, size_t size)
|
void *buffer, size_t size)
|
||||||
@ -7408,7 +7372,6 @@ static int ocfs2_xattr_user_set(const struct xattr_handler *handler,
|
|||||||
|
|
||||||
const struct xattr_handler ocfs2_xattr_user_handler = {
|
const struct xattr_handler ocfs2_xattr_user_handler = {
|
||||||
.prefix = XATTR_USER_PREFIX,
|
.prefix = XATTR_USER_PREFIX,
|
||||||
.list = ocfs2_xattr_user_list,
|
|
||||||
.get = ocfs2_xattr_user_get,
|
.get = ocfs2_xattr_user_get,
|
||||||
.set = ocfs2_xattr_user_set,
|
.set = ocfs2_xattr_user_set,
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user