diff options
author | Jeff Mahoney <jeffm@suse.com> | 2014-04-23 10:01:02 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2014-05-13 10:08:54 -0400 |
commit | 83a3a56936667e8dbf2a43ceb380bc5a08d5fa0b (patch) | |
tree | 04531ce9bb783cde23f246ab88ced2b43c8d16be | |
parent | 441378c2bf4f3a510d1afba5bf9911cb40596b68 (diff) |
reiserfs: balance_leaf refactor, split up balance_leaf_when_delete
Splut up balance_leaf_when_delete into:
balance_leaf_when_delete_del
balance_leaf_when_cut
balance_leaf_when_delete_left
Also reformat to adhere to CodingStyle.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | fs/reiserfs/do_balan.c | 318 |
1 files changed, 163 insertions, 155 deletions
diff --git a/fs/reiserfs/do_balan.c b/fs/reiserfs/do_balan.c index 959b7b578f9d..547575c1c3c0 100644 --- a/fs/reiserfs/do_balan.c +++ b/fs/reiserfs/do_balan.c | |||
@@ -74,6 +74,159 @@ inline void do_balance_mark_leaf_dirty(struct tree_balance *tb, | |||
74 | * Note that all *num* count new items being created. | 74 | * Note that all *num* count new items being created. |
75 | */ | 75 | */ |
76 | 76 | ||
77 | static void balance_leaf_when_delete_del(struct tree_balance *tb) | ||
78 | { | ||
79 | struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); | ||
80 | int item_pos = PATH_LAST_POSITION(tb->tb_path); | ||
81 | struct buffer_info bi; | ||
82 | #ifdef CONFIG_REISERFS_CHECK | ||
83 | struct item_head *ih = item_head(tbS0, item_pos); | ||
84 | #endif | ||
85 | |||
86 | RFALSE(ih_item_len(ih) + IH_SIZE != -tb->insert_size[0], | ||
87 | "vs-12013: mode Delete, insert size %d, ih to be deleted %h", | ||
88 | -tb->insert_size[0], ih); | ||
89 | |||
90 | buffer_info_init_tbS0(tb, &bi); | ||
91 | leaf_delete_items(&bi, 0, item_pos, 1, -1); | ||
92 | |||
93 | if (!item_pos && tb->CFL[0]) { | ||
94 | if (B_NR_ITEMS(tbS0)) { | ||
95 | replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); | ||
96 | } else { | ||
97 | if (!PATH_H_POSITION(tb->tb_path, 1)) | ||
98 | replace_key(tb, tb->CFL[0], tb->lkey[0], | ||
99 | PATH_H_PPARENT(tb->tb_path, 0), 0); | ||
100 | } | ||
101 | } | ||
102 | |||
103 | RFALSE(!item_pos && !tb->CFL[0], | ||
104 | "PAP-12020: tb->CFL[0]==%p, tb->L[0]==%p", tb->CFL[0], | ||
105 | tb->L[0]); | ||
106 | } | ||
107 | |||
108 | /* cut item in S[0] */ | ||
109 | static void balance_leaf_when_delete_cut(struct tree_balance *tb) | ||
110 | { | ||
111 | struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); | ||
112 | int item_pos = PATH_LAST_POSITION(tb->tb_path); | ||
113 | struct item_head *ih = item_head(tbS0, item_pos); | ||
114 | int pos_in_item = tb->tb_path->pos_in_item; | ||
115 | struct buffer_info bi; | ||
116 | buffer_info_init_tbS0(tb, &bi); | ||
117 | |||
118 | if (is_direntry_le_ih(ih)) { | ||
119 | /* | ||
120 | * UFS unlink semantics are such that you can only | ||
121 | * delete one directory entry at a time. | ||
122 | * | ||
123 | * when we cut a directory tb->insert_size[0] means | ||
124 | * number of entries to be cut (always 1) | ||
125 | */ | ||
126 | tb->insert_size[0] = -1; | ||
127 | leaf_cut_from_buffer(&bi, item_pos, pos_in_item, | ||
128 | -tb->insert_size[0]); | ||
129 | |||
130 | RFALSE(!item_pos && !pos_in_item && !tb->CFL[0], | ||
131 | "PAP-12030: can not change delimiting key. CFL[0]=%p", | ||
132 | tb->CFL[0]); | ||
133 | |||
134 | if (!item_pos && !pos_in_item && tb->CFL[0]) | ||
135 | replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); | ||
136 | } else { | ||
137 | leaf_cut_from_buffer(&bi, item_pos, pos_in_item, | ||
138 | -tb->insert_size[0]); | ||
139 | |||
140 | RFALSE(!ih_item_len(ih), | ||
141 | "PAP-12035: cut must leave non-zero dynamic " | ||
142 | "length of item"); | ||
143 | } | ||
144 | } | ||
145 | |||
146 | static int balance_leaf_when_delete_left(struct tree_balance *tb) | ||
147 | { | ||
148 | struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); | ||
149 | int n = B_NR_ITEMS(tbS0); | ||
150 | |||
151 | /* L[0] must be joined with S[0] */ | ||
152 | if (tb->lnum[0] == -1) { | ||
153 | /* R[0] must be also joined with S[0] */ | ||
154 | if (tb->rnum[0] == -1) { | ||
155 | if (tb->FR[0] == PATH_H_PPARENT(tb->tb_path, 0)) { | ||
156 | /* | ||
157 | * all contents of all the | ||
158 | * 3 buffers will be in L[0] | ||
159 | */ | ||
160 | if (PATH_H_POSITION(tb->tb_path, 1) == 0 && | ||
161 | 1 < B_NR_ITEMS(tb->FR[0])) | ||
162 | replace_key(tb, tb->CFL[0], | ||
163 | tb->lkey[0], tb->FR[0], 1); | ||
164 | |||
165 | leaf_move_items(LEAF_FROM_S_TO_L, tb, n, -1, | ||
166 | NULL); | ||
167 | leaf_move_items(LEAF_FROM_R_TO_L, tb, | ||
168 | B_NR_ITEMS(tb->R[0]), -1, | ||
169 | NULL); | ||
170 | |||
171 | reiserfs_invalidate_buffer(tb, tbS0); | ||
172 | reiserfs_invalidate_buffer(tb, tb->R[0]); | ||
173 | |||
174 | return 0; | ||
175 | } | ||
176 | |||
177 | /* all contents of all the 3 buffers will be in R[0] */ | ||
178 | leaf_move_items(LEAF_FROM_S_TO_R, tb, n, -1, NULL); | ||
179 | leaf_move_items(LEAF_FROM_L_TO_R, tb, | ||
180 | B_NR_ITEMS(tb->L[0]), -1, NULL); | ||
181 | |||
182 | /* right_delimiting_key is correct in R[0] */ | ||
183 | replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); | ||
184 | |||
185 | reiserfs_invalidate_buffer(tb, tbS0); | ||
186 | reiserfs_invalidate_buffer(tb, tb->L[0]); | ||
187 | |||
188 | return -1; | ||
189 | } | ||
190 | |||
191 | RFALSE(tb->rnum[0] != 0, | ||
192 | "PAP-12045: rnum must be 0 (%d)", tb->rnum[0]); | ||
193 | /* all contents of L[0] and S[0] will be in L[0] */ | ||
194 | leaf_shift_left(tb, n, -1); | ||
195 | |||
196 | reiserfs_invalidate_buffer(tb, tbS0); | ||
197 | |||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | /* | ||
202 | * a part of contents of S[0] will be in L[0] and | ||
203 | * the rest part of S[0] will be in R[0] | ||
204 | */ | ||
205 | |||
206 | RFALSE((tb->lnum[0] + tb->rnum[0] < n) || | ||
207 | (tb->lnum[0] + tb->rnum[0] > n + 1), | ||
208 | "PAP-12050: rnum(%d) and lnum(%d) and item " | ||
209 | "number(%d) in S[0] are not consistent", | ||
210 | tb->rnum[0], tb->lnum[0], n); | ||
211 | RFALSE((tb->lnum[0] + tb->rnum[0] == n) && | ||
212 | (tb->lbytes != -1 || tb->rbytes != -1), | ||
213 | "PAP-12055: bad rbytes (%d)/lbytes (%d) " | ||
214 | "parameters when items are not split", | ||
215 | tb->rbytes, tb->lbytes); | ||
216 | RFALSE((tb->lnum[0] + tb->rnum[0] == n + 1) && | ||
217 | (tb->lbytes < 1 || tb->rbytes != -1), | ||
218 | "PAP-12060: bad rbytes (%d)/lbytes (%d) " | ||
219 | "parameters when items are split", | ||
220 | tb->rbytes, tb->lbytes); | ||
221 | |||
222 | leaf_shift_left(tb, tb->lnum[0], tb->lbytes); | ||
223 | leaf_shift_right(tb, tb->rnum[0], tb->rbytes); | ||
224 | |||
225 | reiserfs_invalidate_buffer(tb, tbS0); | ||
226 | |||
227 | return 0; | ||
228 | } | ||
229 | |||
77 | /* | 230 | /* |
78 | * Balance leaf node in case of delete or cut: insert_size[0] < 0 | 231 | * Balance leaf node in case of delete or cut: insert_size[0] < 0 |
79 | * | 232 | * |
@@ -87,7 +240,6 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag) | |||
87 | { | 240 | { |
88 | struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); | 241 | struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); |
89 | int item_pos = PATH_LAST_POSITION(tb->tb_path); | 242 | int item_pos = PATH_LAST_POSITION(tb->tb_path); |
90 | int pos_in_item = tb->tb_path->pos_in_item; | ||
91 | struct buffer_info bi; | 243 | struct buffer_info bi; |
92 | int n; | 244 | int n; |
93 | struct item_head *ih; | 245 | struct item_head *ih; |
@@ -104,166 +256,23 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag) | |||
104 | 256 | ||
105 | /* Delete or truncate the item */ | 257 | /* Delete or truncate the item */ |
106 | 258 | ||
107 | switch (flag) { | 259 | BUG_ON(flag != M_DELETE && flag != M_CUT); |
108 | case M_DELETE: /* delete item in S[0] */ | 260 | if (flag == M_DELETE) |
109 | 261 | balance_leaf_when_delete_del(tb); | |
110 | RFALSE(ih_item_len(ih) + IH_SIZE != -tb->insert_size[0], | 262 | else /* M_CUT */ |
111 | "vs-12013: mode Delete, insert size %d, ih to be deleted %h", | 263 | balance_leaf_when_delete_cut(tb); |
112 | -tb->insert_size[0], ih); | ||
113 | |||
114 | leaf_delete_items(&bi, 0, item_pos, 1, -1); | ||
115 | |||
116 | if (!item_pos && tb->CFL[0]) { | ||
117 | if (B_NR_ITEMS(tbS0)) { | ||
118 | replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, | ||
119 | 0); | ||
120 | } else { | ||
121 | if (!PATH_H_POSITION(tb->tb_path, 1)) | ||
122 | replace_key(tb, tb->CFL[0], tb->lkey[0], | ||
123 | PATH_H_PPARENT(tb->tb_path, | ||
124 | 0), 0); | ||
125 | } | ||
126 | } | ||
127 | |||
128 | RFALSE(!item_pos && !tb->CFL[0], | ||
129 | "PAP-12020: tb->CFL[0]==%p, tb->L[0]==%p", tb->CFL[0], | ||
130 | tb->L[0]); | ||
131 | |||
132 | break; | ||
133 | |||
134 | case M_CUT:{ /* cut item in S[0] */ | ||
135 | if (is_direntry_le_ih(ih)) { | ||
136 | |||
137 | /* | ||
138 | * UFS unlink semantics are such that you | ||
139 | * can only delete one directory entry at | ||
140 | * a time. | ||
141 | */ | ||
142 | |||
143 | /* | ||
144 | * when we cut a directory tb->insert_size[0] | ||
145 | * means number of entries to be cut (always 1) | ||
146 | */ | ||
147 | tb->insert_size[0] = -1; | ||
148 | leaf_cut_from_buffer(&bi, item_pos, pos_in_item, | ||
149 | -tb->insert_size[0]); | ||
150 | |||
151 | RFALSE(!item_pos && !pos_in_item && !tb->CFL[0], | ||
152 | "PAP-12030: can not change delimiting key. CFL[0]=%p", | ||
153 | tb->CFL[0]); | ||
154 | |||
155 | if (!item_pos && !pos_in_item && tb->CFL[0]) { | ||
156 | replace_key(tb, tb->CFL[0], tb->lkey[0], | ||
157 | tbS0, 0); | ||
158 | } | ||
159 | } else { | ||
160 | leaf_cut_from_buffer(&bi, item_pos, pos_in_item, | ||
161 | -tb->insert_size[0]); | ||
162 | |||
163 | RFALSE(!ih_item_len(ih), | ||
164 | "PAP-12035: cut must leave non-zero dynamic length of item"); | ||
165 | } | ||
166 | break; | ||
167 | } | ||
168 | 264 | ||
169 | default: | ||
170 | print_cur_tb("12040"); | ||
171 | reiserfs_panic(tb->tb_sb, "PAP-12040", | ||
172 | "unexpected mode: %s(%d)", | ||
173 | (flag == | ||
174 | M_PASTE) ? "PASTE" : ((flag == | ||
175 | M_INSERT) ? "INSERT" : | ||
176 | "UNKNOWN"), flag); | ||
177 | } | ||
178 | 265 | ||
179 | /* | 266 | /* |
180 | * the rule is that no shifting occurs unless by shifting | 267 | * the rule is that no shifting occurs unless by shifting |
181 | * a node can be freed | 268 | * a node can be freed |
182 | */ | 269 | */ |
183 | n = B_NR_ITEMS(tbS0); | 270 | n = B_NR_ITEMS(tbS0); |
184 | /* L[0] takes part in balancing */ | ||
185 | if (tb->lnum[0]) { | ||
186 | /* L[0] must be joined with S[0] */ | ||
187 | if (tb->lnum[0] == -1) { | ||
188 | /* R[0] must be also joined with S[0] */ | ||
189 | if (tb->rnum[0] == -1) { | ||
190 | if (tb->FR[0] == PATH_H_PPARENT(tb->tb_path, 0)) { | ||
191 | /* | ||
192 | * all contents of all the 3 buffers | ||
193 | * will be in L[0] | ||
194 | */ | ||
195 | if (PATH_H_POSITION(tb->tb_path, 1) == 0 | ||
196 | && 1 < B_NR_ITEMS(tb->FR[0])) | ||
197 | replace_key(tb, tb->CFL[0], | ||
198 | tb->lkey[0], | ||
199 | tb->FR[0], 1); | ||
200 | |||
201 | leaf_move_items(LEAF_FROM_S_TO_L, tb, n, | ||
202 | -1, NULL); | ||
203 | leaf_move_items(LEAF_FROM_R_TO_L, tb, | ||
204 | B_NR_ITEMS(tb->R[0]), | ||
205 | -1, NULL); | ||
206 | |||
207 | reiserfs_invalidate_buffer(tb, tbS0); | ||
208 | reiserfs_invalidate_buffer(tb, | ||
209 | tb->R[0]); | ||
210 | |||
211 | return 0; | ||
212 | } | ||
213 | /* | ||
214 | * all contents of all the 3 buffers will | ||
215 | * be in R[0] | ||
216 | */ | ||
217 | leaf_move_items(LEAF_FROM_S_TO_R, tb, n, -1, | ||
218 | NULL); | ||
219 | leaf_move_items(LEAF_FROM_L_TO_R, tb, | ||
220 | B_NR_ITEMS(tb->L[0]), -1, NULL); | ||
221 | 271 | ||
222 | /* right_delimiting_key is correct in R[0] */ | ||
223 | replace_key(tb, tb->CFR[0], tb->rkey[0], | ||
224 | tb->R[0], 0); | ||
225 | 272 | ||
226 | reiserfs_invalidate_buffer(tb, tbS0); | 273 | /* L[0] takes part in balancing */ |
227 | reiserfs_invalidate_buffer(tb, tb->L[0]); | 274 | if (tb->lnum[0]) |
228 | 275 | return balance_leaf_when_delete_left(tb); | |
229 | return -1; | ||
230 | } | ||
231 | |||
232 | RFALSE(tb->rnum[0] != 0, | ||
233 | "PAP-12045: rnum must be 0 (%d)", tb->rnum[0]); | ||
234 | /* all contents of L[0] and S[0] will be in L[0] */ | ||
235 | leaf_shift_left(tb, n, -1); | ||
236 | |||
237 | reiserfs_invalidate_buffer(tb, tbS0); | ||
238 | |||
239 | return 0; | ||
240 | } | ||
241 | |||
242 | /* | ||
243 | * a part of contents of S[0] will be in L[0] and the | ||
244 | * rest part of S[0] will be in R[0] | ||
245 | */ | ||
246 | |||
247 | RFALSE((tb->lnum[0] + tb->rnum[0] < n) || | ||
248 | (tb->lnum[0] + tb->rnum[0] > n + 1), | ||
249 | "PAP-12050: rnum(%d) and lnum(%d) and item number(%d) in S[0] are not consistent", | ||
250 | tb->rnum[0], tb->lnum[0], n); | ||
251 | RFALSE((tb->lnum[0] + tb->rnum[0] == n) && | ||
252 | (tb->lbytes != -1 || tb->rbytes != -1), | ||
253 | "PAP-12055: bad rbytes (%d)/lbytes (%d) parameters when items are not split", | ||
254 | tb->rbytes, tb->lbytes); | ||
255 | RFALSE((tb->lnum[0] + tb->rnum[0] == n + 1) && | ||
256 | (tb->lbytes < 1 || tb->rbytes != -1), | ||
257 | "PAP-12060: bad rbytes (%d)/lbytes (%d) parameters when items are split", | ||
258 | tb->rbytes, tb->lbytes); | ||
259 | |||
260 | leaf_shift_left(tb, tb->lnum[0], tb->lbytes); | ||
261 | leaf_shift_right(tb, tb->rnum[0], tb->rbytes); | ||
262 | |||
263 | reiserfs_invalidate_buffer(tb, tbS0); | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | 276 | ||
268 | if (tb->rnum[0] == -1) { | 277 | if (tb->rnum[0] == -1) { |
269 | /* all contents of R[0] and S[0] will be in R[0] */ | 278 | /* all contents of R[0] and S[0] will be in R[0] */ |
@@ -1880,9 +1889,8 @@ void do_balance(struct tree_balance *tb, struct item_head *ih, | |||
1880 | 1889 | ||
1881 | /* Balance internal level of the tree. */ | 1890 | /* Balance internal level of the tree. */ |
1882 | for (h = 1; h < MAX_HEIGHT && tb->insert_size[h]; h++) | 1891 | for (h = 1; h < MAX_HEIGHT && tb->insert_size[h]; h++) |
1883 | child_pos = | 1892 | child_pos = balance_internal(tb, h, child_pos, insert_key, |
1884 | balance_internal(tb, h, child_pos, insert_key, insert_ptr); | 1893 | insert_ptr); |
1885 | 1894 | ||
1886 | do_balance_completed(tb); | 1895 | do_balance_completed(tb); |
1887 | |||
1888 | } | 1896 | } |