Skip to content

Commit

Permalink
ocfs2: Replace list xattr handler operations
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Andreas Gruenbacher authored and Al Viro committed Dec 14, 2015
1 parent c4803c4 commit 1046cb1
Showing 1 changed file with 57 additions and 94 deletions.
151 changes: 57 additions & 94 deletions fs/ocfs2/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -883,14 +883,39 @@ static int ocfs2_xattr_value_truncate(struct inode *inode,
return ret;
}

static int ocfs2_xattr_list_entry(char *buffer, size_t size,
size_t *result, const char *prefix,
static int ocfs2_xattr_list_entry(struct super_block *sb,
char *buffer, size_t size,
size_t *result, int type,
const char *name, int name_len)
{
char *p = buffer + *result;
int prefix_len = strlen(prefix);
int total_len = prefix_len + name_len + 1;
const char *prefix;
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;

/* we are just looking for how big our buffer needs to be */
Expand All @@ -913,23 +938,20 @@ static int ocfs2_xattr_list_entries(struct inode *inode,
{
size_t result = 0;
int i, type, ret;
const char *prefix, *name;
const char *name;

for (i = 0 ; i < le16_to_cpu(header->xh_count); i++) {
struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
type = ocfs2_xattr_get_type(entry);
prefix = ocfs2_xattr_prefix(type);

if (prefix) {
name = (const char *)header +
le16_to_cpu(entry->xe_name_offset);
name = (const char *)header +
le16_to_cpu(entry->xe_name_offset);

ret = ocfs2_xattr_list_entry(buffer, buffer_size,
&result, prefix, name,
entry->xe_name_len);
if (ret)
return ret;
}
ret = ocfs2_xattr_list_entry(inode->i_sb,
buffer, buffer_size,
&result, type, name,
entry->xe_name_len);
if (ret)
return ret;
}

return result;
Expand Down Expand Up @@ -4032,32 +4054,30 @@ static int ocfs2_list_xattr_bucket(struct inode *inode,
int ret = 0, type;
struct ocfs2_xattr_tree_list *xl = (struct ocfs2_xattr_tree_list *)para;
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++) {
struct ocfs2_xattr_entry *entry = &bucket_xh(bucket)->xh_entries[i];
type = ocfs2_xattr_get_type(entry);
prefix = ocfs2_xattr_prefix(type);

if (prefix) {
ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
bucket_xh(bucket),
i,
&block_off,
&new_offset);
if (ret)
break;
ret = ocfs2_xattr_bucket_get_name_value(inode->i_sb,
bucket_xh(bucket),
i,
&block_off,
&new_offset);
if (ret)
break;

name = (const char *)bucket_block(bucket, block_off) +
new_offset;
ret = ocfs2_xattr_list_entry(xl->buffer,
xl->buffer_size,
&xl->result,
prefix, name,
entry->xe_name_len);
if (ret)
break;
}
name = (const char *)bucket_block(bucket, block_off) +
new_offset;
ret = ocfs2_xattr_list_entry(inode->i_sb,
xl->buffer,
xl->buffer_size,
&xl->result,
type, name,
entry->xe_name_len);
if (ret)
break;
}

return ret;
Expand Down Expand Up @@ -7225,25 +7245,10 @@ int ocfs2_init_security_and_acl(struct inode *dir,
leave:
return ret;
}

/*
* '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,
struct dentry *dentry, const char *name,
void *buffer, size_t size)
Expand Down Expand Up @@ -7308,33 +7313,13 @@ int ocfs2_init_security_set(handle_t *handle,

const struct xattr_handler ocfs2_xattr_security_handler = {
.prefix = XATTR_SECURITY_PREFIX,
.list = ocfs2_xattr_security_list,
.get = ocfs2_xattr_security_get,
.set = ocfs2_xattr_security_set,
};

/*
* '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,
struct dentry *dentry, const char *name,
void *buffer, size_t size)
Expand All @@ -7353,34 +7338,13 @@ static int ocfs2_xattr_trusted_set(const struct xattr_handler *handler,

const struct xattr_handler ocfs2_xattr_trusted_handler = {
.prefix = XATTR_TRUSTED_PREFIX,
.list = ocfs2_xattr_trusted_list,
.get = ocfs2_xattr_trusted_get,
.set = ocfs2_xattr_trusted_set,
};

/*
* '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,
struct dentry *dentry, const char *name,
void *buffer, size_t size)
Expand Down Expand Up @@ -7408,7 +7372,6 @@ static int ocfs2_xattr_user_set(const struct xattr_handler *handler,

const struct xattr_handler ocfs2_xattr_user_handler = {
.prefix = XATTR_USER_PREFIX,
.list = ocfs2_xattr_user_list,
.get = ocfs2_xattr_user_get,
.set = ocfs2_xattr_user_set,
};

0 comments on commit 1046cb1

Please sign in to comment.