Lines Matching refs:c

72 static int switch_gc_head(struct ubifs_info *c)  in switch_gc_head()  argument
74 int err, gc_lnum = c->gc_lnum; in switch_gc_head()
75 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in switch_gc_head()
80 c->leb_size - wbuf->offs - wbuf->used); in switch_gc_head()
90 err = ubifs_leb_unmap(c, gc_lnum); in switch_gc_head()
98 err = ubifs_add_bud_to_log(c, GCHD, gc_lnum, 0); in switch_gc_head()
102 c->gc_lnum = -1; in switch_gc_head()
119 struct ubifs_info *c = priv; in data_nodes_cmp() local
129 ubifs_assert(key_type(c, &sa->key) == UBIFS_DATA_KEY); in data_nodes_cmp()
130 ubifs_assert(key_type(c, &sb->key) == UBIFS_DATA_KEY); in data_nodes_cmp()
134 inuma = key_inum(c, &sa->key); in data_nodes_cmp()
135 inumb = key_inum(c, &sb->key); in data_nodes_cmp()
138 unsigned int blka = key_block(c, &sa->key); in data_nodes_cmp()
139 unsigned int blkb = key_block(c, &sb->key); in data_nodes_cmp()
163 struct ubifs_info *c = priv; in nondata_nodes_cmp() local
173 ubifs_assert(key_type(c, &sa->key) != UBIFS_DATA_KEY && in nondata_nodes_cmp()
174 key_type(c, &sb->key) != UBIFS_DATA_KEY); in nondata_nodes_cmp()
187 ubifs_assert(key_type(c, &sa->key) == UBIFS_DENT_KEY || in nondata_nodes_cmp()
188 key_type(c, &sa->key) == UBIFS_XENT_KEY); in nondata_nodes_cmp()
189 ubifs_assert(key_type(c, &sb->key) == UBIFS_DENT_KEY || in nondata_nodes_cmp()
190 key_type(c, &sb->key) == UBIFS_XENT_KEY); in nondata_nodes_cmp()
196 inuma = key_inum(c, &sa->key); in nondata_nodes_cmp()
197 inumb = key_inum(c, &sb->key); in nondata_nodes_cmp()
200 uint32_t hasha = key_hash(c, &sa->key); in nondata_nodes_cmp()
201 uint32_t hashb = key_hash(c, &sb->key); in nondata_nodes_cmp()
238 static int sort_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in sort_nodes() argument
264 ubifs_assert(key_type(c, &snod->key) == UBIFS_DATA_KEY || in sort_nodes()
265 key_type(c, &snod->key) == UBIFS_INO_KEY || in sort_nodes()
266 key_type(c, &snod->key) == UBIFS_DENT_KEY || in sort_nodes()
267 key_type(c, &snod->key) == UBIFS_XENT_KEY); in sort_nodes()
269 err = ubifs_tnc_has_node(c, &snod->key, 0, sleb->lnum, in sort_nodes()
284 if (key_type(c, &snod->key) != UBIFS_DATA_KEY) in sort_nodes()
289 list_sort(c, &sleb->nodes, &data_nodes_cmp); in sort_nodes()
290 list_sort(c, nondata, &nondata_nodes_cmp); in sort_nodes()
292 err = dbg_check_data_nodes_order(c, &sleb->nodes); in sort_nodes()
295 err = dbg_check_nondata_nodes_order(c, nondata); in sort_nodes()
312 static int move_node(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in move_node() argument
322 err = ubifs_tnc_replace(c, &snod->key, sleb->lnum, in move_node()
340 static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb) in move_nodes() argument
344 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in move_nodes()
351 err = switch_gc_head(c); in move_nodes()
356 err = sort_nodes(c, sleb, &nondata, &min); in move_nodes()
367 avail = c->leb_size - wbuf->offs - wbuf->used; in move_nodes()
375 err = move_node(c, sleb, snod, wbuf); in move_nodes()
382 avail = c->leb_size - wbuf->offs - wbuf->used; in move_nodes()
394 if (key_type(c, &snod->key) == UBIFS_DENT_KEY || in move_nodes()
400 err = move_node(c, sleb, snod, wbuf); in move_nodes()
412 err = switch_gc_head(c); in move_nodes()
437 static int gc_sync_wbufs(struct ubifs_info *c) in gc_sync_wbufs() argument
441 for (i = 0; i < c->jhead_cnt; i++) { in gc_sync_wbufs()
444 err = ubifs_wbuf_sync(&c->jheads[i].wbuf); in gc_sync_wbufs()
460 int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp) in ubifs_garbage_collect_leb() argument
464 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in ubifs_garbage_collect_leb()
467 ubifs_assert(c->gc_lnum != -1 || wbuf->offs + wbuf->used == 0 || in ubifs_garbage_collect_leb()
468 c->need_recovery); in ubifs_garbage_collect_leb()
469 ubifs_assert(c->gc_lnum != lnum); in ubifs_garbage_collect_leb()
472 if (lp->free + lp->dirty == c->leb_size) { in ubifs_garbage_collect_leb()
477 if (lp->free != c->leb_size) { in ubifs_garbage_collect_leb()
483 err = gc_sync_wbufs(c); in ubifs_garbage_collect_leb()
486 err = ubifs_change_one_lp(c, lp->lnum, c->leb_size, in ubifs_garbage_collect_leb()
491 err = ubifs_leb_unmap(c, lp->lnum); in ubifs_garbage_collect_leb()
495 if (c->gc_lnum == -1) { in ubifs_garbage_collect_leb()
496 c->gc_lnum = lnum; in ubifs_garbage_collect_leb()
507 sleb = ubifs_scan(c, lnum, 0, c->sbuf, 0); in ubifs_garbage_collect_leb()
524 key_read(c, ubifs_idx_key(c, idx), &snod->key); in ubifs_garbage_collect_leb()
525 err = ubifs_dirty_idx_node(c, &snod->key, level, lnum, in ubifs_garbage_collect_leb()
539 list_add(&idx_gc->list, &c->idx_gc); in ubifs_garbage_collect_leb()
547 err = ubifs_change_one_lp(c, lnum, c->leb_size, 0, 0, in ubifs_garbage_collect_leb()
556 err = move_nodes(c, sleb); in ubifs_garbage_collect_leb()
560 err = gc_sync_wbufs(c); in ubifs_garbage_collect_leb()
564 err = ubifs_change_one_lp(c, lnum, c->leb_size, 0, 0, 0, 0); in ubifs_garbage_collect_leb()
569 c->gced_lnum = lnum; in ubifs_garbage_collect_leb()
571 c->gc_seq += 1; in ubifs_garbage_collect_leb()
574 if (c->gc_lnum == -1) { in ubifs_garbage_collect_leb()
575 c->gc_lnum = lnum; in ubifs_garbage_collect_leb()
582 err = ubifs_leb_unmap(c, lnum); in ubifs_garbage_collect_leb()
596 c->gced_lnum = lnum; in ubifs_garbage_collect_leb()
598 c->gc_seq += 1; in ubifs_garbage_collect_leb()
639 int ubifs_garbage_collect(struct ubifs_info *c, int anyway) in ubifs_garbage_collect() argument
641 int i, err, ret, min_space = c->dead_wm; in ubifs_garbage_collect()
643 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in ubifs_garbage_collect()
645 ubifs_assert_cmt_locked(c); in ubifs_garbage_collect()
646 ubifs_assert(!c->ro_media && !c->ro_mount); in ubifs_garbage_collect()
648 if (ubifs_gc_should_commit(c)) in ubifs_garbage_collect()
653 if (c->ro_error) { in ubifs_garbage_collect()
667 if (ubifs_gc_should_commit(c)) { in ubifs_garbage_collect()
672 if (i > SOFT_LEBS_LIMIT && !list_empty(&c->idx_gc)) { in ubifs_garbage_collect()
678 ubifs_commit_required(c); in ubifs_garbage_collect()
700 ret = ubifs_find_dirty_leb(c, &lp, min_space, anyway ? 0 : 1); in ubifs_garbage_collect()
711 space_before = c->leb_size - wbuf->offs - wbuf->used; in ubifs_garbage_collect()
715 ret = ubifs_garbage_collect_leb(c, &lp); in ubifs_garbage_collect()
724 err = ubifs_return_leb(c, lp.lnum); in ubifs_garbage_collect()
751 space_after = c->leb_size - wbuf->offs - wbuf->used; in ubifs_garbage_collect()
758 if (min_space < c->dead_wm) in ubifs_garbage_collect()
759 min_space = c->dead_wm; in ubifs_garbage_collect()
787 if (min_space > c->dark_wm) in ubifs_garbage_collect()
788 min_space = c->dark_wm; in ubifs_garbage_collect()
792 if (ret == -ENOSPC && !list_empty(&c->idx_gc)) { in ubifs_garbage_collect()
794 ubifs_commit_required(c); in ubifs_garbage_collect()
800 err = ubifs_leb_unmap(c, c->gc_lnum); in ubifs_garbage_collect()
813 ubifs_ro_mode(c, ret); in ubifs_garbage_collect()
815 ubifs_return_leb(c, lp.lnum); in ubifs_garbage_collect()
830 int ubifs_gc_start_commit(struct ubifs_info *c) in ubifs_gc_start_commit() argument
836 ubifs_get_lprops(c); in ubifs_gc_start_commit()
843 lp = ubifs_fast_find_freeable(c); in ubifs_gc_start_commit()
852 err = ubifs_leb_unmap(c, lp->lnum); in ubifs_gc_start_commit()
855 lp = ubifs_change_lp(c, lp, c->leb_size, 0, lp->flags, 0); in ubifs_gc_start_commit()
865 list_for_each_entry(idx_gc, &c->idx_gc, list) in ubifs_gc_start_commit()
870 lp = ubifs_fast_find_frdi_idx(c); in ubifs_gc_start_commit()
886 lp = ubifs_change_lp(c, lp, c->leb_size, 0, flags, 1); in ubifs_gc_start_commit()
896 list_add(&idx_gc->list, &c->idx_gc); in ubifs_gc_start_commit()
899 ubifs_release_lprops(c); in ubifs_gc_start_commit()
909 int ubifs_gc_end_commit(struct ubifs_info *c) in ubifs_gc_end_commit() argument
915 wbuf = &c->jheads[GCHD].wbuf; in ubifs_gc_end_commit()
917 list_for_each_entry_safe(idx_gc, tmp, &c->idx_gc, list) in ubifs_gc_end_commit()
920 err = ubifs_leb_unmap(c, idx_gc->lnum); in ubifs_gc_end_commit()
923 err = ubifs_change_one_lp(c, idx_gc->lnum, LPROPS_NC, in ubifs_gc_end_commit()
943 void ubifs_destroy_idx_gc(struct ubifs_info *c) in ubifs_destroy_idx_gc() argument
945 while (!list_empty(&c->idx_gc)) { in ubifs_destroy_idx_gc()
948 idx_gc = list_entry(c->idx_gc.next, struct ubifs_gced_idx_leb, in ubifs_destroy_idx_gc()
950 c->idx_gc_cnt -= 1; in ubifs_destroy_idx_gc()
962 int ubifs_get_idx_gc_leb(struct ubifs_info *c) in ubifs_get_idx_gc_leb() argument
967 if (list_empty(&c->idx_gc)) in ubifs_get_idx_gc_leb()
969 idx_gc = list_entry(c->idx_gc.next, struct ubifs_gced_idx_leb, list); in ubifs_get_idx_gc_leb()