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:
Andreas Gruenbacher 2015-12-02 14:44:42 +01:00 committed by Al Viro
parent c4803c497f
commit 1046cb1195

View File

@ -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,
}; };