1 From: Tao Ma <tao.ma@oracle.com>
2 Subject: ocfs2: Refactor xattr list and remove ocfs2_xattr_handler().
5 According to Christoph Hellwig's advice, we really don't need
6 a ->list to handle one xattr's list. Just a map from index to
7 xattr prefix is enough. And I also refactor the old list method
8 with the reference from fs/xfs/linux-2.6/xfs_xattr.c and the
9 xattr list method in btrfs.
11 Signed-off-by: Tao Ma <tao.ma@oracle.com>
12 Signed-off-by: Mark Fasheh <mfasheh@suse.com>
14 fs/ocfs2/xattr.c | 95 ++++++++++++++++++++++++++++++++++--------------------
15 1 files changed, 60 insertions(+), 35 deletions(-)
17 Index: linux-2.6.27/fs/ocfs2/xattr.c
18 ===================================================================
19 --- linux-2.6.27.orig/fs/ocfs2/xattr.c
20 +++ linux-2.6.27/fs/ocfs2/xattr.c
21 @@ -153,14 +153,14 @@ static int ocfs2_xattr_set_entry_index_b
22 static int ocfs2_delete_xattr_index_block(struct inode *inode,
23 struct buffer_head *xb_bh);
25 -static inline struct xattr_handler *ocfs2_xattr_handler(int name_index)
26 +static inline const char *ocfs2_xattr_prefix(int name_index)
28 struct xattr_handler *handler = NULL;
30 if (name_index > 0 && name_index < OCFS2_XATTR_MAX)
31 handler = ocfs2_xattr_handler_map[name_index];
34 + return handler ? handler->prefix : NULL;
37 static u32 ocfs2_xattr_name_hash(struct inode *inode,
38 @@ -468,33 +468,56 @@ static int ocfs2_xattr_value_truncate(st
42 +static int ocfs2_xattr_list_entry(char *buffer, size_t size,
43 + size_t *result, const char *prefix,
44 + const char *name, int name_len)
46 + char *p = buffer + *result;
47 + int prefix_len = strlen(prefix);
48 + int total_len = prefix_len + name_len + 1;
50 + *result += total_len;
52 + /* we are just looking for how big our buffer needs to be */
59 + memcpy(p, prefix, prefix_len);
60 + memcpy(p + prefix_len, name, name_len);
61 + p[prefix_len + name_len] = '\0';
66 static int ocfs2_xattr_list_entries(struct inode *inode,
67 struct ocfs2_xattr_header *header,
68 char *buffer, size_t buffer_size)
70 - size_t rest = buffer_size;
74 + const char *prefix, *name;
76 for (i = 0 ; i < le16_to_cpu(header->xh_count); i++) {
77 struct ocfs2_xattr_entry *entry = &header->xh_entries[i];
78 - struct xattr_handler *handler =
79 - ocfs2_xattr_handler(ocfs2_xattr_get_type(entry));
80 + type = ocfs2_xattr_get_type(entry);
81 + prefix = ocfs2_xattr_prefix(type);
84 - size_t size = handler->list(inode, buffer, rest,
86 - le16_to_cpu(entry->xe_name_offset)),
87 - entry->xe_name_len);
95 + name = (const char *)header +
96 + le16_to_cpu(entry->xe_name_offset);
98 + ret = ocfs2_xattr_list_entry(buffer, buffer_size,
99 + &result, prefix, name,
100 + entry->xe_name_len);
106 - return buffer_size - rest;
110 static int ocfs2_xattr_ibody_list(struct inode *inode,
111 @@ -2472,6 +2495,7 @@ out:
112 struct ocfs2_xattr_tree_list {
118 static int ocfs2_xattr_bucket_get_name_value(struct inode *inode,
119 @@ -2497,17 +2521,17 @@ static int ocfs2_list_xattr_bucket(struc
120 struct ocfs2_xattr_bucket *bucket,
125 struct ocfs2_xattr_tree_list *xl = (struct ocfs2_xattr_tree_list *)para;
127 int i, block_off, new_offset;
128 + const char *prefix, *name;
130 for (i = 0 ; i < le16_to_cpu(bucket->xh->xh_count); i++) {
131 struct ocfs2_xattr_entry *entry = &bucket->xh->xh_entries[i];
132 - struct xattr_handler *handler =
133 - ocfs2_xattr_handler(ocfs2_xattr_get_type(entry));
134 + type = ocfs2_xattr_get_type(entry);
135 + prefix = ocfs2_xattr_prefix(type);
139 ret = ocfs2_xattr_bucket_get_name_value(inode,
142 @@ -2515,16 +2539,16 @@ static int ocfs2_list_xattr_bucket(struc
146 - size = handler->list(inode, xl->buffer, xl->buffer_size,
147 - bucket->bhs[block_off]->b_data +
149 - entry->xe_name_len);
151 - if (size > xl->buffer_size)
153 - xl->buffer += size;
155 - xl->buffer_size -= size;
157 + name = (const char *)bucket->bhs[block_off]->b_data +
159 + ret = ocfs2_xattr_list_entry(xl->buffer,
163 + entry->xe_name_len);
169 @@ -2543,6 +2567,7 @@ static int ocfs2_xattr_tree_list_index_b
170 struct ocfs2_xattr_tree_list xl = {
172 .buffer_size = buffer_size,
176 if (le16_to_cpu(el->l_next_free_rec) == 0)
177 @@ -2570,7 +2595,7 @@ static int ocfs2_xattr_tree_list_index_b
178 name_hash = e_cpos - 1;
181 - ret = buffer_size - xl.buffer_size;