]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.suse/ocfs2-Use-ocfs2_extent_list-instead-o.patch
Updated xen patches taken from suse.
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.suse / ocfs2-Use-ocfs2_extent_list-instead-o.patch
1 From: Tao Ma <tao.ma@oracle.com>
2 Subject: [PATCH 02/16] ocfs2: Use ocfs2_extent_list instead of ocfs2_dinode.
3 Patch-mainline: 2.6.28?
4 References: FATE302067
5
6 ocfs2_extend_meta_needed(), ocfs2_calc_extend_credits() and
7 ocfs2_reserve_new_metadata() are all useful for extent tree operations. But
8 they are all limited to an inode btree because they use a struct
9 ocfs2_dinode parameter. Change their parameter to struct ocfs2_extent_list
10 (the part of an ocfs2_dinode they actually use) so that the xattr btree code
11 can use these functions.
12
13 Signed-off-by: Tao Ma <tao.ma@oracle.com>
14 Signed-off-by: Mark Fasheh <mfasheh@suse.com>
15 ---
16 fs/ocfs2/alloc.c | 3 ++-
17 fs/ocfs2/alloc.h | 12 +++++++++---
18 fs/ocfs2/aops.c | 3 ++-
19 fs/ocfs2/dir.c | 5 +++--
20 fs/ocfs2/file.c | 9 +++++----
21 fs/ocfs2/journal.h | 17 +++++++++++------
22 fs/ocfs2/suballoc.c | 4 ++--
23 fs/ocfs2/suballoc.h | 7 ++++++-
24 8 files changed, 40 insertions(+), 20 deletions(-)
25
26 --- a/fs/ocfs2/alloc.c
27 +++ b/fs/ocfs2/alloc.c
28 @@ -4536,7 +4536,8 @@ static int ocfs2_split_tree(struct inode
29 } else
30 rightmost_el = path_leaf_el(path);
31
32 - credits += path->p_tree_depth + ocfs2_extend_meta_needed(di);
33 + credits += path->p_tree_depth +
34 + ocfs2_extend_meta_needed(&di->id2.i_list);
35 ret = ocfs2_extend_trans(handle, credits);
36 if (ret) {
37 mlog_errno(ret);
38 --- a/fs/ocfs2/alloc.h
39 +++ b/fs/ocfs2/alloc.h
40 @@ -48,8 +48,14 @@ int ocfs2_remove_extent(struct inode *in
41 int ocfs2_num_free_extents(struct ocfs2_super *osb,
42 struct inode *inode,
43 struct buffer_head *bh);
44 -/* how many new metadata chunks would an allocation need at maximum? */
45 -static inline int ocfs2_extend_meta_needed(struct ocfs2_dinode *fe)
46 +/*
47 + * how many new metadata chunks would an allocation need at maximum?
48 + *
49 + * Please note that the caller must make sure that root_el is the root
50 + * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
51 + * the result may be wrong.
52 + */
53 +static inline int ocfs2_extend_meta_needed(struct ocfs2_extent_list *root_el)
54 {
55 /*
56 * Rather than do all the work of determining how much we need
57 @@ -59,7 +65,7 @@ static inline int ocfs2_extend_meta_need
58 * new tree_depth==0 extent_block, and one block at the new
59 * top-of-the tree.
60 */
61 - return le16_to_cpu(fe->id2.i_list.l_tree_depth) + 2;
62 + return le16_to_cpu(root_el->l_tree_depth) + 2;
63 }
64
65 void ocfs2_dinode_new_extent_list(struct inode *inode, struct ocfs2_dinode *di);
66 --- a/fs/ocfs2/aops.c
67 +++ b/fs/ocfs2/aops.c
68 @@ -1720,7 +1720,8 @@ int ocfs2_write_begin_nolock(struct addr
69 goto out;
70 }
71
72 - credits = ocfs2_calc_extend_credits(inode->i_sb, di,
73 + credits = ocfs2_calc_extend_credits(inode->i_sb,
74 + &di->id2.i_list,
75 clusters_to_alloc);
76
77 }
78 --- a/fs/ocfs2/dir.c
79 +++ b/fs/ocfs2/dir.c
80 @@ -1430,6 +1430,7 @@ static int ocfs2_extend_dir(struct ocfs2
81 int credits, num_free_extents, drop_alloc_sem = 0;
82 loff_t dir_i_size;
83 struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
84 + struct ocfs2_extent_list *el = &fe->id2.i_list;
85 struct ocfs2_alloc_context *data_ac = NULL;
86 struct ocfs2_alloc_context *meta_ac = NULL;
87 handle_t *handle = NULL;
88 @@ -1488,7 +1489,7 @@ static int ocfs2_extend_dir(struct ocfs2
89 }
90
91 if (!num_free_extents) {
92 - status = ocfs2_reserve_new_metadata(osb, fe, &meta_ac);
93 + status = ocfs2_reserve_new_metadata(osb, el, &meta_ac);
94 if (status < 0) {
95 if (status != -ENOSPC)
96 mlog_errno(status);
97 @@ -1503,7 +1504,7 @@ static int ocfs2_extend_dir(struct ocfs2
98 goto bail;
99 }
100
101 - credits = ocfs2_calc_extend_credits(sb, fe, 1);
102 + credits = ocfs2_calc_extend_credits(sb, el, 1);
103 } else {
104 spin_unlock(&OCFS2_I(dir)->ip_lock);
105 credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS;
106 --- a/fs/ocfs2/file.c
107 +++ b/fs/ocfs2/file.c
108 @@ -540,7 +540,7 @@ int ocfs2_do_extend_allocation(struct oc
109 goto leave;
110 } else if ((!free_extents)
111 && (ocfs2_alloc_context_bits_left(meta_ac)
112 - < ocfs2_extend_meta_needed(fe))) {
113 + < ocfs2_extend_meta_needed(&fe->id2.i_list))) {
114 mlog(0, "filesystem is really fragmented...\n");
115 status = -EAGAIN;
116 reason = RESTART_META;
117 @@ -652,7 +652,7 @@ int ocfs2_lock_allocators(struct inode *
118 */
119 if (!num_free_extents ||
120 (ocfs2_sparse_alloc(osb) && num_free_extents < max_recs_needed)) {
121 - ret = ocfs2_reserve_new_metadata(osb, di, meta_ac);
122 + ret = ocfs2_reserve_new_metadata(osb, &di->id2.i_list, meta_ac);
123 if (ret < 0) {
124 if (ret != -ENOSPC)
125 mlog_errno(ret);
126 @@ -732,7 +732,8 @@ restart_all:
127 goto leave;
128 }
129
130 - credits = ocfs2_calc_extend_credits(osb->sb, fe, clusters_to_add);
131 + credits = ocfs2_calc_extend_credits(osb->sb, &fe->id2.i_list,
132 + clusters_to_add);
133 handle = ocfs2_start_trans(osb, credits);
134 if (IS_ERR(handle)) {
135 status = PTR_ERR(handle);
136 @@ -790,7 +791,7 @@ restarted_transaction:
137 mlog(0, "restarting transaction.\n");
138 /* TODO: This can be more intelligent. */
139 credits = ocfs2_calc_extend_credits(osb->sb,
140 - fe,
141 + &fe->id2.i_list,
142 clusters_to_add);
143 status = ocfs2_extend_trans(handle, credits);
144 if (status < 0) {
145 --- a/fs/ocfs2/journal.h
146 +++ b/fs/ocfs2/journal.h
147 @@ -340,11 +340,16 @@ int ocfs2_journal_dirty
148 #define OCFS2_RENAME_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 3 \
149 + OCFS2_UNLINK_CREDITS)
150
151 +/*
152 + * Please note that the caller must make sure that root_el is the root
153 + * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
154 + * the result may be wrong.
155 + */
156 static inline int ocfs2_calc_extend_credits(struct super_block *sb,
157 - struct ocfs2_dinode *fe,
158 + struct ocfs2_extent_list *root_el,
159 u32 bits_wanted)
160 {
161 - int bitmap_blocks, sysfile_bitmap_blocks, dinode_blocks;
162 + int bitmap_blocks, sysfile_bitmap_blocks, extent_blocks;
163
164 /* bitmap dinode, group desc. + relinked group. */
165 bitmap_blocks = OCFS2_SUBALLOC_ALLOC;
166 @@ -355,16 +360,16 @@ static inline int ocfs2_calc_extend_cred
167 * however many metadata chunks needed * a remaining suballoc
168 * alloc. */
169 sysfile_bitmap_blocks = 1 +
170 - (OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(fe);
171 + (OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(root_el);
172
173 /* this does not include *new* metadata blocks, which are
174 - * accounted for in sysfile_bitmap_blocks. fe +
175 + * accounted for in sysfile_bitmap_blocks. root_el +
176 * prev. last_eb_blk + blocks along edge of tree.
177 * calc_symlink_credits passes because we just need 1
178 * credit for the dinode there. */
179 - dinode_blocks = 1 + 1 + le16_to_cpu(fe->id2.i_list.l_tree_depth);
180 + extent_blocks = 1 + 1 + le16_to_cpu(root_el->l_tree_depth);
181
182 - return bitmap_blocks + sysfile_bitmap_blocks + dinode_blocks;
183 + return bitmap_blocks + sysfile_bitmap_blocks + extent_blocks;
184 }
185
186 static inline int ocfs2_calc_symlink_credits(struct super_block *sb)
187 --- a/fs/ocfs2/suballoc.c
188 +++ b/fs/ocfs2/suballoc.c
189 @@ -494,7 +494,7 @@ bail:
190 }
191
192 int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
193 - struct ocfs2_dinode *fe,
194 + struct ocfs2_extent_list *root_el,
195 struct ocfs2_alloc_context **ac)
196 {
197 int status;
198 @@ -507,7 +507,7 @@ int ocfs2_reserve_new_metadata(struct oc
199 goto bail;
200 }
201
202 - (*ac)->ac_bits_wanted = ocfs2_extend_meta_needed(fe);
203 + (*ac)->ac_bits_wanted = ocfs2_extend_meta_needed(root_el);
204 (*ac)->ac_which = OCFS2_AC_USE_META;
205 slot = osb->slot_num;
206 (*ac)->ac_group_search = ocfs2_block_group_search;
207 --- a/fs/ocfs2/suballoc.h
208 +++ b/fs/ocfs2/suballoc.h
209 @@ -59,8 +59,13 @@ static inline int ocfs2_alloc_context_bi
210 return ac->ac_bits_wanted - ac->ac_bits_given;
211 }
212
213 +/*
214 + * Please note that the caller must make sure that root_el is the root
215 + * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
216 + * the result may be wrong.
217 + */
218 int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
219 - struct ocfs2_dinode *fe,
220 + struct ocfs2_extent_list *root_el,
221 struct ocfs2_alloc_context **ac);
222 int ocfs2_reserve_new_inode(struct ocfs2_super *osb,
223 struct ocfs2_alloc_context **ac);