diff options
-rw-r--r-- | fs/btrfs/delayed-ref.c | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index 56cdfe988d69..2502ba5a3ac0 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c | |||
@@ -199,42 +199,30 @@ static struct btrfs_delayed_ref_head *htree_insert(struct rb_root *root, | |||
199 | */ | 199 | */ |
200 | static struct btrfs_delayed_ref_head * | 200 | static struct btrfs_delayed_ref_head * |
201 | find_ref_head(struct rb_root *root, u64 bytenr, | 201 | find_ref_head(struct rb_root *root, u64 bytenr, |
202 | struct btrfs_delayed_ref_head **last, int return_bigger) | 202 | int return_bigger) |
203 | { | 203 | { |
204 | struct rb_node *n; | 204 | struct rb_node *n; |
205 | struct btrfs_delayed_ref_head *entry; | 205 | struct btrfs_delayed_ref_head *entry; |
206 | int cmp = 0; | ||
207 | 206 | ||
208 | n = root->rb_node; | 207 | n = root->rb_node; |
209 | entry = NULL; | 208 | entry = NULL; |
210 | while (n) { | 209 | while (n) { |
211 | entry = rb_entry(n, struct btrfs_delayed_ref_head, href_node); | 210 | entry = rb_entry(n, struct btrfs_delayed_ref_head, href_node); |
212 | if (last) | ||
213 | *last = entry; | ||
214 | 211 | ||
215 | if (bytenr < entry->node.bytenr) | 212 | if (bytenr < entry->node.bytenr) |
216 | cmp = -1; | ||
217 | else if (bytenr > entry->node.bytenr) | ||
218 | cmp = 1; | ||
219 | else | ||
220 | cmp = 0; | ||
221 | |||
222 | if (cmp < 0) | ||
223 | n = n->rb_left; | 213 | n = n->rb_left; |
224 | else if (cmp > 0) | 214 | else if (bytenr > entry->node.bytenr) |
225 | n = n->rb_right; | 215 | n = n->rb_right; |
226 | else | 216 | else |
227 | return entry; | 217 | return entry; |
228 | } | 218 | } |
229 | if (entry && return_bigger) { | 219 | if (entry && return_bigger) { |
230 | if (cmp > 0) { | 220 | if (bytenr > entry->node.bytenr) { |
231 | n = rb_next(&entry->href_node); | 221 | n = rb_next(&entry->href_node); |
232 | if (!n) | 222 | if (!n) |
233 | n = rb_first(root); | 223 | n = rb_first(root); |
234 | entry = rb_entry(n, struct btrfs_delayed_ref_head, | 224 | entry = rb_entry(n, struct btrfs_delayed_ref_head, |
235 | href_node); | 225 | href_node); |
236 | if (last) | ||
237 | *last = entry; | ||
238 | return entry; | 226 | return entry; |
239 | } | 227 | } |
240 | return entry; | 228 | return entry; |
@@ -414,12 +402,12 @@ btrfs_select_ref_head(struct btrfs_trans_handle *trans) | |||
414 | 402 | ||
415 | again: | 403 | again: |
416 | start = delayed_refs->run_delayed_start; | 404 | start = delayed_refs->run_delayed_start; |
417 | head = find_ref_head(&delayed_refs->href_root, start, NULL, 1); | 405 | head = find_ref_head(&delayed_refs->href_root, start, 1); |
418 | if (!head && !loop) { | 406 | if (!head && !loop) { |
419 | delayed_refs->run_delayed_start = 0; | 407 | delayed_refs->run_delayed_start = 0; |
420 | start = 0; | 408 | start = 0; |
421 | loop = true; | 409 | loop = true; |
422 | head = find_ref_head(&delayed_refs->href_root, start, NULL, 1); | 410 | head = find_ref_head(&delayed_refs->href_root, start, 1); |
423 | if (!head) | 411 | if (!head) |
424 | return NULL; | 412 | return NULL; |
425 | } else if (!head && loop) { | 413 | } else if (!head && loop) { |
@@ -897,7 +885,7 @@ btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr) | |||
897 | struct btrfs_delayed_ref_root *delayed_refs; | 885 | struct btrfs_delayed_ref_root *delayed_refs; |
898 | 886 | ||
899 | delayed_refs = &trans->transaction->delayed_refs; | 887 | delayed_refs = &trans->transaction->delayed_refs; |
900 | return find_ref_head(&delayed_refs->href_root, bytenr, NULL, 0); | 888 | return find_ref_head(&delayed_refs->href_root, bytenr, 0); |
901 | } | 889 | } |
902 | 890 | ||
903 | void btrfs_delayed_ref_exit(void) | 891 | void btrfs_delayed_ref_exit(void) |