ocfs2/xattr: Remove ocfs2_xattr_handler.
cover ocfs2/xattr: Remove ocfs2_xattr_handler.
Hi all,
per discussion with Christoph Hellwig, we decided to removeocfs2_xattr_handler from ocfs2/xattr. Here comes the 2 patches for it.
Regards,
Tao
PATCH 1/2 ocfs2/xattr: Calculate EA hash only by its suffix.
According to Christoph Hellwig's advice, the hash value of EA is only calculated by its suffix.
--- fs/ocfs2/xattr.c | 35 +++++------------------------------ 1 files changed, 5 insertions(+), 30 deletions(-)
fs/ocfs2/xattr.c +5 -30
@@ -148,21 +148,13 @@ static inline struct xattr_handler *ocfs2_xattr_handler(int name_index) }static u32 ocfs2_xattr_name_hash (struct inode *inode, -char *prefix, -int prefix_len, -char *name, +const char *name,int name_len) {/* Get hash value of uuid from super block */ u32 hash =OCFS2_SB (inode->i_sb)->uuid_hash;int i; -/* hash extended attribute prefix */ -for (i =0 ; i < prefix_len; i++) { - hash = (hash <<OCFS2_HASH_SHIFT ) ^ - (hash >> (8 *sizeof (hash) -OCFS2_HASH_SHIFT )) ^ - *prefix++; - }/* hash extended attribute name */ for (i =0 ; i < name_len; i++) { hash = (hash << OCFS2_HASH_SHIFT) ^
@@ -183,14 +175,9 @@ static void ocfs2_xattr_hash_entry(struct inode *inode, struct ocfs2_xattr_entry *entry) {u32 hash =0 ; -struct xattr_handler *handler = -ocfs2_xattr_handler (ocfs2_xattr_get_type (entry)); -char *prefix = handler->prefix;char *name = (char *)header +le16_to_cpu (entry->xe_name_offset); -int prefix_len =strlen (handler->prefix); - hash =ocfs2_xattr_name_hash (inode, prefix, prefix_len, name, - entry->xe_name_len); + hash =ocfs2_xattr_name_hash (inode, name, entry->xe_name_len); entry->xe_name_hash =cpu_to_le32 (hash);return ;
@@ -2093,18 +2080,6 @@ cleanup:return ret; } -static inline u32 ocfs2_xattr_hash_by_name (struct inode *inode, -int name_index, -const char *suffix_name) -{ -struct xattr_handler *handler =ocfs2_xattr_handler (name_index); -char *prefix = handler->prefix; -int prefix_len =strlen (handler->prefix); - -return ocfs2_xattr_name_hash (inode, prefix, prefix_len, - (char *)suffix_name,strlen (suffix_name)); -} -/* * Find the xattr extent rec which may contains name_hash. * e_cpos will be the first name hash of the xattr rec.
@@ -2395,7 +2370,7 @@ static int ocfs2_xattr_index_block_find(struct inode *inode,struct ocfs2_extent_list *el = &xb_root->xt_list;u64 p_blkno =0 ;u32 first_hash, num_clusters =0 ; -u32 name_hash =ocfs2_xattr_hash_by_name (inode, name_index, name); +u32 name_hash =ocfs2_xattr_name_hash (inode, name,strlen (name));if (le16_to_cpu (el->l_next_free_rec) ==0 )return -ENODATA ;
@@ -4435,8 +4410,8 @@ static int ocfs2_xattr_set_in_bucket(struct inode *inode,size_t value_len;char *val = (char *)xi->value;struct ocfs2_xattr_entry *xe = xs->here; -u32 name_hash =ocfs2_xattr_hash_by_name (inode, - xi->name_index, xi->name); +u32 name_hash =ocfs2_xattr_name_hash (inode, xi->name, +strlen (xi->name));if (!xs->not_found && !ocfs2_xattr_is_local (xe)) {/*
Signature · 1 line
1.5.4.GIT
PATCH 2/2 ocfs2/xattr: Refactor xattr list and remove ocfs2_xattr_handler().
In reply to Tao MaAccording to Christoph Hellwig's advice, we really don't need a ->list to handle one xattr's list. Just a map from index to xattr prefix is enough. And I also refactor the old list method with the reference from fs/xfs/linux-2.6/xfs_xattr.c and the xattr list method in btrfs.
--- fs/ocfs2/xattr.c | 95 ++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 60 insertions(+), 35 deletions(-)
fs/ocfs2/xattr.c +60 -35
@@ -137,14 +137,14 @@ static int ocfs2_xattr_set_entry_index_block(struct inode *inode,static int ocfs2_delete_xattr_index_block (struct inode *inode,struct buffer_head *xb_bh); -static inline struct xattr_handler *ocfs2_xattr_handler (int name_index) +static inline const char *ocfs2_xattr_prefix (int name_index) {struct xattr_handler *handler =NULL ;if (name_index >0 && name_index <OCFS2_XATTR_MAX ) handler = ocfs2_xattr_handler_map[name_index]; -return handler; +return handler ? handler->prefix :NULL ; } static u32 ocfs2_xattr_name_hash(struct inode *inode,
@@ -452,33 +452,56 @@ 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, +const char *name,int name_len) +{ +char *p = buffer + *result; +int prefix_len =strlen (prefix); +int total_len = prefix_len + name_len +1 ; + + *result += total_len; + +/* we are just looking for how big our buffer needs to be */ +if (!size) +return 0 ; + +if (*result > size) +return -ERANGE ; + +memcpy (p, prefix, prefix_len); +memcpy (p + prefix_len, name, name_len); + p[prefix_len + name_len] ='\0' ; + +return 0 ; +} +static int ocfs2_xattr_list_entries (struct inode *inode,struct ocfs2_xattr_header *header,char *buffer,size_t buffer_size) { -size_t rest = buffer_size; -int i; +size_t result =0 ; +int i, type, ret; +const char *prefix, *name;for (i =0 ; i <le16_to_cpu (header->xh_count); i++) {struct ocfs2_xattr_entry *entry = &header->xh_entries[i]; -struct xattr_handler *handler = -ocfs2_xattr_handler (ocfs2_xattr_get_type (entry)); - -if (handler) { -size_t size = handler->list (inode, buffer, rest, - ((char *)header + -le16_to_cpu (entry->xe_name_offset)), - entry->xe_name_len); -if (buffer) { -if (size > rest) -return -ERANGE ; - buffer += size; - } - rest -= size; + type =ocfs2_xattr_get_type (entry); + prefix =ocfs2_xattr_prefix (type); + +if (prefix) { + 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; } } -return buffer_size - rest; +return result; } static int ocfs2_xattr_ibody_list(struct inode *inode,
@@ -2456,6 +2479,7 @@ out:struct ocfs2_xattr_tree_list {char *buffer;size_t buffer_size; +size_t result; }; static int ocfs2_xattr_bucket_get_name_value(struct inode *inode,
@@ -2481,17 +2505,17 @@ static int ocfs2_list_xattr_bucket(struct inode *inode, struct ocfs2_xattr_bucket *bucket, void *para) { - int ret = 0; + int ret = 0, type; struct ocfs2_xattr_tree_list *xl = (struct ocfs2_xattr_tree_list *)para; - size_t size; int i, block_off, new_offset; + const char *prefix, *name; for (i = 0 ; i < le16_to_cpu(bucket->xh->xh_count); i++) { struct ocfs2_xattr_entry *entry = &bucket->xh->xh_entries[i]; - struct xattr_handler *handler = - ocfs2_xattr_handler(ocfs2_xattr_get_type(entry)); + type = ocfs2_xattr_get_type(entry); + prefix = ocfs2_xattr_prefix(type); - if (handler) { + if (prefix) { ret = ocfs2_xattr_bucket_get_name_value(inode, bucket->xh, i,
@@ -2499,16 +2523,16 @@ static int ocfs2_list_xattr_bucket(struct inode *inode, &new_offset);if (ret)break ; - size = handler->list (inode, xl->buffer, xl->buffer_size, - bucket->bhs[block_off]->b_data + - new_offset, - entry->xe_name_len); -if (xl->buffer) { -if (size > xl->buffer_size) -return -ERANGE ; - xl->buffer += size; - } - xl->buffer_size -= size; + + name = (const char *)bucket->bhs[block_off]->b_data + + new_offset; + ret =ocfs2_xattr_list_entry (xl->buffer, + xl->buffer_size, + &xl->result, + prefix, name, + entry->xe_name_len); +if (ret) +break ; } }
@@ -2527,6 +2551,7 @@ static int ocfs2_xattr_tree_list_index_block(struct inode *inode,struct ocfs2_xattr_tree_list xl = { .buffer = buffer, .buffer_size = buffer_size, + .result =0 , };if (le16_to_cpu (el->l_next_free_rec) ==0 )
@@ -2554,7 +2579,7 @@ static int ocfs2_xattr_tree_list_index_block(struct inode *inode, name_hash = e_cpos -1 ; } - ret = buffer_size - xl.buffer_size; + ret = xl.result; out:return ret; }
Signature · 1 line
1.5.4.GIT
cover ocfs2/xattr: Remove ocfs2_xattr_handler.
In reply to Tao MaQuoted 2 lines · Tao Ma
per discussion with Christoph Hellwig, we decided to remove
ocfs2_xattr_handlerfrom ocfs2/xattr. Here comes the 2 patches for it.
Great, thanks for these Tao.
--Mark
--
Mark Fasheh