Lines Matching +full:exact +full:- +full:len

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
34 xfs_extlen_t len, in xfs_extent_busy_insert_list() argument
38 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_insert_list()
46 new->group = xfs_group_hold(xg); in xfs_extent_busy_insert_list()
47 new->bno = bno; in xfs_extent_busy_insert_list()
48 new->length = len; in xfs_extent_busy_insert_list()
49 INIT_LIST_HEAD(&new->list); in xfs_extent_busy_insert_list()
50 new->flags = flags; in xfs_extent_busy_insert_list()
53 trace_xfs_extent_busy(xg, bno, len); in xfs_extent_busy_insert_list()
55 spin_lock(&eb->eb_lock); in xfs_extent_busy_insert_list()
56 rbp = &eb->eb_tree.rb_node; in xfs_extent_busy_insert_list()
61 if (new->bno < busyp->bno) { in xfs_extent_busy_insert_list()
62 rbp = &(*rbp)->rb_left; in xfs_extent_busy_insert_list()
63 ASSERT(new->bno + new->length <= busyp->bno); in xfs_extent_busy_insert_list()
64 } else if (new->bno > busyp->bno) { in xfs_extent_busy_insert_list()
65 rbp = &(*rbp)->rb_right; in xfs_extent_busy_insert_list()
66 ASSERT(bno >= busyp->bno + busyp->length); in xfs_extent_busy_insert_list()
72 rb_link_node(&new->rb_node, parent, rbp); in xfs_extent_busy_insert_list()
73 rb_insert_color(&new->rb_node, &eb->eb_tree); in xfs_extent_busy_insert_list()
76 list_add_tail(&new->list, busy_list); in xfs_extent_busy_insert_list()
77 spin_unlock(&eb->eb_lock); in xfs_extent_busy_insert_list()
85 xfs_extlen_t len, in xfs_extent_busy_insert() argument
88 xfs_extent_busy_insert_list(xg, bno, len, flags, &tp->t_busy); in xfs_extent_busy_insert()
95 xfs_extlen_t len, in xfs_extent_busy_insert_discard() argument
98 xfs_extent_busy_insert_list(xg, bno, len, XFS_EXTENT_BUSY_DISCARDED, in xfs_extent_busy_insert_discard()
106 * extent, -1 for an overlapping but not exact busy extent, and 1 for an exact
107 * match. This is done so that a non-zero return indicates an overlap that
109 * used to distinguish between a partial or exact match.
115 xfs_extlen_t len) in xfs_extent_busy_search() argument
117 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_search()
123 spin_lock(&eb->eb_lock); in xfs_extent_busy_search()
124 rbp = eb->eb_tree.rb_node; in xfs_extent_busy_search()
127 if (bno < busyp->bno) { in xfs_extent_busy_search()
128 /* may overlap, but exact start block is lower */ in xfs_extent_busy_search()
129 if (bno + len > busyp->bno) in xfs_extent_busy_search()
130 match = -1; in xfs_extent_busy_search()
131 rbp = rbp->rb_left; in xfs_extent_busy_search()
132 } else if (bno > busyp->bno) { in xfs_extent_busy_search()
133 /* may overlap, but exact start block is higher */ in xfs_extent_busy_search()
134 if (bno < busyp->bno + busyp->length) in xfs_extent_busy_search()
135 match = -1; in xfs_extent_busy_search()
136 rbp = rbp->rb_right; in xfs_extent_busy_search()
138 /* bno matches busyp, length determines exact match */ in xfs_extent_busy_search()
139 match = (busyp->length == len) ? 1 : -1; in xfs_extent_busy_search()
143 spin_unlock(&eb->eb_lock); in xfs_extent_busy_search()
165 __releases(&eb->eb_lock) in xfs_extent_busy_update_extent()
166 __acquires(&eb->eb_lock) in xfs_extent_busy_update_extent()
168 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_update_extent()
170 xfs_agblock_t bbno = busyp->bno; in xfs_extent_busy_update_extent()
171 xfs_agblock_t bend = bbno + busyp->length; in xfs_extent_busy_update_extent()
178 if (busyp->flags & XFS_EXTENT_BUSY_DISCARDED) { in xfs_extent_busy_update_extent()
179 spin_unlock(&eb->eb_lock); in xfs_extent_busy_update_extent()
181 spin_lock(&eb->eb_lock); in xfs_extent_busy_update_extent()
201 * +---------+ in xfs_extent_busy_update_extent()
220 * +-----------------+ in xfs_extent_busy_update_extent()
226 * +--------------------------+ in xfs_extent_busy_update_extent()
232 * +--------------------------+ in xfs_extent_busy_update_extent()
238 * +-----------------------------------+ in xfs_extent_busy_update_extent()
254 rb_erase(&busyp->rb_node, &eb->eb_tree); in xfs_extent_busy_update_extent()
255 busyp->length = 0; in xfs_extent_busy_update_extent()
262 * +---------+ in xfs_extent_busy_update_extent()
268 * +------------------+ in xfs_extent_busy_update_extent()
272 busyp->bno = fend; in xfs_extent_busy_update_extent()
273 busyp->length = bend - fend; in xfs_extent_busy_update_extent()
279 * +-------------+ in xfs_extent_busy_update_extent()
285 * +----------------------+ in xfs_extent_busy_update_extent()
288 busyp->length = fbno - busyp->bno; in xfs_extent_busy_update_extent()
297 spin_unlock(&eb->eb_lock); in xfs_extent_busy_update_extent()
298 xfs_log_force(xg->xg_mount, XFS_LOG_SYNC); in xfs_extent_busy_update_extent()
300 spin_lock(&eb->eb_lock); in xfs_extent_busy_update_extent()
314 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_reuse()
318 spin_lock(&eb->eb_lock); in xfs_extent_busy_reuse()
320 rbp = eb->eb_tree.rb_node; in xfs_extent_busy_reuse()
324 xfs_agblock_t bbno = busyp->bno; in xfs_extent_busy_reuse()
325 xfs_agblock_t bend = bbno + busyp->length; in xfs_extent_busy_reuse()
328 rbp = rbp->rb_left; in xfs_extent_busy_reuse()
331 rbp = rbp->rb_right; in xfs_extent_busy_reuse()
339 spin_unlock(&eb->eb_lock); in xfs_extent_busy_reuse()
345 * args->minlen no suitable extent could be found, and the higher level
360 xfs_extlen_t *len, in xfs_extent_busy_trim() argument
363 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_trim()
369 ASSERT(*len > 0); in xfs_extent_busy_trim()
371 spin_lock(&eb->eb_lock); in xfs_extent_busy_trim()
373 flen = *len; in xfs_extent_busy_trim()
374 rbp = eb->eb_tree.rb_node; in xfs_extent_busy_trim()
379 xfs_agblock_t bbno = busyp->bno; in xfs_extent_busy_trim()
380 xfs_agblock_t bend = bbno + busyp->length; in xfs_extent_busy_trim()
383 rbp = rbp->rb_left; in xfs_extent_busy_trim()
386 rbp = rbp->rb_right; in xfs_extent_busy_trim()
397 * +---------+ in xfs_extent_busy_trim()
403 * +-------------+ in xfs_extent_busy_trim()
409 * +-------------+ in xfs_extent_busy_trim()
415 * +-----------------+ in xfs_extent_busy_trim()
427 * +----------------------+ in xfs_extent_busy_trim()
433 * +--------------------------+ in xfs_extent_busy_trim()
437 * +-------+ in xfs_extent_busy_trim()
448 * +------------------+ in xfs_extent_busy_trim()
454 * +--------------------------+ in xfs_extent_busy_trim()
458 * +-------+ in xfs_extent_busy_trim()
469 * +-----------------------------------+ in xfs_extent_busy_trim()
473 * +-------+ OR +-------+ in xfs_extent_busy_trim()
496 if (bbno - fbno >= maxlen) { in xfs_extent_busy_trim()
499 } else if (fend - bend >= maxlen * 4) { in xfs_extent_busy_trim()
502 } else if (bbno - fbno >= minlen) { in xfs_extent_busy_trim()
510 flen = fend - fbno; in xfs_extent_busy_trim()
514 if (fbno != *bno || flen != *len) { in xfs_extent_busy_trim()
515 trace_xfs_extent_busy_trim(xg, *bno, *len, fbno, flen); in xfs_extent_busy_trim()
517 *len = flen; in xfs_extent_busy_trim()
518 *busy_gen = eb->eb_gen; in xfs_extent_busy_trim()
521 spin_unlock(&eb->eb_lock); in xfs_extent_busy_trim()
526 * re-check if the trimmed extent satisfies the minlen requirement. in xfs_extent_busy_trim()
537 struct xfs_extent_busy_tree *eb = busyp->group->xg_busy_extents; in xfs_extent_busy_clear_one()
539 if (busyp->length) { in xfs_extent_busy_clear_one()
541 !(busyp->flags & XFS_EXTENT_BUSY_SKIP_DISCARD)) { in xfs_extent_busy_clear_one()
542 busyp->flags = XFS_EXTENT_BUSY_DISCARDED; in xfs_extent_busy_clear_one()
545 trace_xfs_extent_busy_clear(busyp->group, busyp->bno, in xfs_extent_busy_clear_one()
546 busyp->length); in xfs_extent_busy_clear_one()
547 rb_erase(&busyp->rb_node, &eb->eb_tree); in xfs_extent_busy_clear_one()
550 list_del_init(&busyp->list); in xfs_extent_busy_clear_one()
551 xfs_group_put(busyp->group); in xfs_extent_busy_clear_one()
573 struct xfs_group *xg = xfs_group_hold(busyp->group); in xfs_extent_busy_clear()
574 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_clear()
577 spin_lock(&eb->eb_lock); in xfs_extent_busy_clear()
584 busyp->group == xg); in xfs_extent_busy_clear()
587 eb->eb_gen++; in xfs_extent_busy_clear()
588 wake_up_all(&eb->eb_wait); in xfs_extent_busy_clear()
590 spin_unlock(&eb->eb_lock); in xfs_extent_busy_clear()
605 * In this case, we must return -EAGAIN to avoid a deadlock by informing the
616 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_flush()
620 error = xfs_log_force(tp->t_mountp, XFS_LOG_SYNC); in xfs_extent_busy_flush()
625 if (!list_empty(&tp->t_busy)) { in xfs_extent_busy_flush()
629 if (busy_gen != READ_ONCE(eb->eb_gen)) in xfs_extent_busy_flush()
633 return -EAGAIN; in xfs_extent_busy_flush()
638 prepare_to_wait(&eb->eb_wait, &wait, TASK_KILLABLE); in xfs_extent_busy_flush()
639 if (busy_gen != READ_ONCE(eb->eb_gen)) in xfs_extent_busy_flush()
644 finish_wait(&eb->eb_wait, &wait); in xfs_extent_busy_flush()
653 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_wait_group()
656 prepare_to_wait(&eb->eb_wait, &wait, TASK_KILLABLE); in xfs_extent_busy_wait_group()
657 if (RB_EMPTY_ROOT(&eb->eb_tree)) in xfs_extent_busy_wait_group()
661 finish_wait(&eb->eb_wait, &wait); in xfs_extent_busy_wait_group()
694 diff = b1->group->xg_gno - b2->group->xg_gno; in xfs_extent_busy_ag_cmp()
696 diff = b1->bno - b2->bno; in xfs_extent_busy_ag_cmp()
706 struct xfs_extent_busy_tree *eb = xg->xg_busy_extents; in xfs_extent_busy_list_empty()
709 spin_lock(&eb->eb_lock); in xfs_extent_busy_list_empty()
710 res = RB_EMPTY_ROOT(&eb->eb_tree); in xfs_extent_busy_list_empty()
711 *busy_gen = READ_ONCE(eb->eb_gen); in xfs_extent_busy_list_empty()
712 spin_unlock(&eb->eb_lock); in xfs_extent_busy_list_empty()
724 spin_lock_init(&eb->eb_lock); in xfs_extent_busy_alloc()
725 init_waitqueue_head(&eb->eb_wait); in xfs_extent_busy_alloc()
726 eb->eb_tree = RB_ROOT; in xfs_extent_busy_alloc()