Lines Matching refs:c
42 static int valuable(struct ubifs_info *c, const struct ubifs_lprops *lprops) in valuable() argument
51 heap = &c->lpt_heap[cat - 1]; in valuable()
54 if (lprops->free + lprops->dirty >= c->dark_wm) in valuable()
58 n = c->lst.empty_lebs + c->freeable_cnt - in valuable()
59 c->lst.taken_empty_lebs; in valuable()
60 if (n < c->lsave_cnt) in valuable()
83 static int scan_for_dirty_cb(struct ubifs_info *c, in scan_for_dirty_cb() argument
93 if (!in_tree && valuable(c, lprops)) in scan_for_dirty_cb()
102 if (lprops->free + lprops->dirty == c->leb_size) { in scan_for_dirty_cb()
106 } else if (lprops->dirty < c->dead_wm) in scan_for_dirty_cb()
124 static const struct ubifs_lprops *scan_for_dirty(struct ubifs_info *c, in scan_for_dirty() argument
134 heap = &c->lpt_heap[LPROPS_FREE - 1]; in scan_for_dirty()
139 if (lprops->dirty < c->dead_wm) in scan_for_dirty()
150 list_for_each_entry(lprops, &c->uncat_list, list) { in scan_for_dirty()
157 if (lprops->dirty < c->dead_wm) in scan_for_dirty()
162 if (c->pnodes_have >= c->pnode_cnt) in scan_for_dirty()
169 err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum, in scan_for_dirty()
174 ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt); in scan_for_dirty()
175 c->lscan_lnum = data.lnum; in scan_for_dirty()
176 lprops = ubifs_lpt_lookup_dirty(c, data.lnum); in scan_for_dirty()
179 ubifs_assert(c, lprops->lnum == data.lnum); in scan_for_dirty()
180 ubifs_assert(c, lprops->free + lprops->dirty >= min_space); in scan_for_dirty()
181 ubifs_assert(c, lprops->dirty >= c->dead_wm || in scan_for_dirty()
183 lprops->free + lprops->dirty == c->leb_size)); in scan_for_dirty()
184 ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN)); in scan_for_dirty()
185 ubifs_assert(c, !exclude_index || !(lprops->flags & LPROPS_INDEX)); in scan_for_dirty()
221 int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp, in ubifs_find_dirty_leb() argument
228 ubifs_get_lprops(c); in ubifs_find_dirty_leb()
233 spin_lock(&c->space_lock); in ubifs_find_dirty_leb()
234 lebs = c->lst.empty_lebs + c->idx_gc_cnt; in ubifs_find_dirty_leb()
235 lebs += c->freeable_cnt - c->lst.taken_empty_lebs; in ubifs_find_dirty_leb()
243 if (c->bi.min_idx_lebs >= c->lst.idx_lebs) { in ubifs_find_dirty_leb()
244 rsvd_idx_lebs = c->bi.min_idx_lebs - c->lst.idx_lebs; in ubifs_find_dirty_leb()
247 spin_unlock(&c->space_lock); in ubifs_find_dirty_leb()
252 lp = ubifs_fast_find_empty(c); in ubifs_find_dirty_leb()
257 lp = ubifs_fast_find_freeable(c); in ubifs_find_dirty_leb()
266 spin_lock(&c->space_lock); in ubifs_find_dirty_leb()
267 exclude_index = (c->bi.min_idx_lebs >= c->lst.idx_lebs); in ubifs_find_dirty_leb()
268 spin_unlock(&c->space_lock); in ubifs_find_dirty_leb()
272 heap = &c->lpt_heap[LPROPS_DIRTY - 1]; in ubifs_find_dirty_leb()
273 idx_heap = &c->lpt_heap[LPROPS_DIRTY_IDX - 1]; in ubifs_find_dirty_leb()
288 if (sum < min_space || sum < c->half_leb_size) in ubifs_find_dirty_leb()
306 ubifs_assert(c, lp->free + lp->dirty >= c->dead_wm); in ubifs_find_dirty_leb()
312 lp = scan_for_dirty(c, min_space, pick_free, exclude_index); in ubifs_find_dirty_leb()
317 ubifs_assert(c, lp->dirty >= c->dead_wm || in ubifs_find_dirty_leb()
318 (pick_free && lp->free + lp->dirty == c->leb_size)); in ubifs_find_dirty_leb()
324 lp = ubifs_change_lp(c, lp, LPROPS_NC, LPROPS_NC, in ubifs_find_dirty_leb()
334 ubifs_release_lprops(c); in ubifs_find_dirty_leb()
350 static int scan_for_free_cb(struct ubifs_info *c, in scan_for_free_cb() argument
360 if (!in_tree && valuable(c, lprops)) in scan_for_free_cb()
369 if (!data->pick_free && lprops->free == c->leb_size) in scan_for_free_cb()
377 if (lprops->free + lprops->dirty == c->leb_size && lprops->dirty > 0) in scan_for_free_cb()
395 const struct ubifs_lprops *do_find_free_space(struct ubifs_info *c, in do_find_free_space() argument
405 lprops = ubifs_fast_find_free(c); in do_find_free_space()
410 lprops = ubifs_fast_find_empty(c); in do_find_free_space()
415 lprops = ubifs_fast_find_free(c); in do_find_free_space()
420 heap = &c->lpt_heap[LPROPS_DIRTY - 1]; in do_find_free_space()
433 list_for_each_entry(lprops, &c->uncat_list, list) { in do_find_free_space()
442 if (c->pnodes_have >= c->pnode_cnt) in do_find_free_space()
448 err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum, in do_find_free_space()
453 ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt); in do_find_free_space()
454 c->lscan_lnum = data.lnum; in do_find_free_space()
455 lprops = ubifs_lpt_lookup_dirty(c, data.lnum); in do_find_free_space()
458 ubifs_assert(c, lprops->lnum == data.lnum); in do_find_free_space()
459 ubifs_assert(c, lprops->free >= min_space); in do_find_free_space()
460 ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN)); in do_find_free_space()
461 ubifs_assert(c, !(lprops->flags & LPROPS_INDEX)); in do_find_free_space()
481 int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs, in ubifs_find_free_space() argument
488 ubifs_get_lprops(c); in ubifs_find_free_space()
491 spin_lock(&c->space_lock); in ubifs_find_free_space()
492 if (c->bi.min_idx_lebs > c->lst.idx_lebs) in ubifs_find_free_space()
493 rsvd_idx_lebs = c->bi.min_idx_lebs - c->lst.idx_lebs; in ubifs_find_free_space()
496 lebs = c->lst.empty_lebs + c->freeable_cnt + c->idx_gc_cnt - in ubifs_find_free_space()
497 c->lst.taken_empty_lebs; in ubifs_find_free_space()
503 if (c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) { in ubifs_find_free_space()
524 c->lst.taken_empty_lebs += 1; in ubifs_find_free_space()
526 spin_unlock(&c->space_lock); in ubifs_find_free_space()
528 lprops = do_find_free_space(c, min_space, pick_free, squeeze); in ubifs_find_free_space()
537 lprops = ubifs_change_lp(c, lprops, LPROPS_NC, LPROPS_NC, flags, 0); in ubifs_find_free_space()
544 spin_lock(&c->space_lock); in ubifs_find_free_space()
545 c->lst.taken_empty_lebs -= 1; in ubifs_find_free_space()
546 spin_unlock(&c->space_lock); in ubifs_find_free_space()
549 *offs = c->leb_size - lprops->free; in ubifs_find_free_space()
550 ubifs_release_lprops(c); in ubifs_find_free_space()
559 err = ubifs_leb_unmap(c, lnum); in ubifs_find_free_space()
564 dbg_find("found LEB %d, free %d", lnum, c->leb_size - *offs); in ubifs_find_free_space()
565 ubifs_assert(c, *offs <= c->leb_size - min_space); in ubifs_find_free_space()
570 spin_lock(&c->space_lock); in ubifs_find_free_space()
571 c->lst.taken_empty_lebs -= 1; in ubifs_find_free_space()
572 spin_unlock(&c->space_lock); in ubifs_find_free_space()
574 ubifs_release_lprops(c); in ubifs_find_free_space()
590 static int scan_for_idx_cb(struct ubifs_info *c, in scan_for_idx_cb() argument
600 if (!in_tree && valuable(c, lprops)) in scan_for_idx_cb()
606 if (lprops->free + lprops->dirty != c->leb_size) in scan_for_idx_cb()
621 static const struct ubifs_lprops *scan_for_leb_for_idx(struct ubifs_info *c) in scan_for_leb_for_idx() argument
628 err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum, in scan_for_leb_for_idx()
633 ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt); in scan_for_leb_for_idx()
634 c->lscan_lnum = data.lnum; in scan_for_leb_for_idx()
635 lprops = ubifs_lpt_lookup_dirty(c, data.lnum); in scan_for_leb_for_idx()
638 ubifs_assert(c, lprops->lnum == data.lnum); in scan_for_leb_for_idx()
639 ubifs_assert(c, lprops->free + lprops->dirty == c->leb_size); in scan_for_leb_for_idx()
640 ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN)); in scan_for_leb_for_idx()
641 ubifs_assert(c, !(lprops->flags & LPROPS_INDEX)); in scan_for_leb_for_idx()
661 int ubifs_find_free_leb_for_idx(struct ubifs_info *c) in ubifs_find_free_leb_for_idx() argument
666 ubifs_get_lprops(c); in ubifs_find_free_leb_for_idx()
668 lprops = ubifs_fast_find_empty(c); in ubifs_find_free_leb_for_idx()
670 lprops = ubifs_fast_find_freeable(c); in ubifs_find_free_leb_for_idx()
679 if (c->in_a_category_cnt != c->main_lebs || in ubifs_find_free_leb_for_idx()
680 c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) { in ubifs_find_free_leb_for_idx()
681 ubifs_assert(c, c->freeable_cnt == 0); in ubifs_find_free_leb_for_idx()
682 lprops = scan_for_leb_for_idx(c); in ubifs_find_free_leb_for_idx()
702 lprops = ubifs_change_lp(c, lprops, c->leb_size, 0, flags, 0); in ubifs_find_free_leb_for_idx()
708 ubifs_release_lprops(c); in ubifs_find_free_leb_for_idx()
715 err = ubifs_leb_unmap(c, lnum); in ubifs_find_free_leb_for_idx()
717 ubifs_change_one_lp(c, lnum, LPROPS_NC, LPROPS_NC, 0, in ubifs_find_free_leb_for_idx()
725 ubifs_release_lprops(c); in ubifs_find_free_leb_for_idx()
746 int ubifs_save_dirty_idx_lnums(struct ubifs_info *c) in ubifs_save_dirty_idx_lnums() argument
750 ubifs_get_lprops(c); in ubifs_save_dirty_idx_lnums()
752 c->dirty_idx.cnt = c->lpt_heap[LPROPS_DIRTY_IDX - 1].cnt; in ubifs_save_dirty_idx_lnums()
753 memcpy(c->dirty_idx.arr, c->lpt_heap[LPROPS_DIRTY_IDX - 1].arr, in ubifs_save_dirty_idx_lnums()
754 sizeof(void *) * c->dirty_idx.cnt); in ubifs_save_dirty_idx_lnums()
756 sort(c->dirty_idx.arr, c->dirty_idx.cnt, sizeof(void *), in ubifs_save_dirty_idx_lnums()
758 dbg_find("found %d dirty index LEBs", c->dirty_idx.cnt); in ubifs_save_dirty_idx_lnums()
759 if (c->dirty_idx.cnt) in ubifs_save_dirty_idx_lnums()
761 c->dirty_idx.arr[c->dirty_idx.cnt - 1]->lnum, in ubifs_save_dirty_idx_lnums()
762 c->dirty_idx.arr[c->dirty_idx.cnt - 1]->dirty, in ubifs_save_dirty_idx_lnums()
763 c->dirty_idx.arr[c->dirty_idx.cnt - 1]->free); in ubifs_save_dirty_idx_lnums()
765 for (i = 0; i < c->dirty_idx.cnt; i++) in ubifs_save_dirty_idx_lnums()
766 c->dirty_idx.arr[i] = (void *)(size_t)c->dirty_idx.arr[i]->lnum; in ubifs_save_dirty_idx_lnums()
767 ubifs_release_lprops(c); in ubifs_save_dirty_idx_lnums()
783 static int scan_dirty_idx_cb(struct ubifs_info *c, in scan_dirty_idx_cb() argument
793 if (!in_tree && valuable(c, lprops)) in scan_dirty_idx_cb()
799 if (lprops->free + lprops->dirty < c->min_idx_node_sz) in scan_dirty_idx_cb()
816 static int find_dirty_idx_leb(struct ubifs_info *c) in find_dirty_idx_leb() argument
825 heap = &c->lpt_heap[LPROPS_DIRTY_IDX - 1]; in find_dirty_idx_leb()
828 ret = scan_dirty_idx_cb(c, lprops, 1, &data); in find_dirty_idx_leb()
832 list_for_each_entry(lprops, &c->frdi_idx_list, list) { in find_dirty_idx_leb()
833 ret = scan_dirty_idx_cb(c, lprops, 1, &data); in find_dirty_idx_leb()
837 list_for_each_entry(lprops, &c->uncat_list, list) { in find_dirty_idx_leb()
838 ret = scan_dirty_idx_cb(c, lprops, 1, &data); in find_dirty_idx_leb()
842 if (c->pnodes_have >= c->pnode_cnt) in find_dirty_idx_leb()
845 err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum, in find_dirty_idx_leb()
851 ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt); in find_dirty_idx_leb()
852 c->lscan_lnum = data.lnum; in find_dirty_idx_leb()
853 lprops = ubifs_lpt_lookup_dirty(c, data.lnum); in find_dirty_idx_leb()
856 ubifs_assert(c, lprops->lnum == data.lnum); in find_dirty_idx_leb()
857 ubifs_assert(c, lprops->free + lprops->dirty >= c->min_idx_node_sz); in find_dirty_idx_leb()
858 ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN)); in find_dirty_idx_leb()
859 ubifs_assert(c, (lprops->flags & LPROPS_INDEX)); in find_dirty_idx_leb()
864 lprops = ubifs_change_lp(c, lprops, LPROPS_NC, LPROPS_NC, in find_dirty_idx_leb()
876 static int get_idx_gc_leb(struct ubifs_info *c) in get_idx_gc_leb() argument
881 err = ubifs_get_idx_gc_leb(c); in get_idx_gc_leb()
889 lp = ubifs_lpt_lookup_dirty(c, lnum); in get_idx_gc_leb()
892 lp = ubifs_change_lp(c, lp, LPROPS_NC, LPROPS_NC, in get_idx_gc_leb()
905 static int find_dirtiest_idx_leb(struct ubifs_info *c) in find_dirtiest_idx_leb() argument
911 if (!c->dirty_idx.cnt) in find_dirtiest_idx_leb()
914 lnum = (size_t)c->dirty_idx.arr[--c->dirty_idx.cnt]; in find_dirtiest_idx_leb()
915 lp = ubifs_lpt_lookup(c, lnum); in find_dirtiest_idx_leb()
920 lp = ubifs_change_lp(c, lp, LPROPS_NC, LPROPS_NC, in find_dirtiest_idx_leb()
928 ubifs_assert(c, lp->flags & LPROPS_TAKEN); in find_dirtiest_idx_leb()
929 ubifs_assert(c, lp->flags & LPROPS_INDEX); in find_dirtiest_idx_leb()
941 int ubifs_find_dirty_idx_leb(struct ubifs_info *c) in ubifs_find_dirty_idx_leb() argument
945 ubifs_get_lprops(c); in ubifs_find_dirty_idx_leb()
951 err = find_dirtiest_idx_leb(c); in ubifs_find_dirty_idx_leb()
955 err = find_dirty_idx_leb(c); in ubifs_find_dirty_idx_leb()
959 err = get_idx_gc_leb(c); in ubifs_find_dirty_idx_leb()
961 ubifs_release_lprops(c); in ubifs_find_dirty_idx_leb()