Lines Matching refs:c

81 static int switch_gc_head(struct ubifs_info *c)  in switch_gc_head()  argument
83 int err, gc_lnum = c->gc_lnum; in switch_gc_head()
84 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in switch_gc_head()
89 c->leb_size - wbuf->offs - wbuf->used); in switch_gc_head()
99 err = ubifs_leb_unmap(c, gc_lnum); in switch_gc_head()
107 err = ubifs_add_bud_to_log(c, GCHD, gc_lnum, 0); in switch_gc_head()
111 c->gc_lnum = -1; in switch_gc_head()
128 struct ubifs_info *c = priv; in data_nodes_cmp() local
138 ubifs_assert(key_type(c, &sa->key) == UBIFS_DATA_KEY); in data_nodes_cmp()
139 ubifs_assert(key_type(c, &sb->key) == UBIFS_DATA_KEY); in data_nodes_cmp()
143 inuma = key_inum(c, &sa->key); in data_nodes_cmp()
144 inumb = key_inum(c, &sb->key); in data_nodes_cmp()
147 unsigned int blka = key_block(c, &sa->key); in data_nodes_cmp()
148 unsigned int blkb = key_block(c, &sb->key); in data_nodes_cmp()
172 struct ubifs_info *c = priv; in nondata_nodes_cmp() local
182 ubifs_assert(key_type(c, &sa->key) != UBIFS_DATA_KEY && in nondata_nodes_cmp()
183 key_type(c, &sb->key) != UBIFS_DATA_KEY); in nondata_nodes_cmp()
196 ubifs_assert(key_type(c, &sa->key) == UBIFS_DENT_KEY || in nondata_nodes_cmp()
197 key_type(c, &sa->key) == UBIFS_XENT_KEY); in nondata_nodes_cmp()
198 ubifs_assert(key_type(c, &sb->key) == UBIFS_DENT_KEY || in nondata_nodes_cmp()
199 key_type(c, &sb->key) == UBIFS_XENT_KEY); in nondata_nodes_cmp()
205 inuma = key_inum(c, &sa->key); in nondata_nodes_cmp()
206 inumb = key_inum(c, &sb->key); in nondata_nodes_cmp()
209 uint32_t hasha = key_hash(c, &sa->key); in nondata_nodes_cmp()
210 uint32_t hashb = key_hash(c, &sb->key); in nondata_nodes_cmp()
247 static int sort_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in sort_nodes() argument
273 ubifs_assert(key_type(c, &snod->key) == UBIFS_DATA_KEY || in sort_nodes()
274 key_type(c, &snod->key) == UBIFS_INO_KEY || in sort_nodes()
275 key_type(c, &snod->key) == UBIFS_DENT_KEY || in sort_nodes()
276 key_type(c, &snod->key) == UBIFS_XENT_KEY); in sort_nodes()
278 err = ubifs_tnc_has_node(c, &snod->key, 0, sleb->lnum, in sort_nodes()
293 if (key_type(c, &snod->key) != UBIFS_DATA_KEY) in sort_nodes()
298 list_sort(c, &sleb->nodes, &data_nodes_cmp); in sort_nodes()
299 list_sort(c, nondata, &nondata_nodes_cmp); in sort_nodes()
301 err = dbg_check_data_nodes_order(c, &sleb->nodes); in sort_nodes()
304 err = dbg_check_nondata_nodes_order(c, nondata); in sort_nodes()
321 static int move_node(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in move_node() argument
331 err = ubifs_tnc_replace(c, &snod->key, sleb->lnum, in move_node()
349 static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb) in move_nodes() argument
353 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in move_nodes()
360 err = switch_gc_head(c); in move_nodes()
365 err = sort_nodes(c, sleb, &nondata, &min); in move_nodes()
376 avail = c->leb_size - wbuf->offs - wbuf->used; in move_nodes()
384 err = move_node(c, sleb, snod, wbuf); in move_nodes()
391 avail = c->leb_size - wbuf->offs - wbuf->used; in move_nodes()
403 if (key_type(c, &snod->key) == UBIFS_DENT_KEY || in move_nodes()
409 err = move_node(c, sleb, snod, wbuf); in move_nodes()
421 err = switch_gc_head(c); in move_nodes()
446 static int gc_sync_wbufs(struct ubifs_info *c) in gc_sync_wbufs() argument
450 for (i = 0; i < c->jhead_cnt; i++) { in gc_sync_wbufs()
453 err = ubifs_wbuf_sync(&c->jheads[i].wbuf); in gc_sync_wbufs()
469 int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp) in ubifs_garbage_collect_leb() argument
473 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in ubifs_garbage_collect_leb()
476 ubifs_assert(c->gc_lnum != -1 || wbuf->offs + wbuf->used == 0 || in ubifs_garbage_collect_leb()
477 c->need_recovery); in ubifs_garbage_collect_leb()
478 ubifs_assert(c->gc_lnum != lnum); in ubifs_garbage_collect_leb()
481 if (lp->free + lp->dirty == c->leb_size) { in ubifs_garbage_collect_leb()
486 if (lp->free != c->leb_size) { in ubifs_garbage_collect_leb()
492 err = gc_sync_wbufs(c); in ubifs_garbage_collect_leb()
495 err = ubifs_change_one_lp(c, lp->lnum, c->leb_size, in ubifs_garbage_collect_leb()
500 err = ubifs_leb_unmap(c, lp->lnum); in ubifs_garbage_collect_leb()
504 if (c->gc_lnum == -1) { in ubifs_garbage_collect_leb()
505 c->gc_lnum = lnum; in ubifs_garbage_collect_leb()
516 sleb = ubifs_scan(c, lnum, 0, c->sbuf, 0); in ubifs_garbage_collect_leb()
533 key_read(c, ubifs_idx_key(c, idx), &snod->key); in ubifs_garbage_collect_leb()
534 err = ubifs_dirty_idx_node(c, &snod->key, level, lnum, in ubifs_garbage_collect_leb()
548 list_add(&idx_gc->list, &c->idx_gc); in ubifs_garbage_collect_leb()
556 err = ubifs_change_one_lp(c, lnum, c->leb_size, 0, 0, in ubifs_garbage_collect_leb()
565 err = move_nodes(c, sleb); in ubifs_garbage_collect_leb()
569 err = gc_sync_wbufs(c); in ubifs_garbage_collect_leb()
573 err = ubifs_change_one_lp(c, lnum, c->leb_size, 0, 0, 0, 0); in ubifs_garbage_collect_leb()
578 c->gced_lnum = lnum; in ubifs_garbage_collect_leb()
580 c->gc_seq += 1; in ubifs_garbage_collect_leb()
583 if (c->gc_lnum == -1) { in ubifs_garbage_collect_leb()
584 c->gc_lnum = lnum; in ubifs_garbage_collect_leb()
591 err = ubifs_leb_unmap(c, lnum); in ubifs_garbage_collect_leb()
605 c->gced_lnum = lnum; in ubifs_garbage_collect_leb()
607 c->gc_seq += 1; in ubifs_garbage_collect_leb()
648 int ubifs_garbage_collect(struct ubifs_info *c, int anyway) in ubifs_garbage_collect() argument
650 int i, err, ret, min_space = c->dead_wm; in ubifs_garbage_collect()
652 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in ubifs_garbage_collect()
654 ubifs_assert_cmt_locked(c); in ubifs_garbage_collect()
655 ubifs_assert(!c->ro_media && !c->ro_mount); in ubifs_garbage_collect()
657 if (ubifs_gc_should_commit(c)) in ubifs_garbage_collect()
662 if (c->ro_error) { in ubifs_garbage_collect()
676 if (ubifs_gc_should_commit(c)) { in ubifs_garbage_collect()
681 if (i > SOFT_LEBS_LIMIT && !list_empty(&c->idx_gc)) { in ubifs_garbage_collect()
687 ubifs_commit_required(c); in ubifs_garbage_collect()
709 ret = ubifs_find_dirty_leb(c, &lp, min_space, anyway ? 0 : 1); in ubifs_garbage_collect()
720 space_before = c->leb_size - wbuf->offs - wbuf->used; in ubifs_garbage_collect()
724 ret = ubifs_garbage_collect_leb(c, &lp); in ubifs_garbage_collect()
733 err = ubifs_return_leb(c, lp.lnum); in ubifs_garbage_collect()
760 space_after = c->leb_size - wbuf->offs - wbuf->used; in ubifs_garbage_collect()
767 if (min_space < c->dead_wm) in ubifs_garbage_collect()
768 min_space = c->dead_wm; in ubifs_garbage_collect()
796 if (min_space > c->dark_wm) in ubifs_garbage_collect()
797 min_space = c->dark_wm; in ubifs_garbage_collect()
801 if (ret == -ENOSPC && !list_empty(&c->idx_gc)) { in ubifs_garbage_collect()
803 ubifs_commit_required(c); in ubifs_garbage_collect()
809 err = ubifs_leb_unmap(c, c->gc_lnum); in ubifs_garbage_collect()
822 ubifs_ro_mode(c, ret); in ubifs_garbage_collect()
824 ubifs_return_leb(c, lp.lnum); in ubifs_garbage_collect()
839 int ubifs_gc_start_commit(struct ubifs_info *c) in ubifs_gc_start_commit() argument
845 ubifs_get_lprops(c); in ubifs_gc_start_commit()
852 lp = ubifs_fast_find_freeable(c); in ubifs_gc_start_commit()
861 err = ubifs_leb_unmap(c, lp->lnum); in ubifs_gc_start_commit()
864 lp = ubifs_change_lp(c, lp, c->leb_size, 0, lp->flags, 0); in ubifs_gc_start_commit()
874 list_for_each_entry(idx_gc, &c->idx_gc, list) in ubifs_gc_start_commit()
879 lp = ubifs_fast_find_frdi_idx(c); in ubifs_gc_start_commit()
895 lp = ubifs_change_lp(c, lp, c->leb_size, 0, flags, 1); in ubifs_gc_start_commit()
905 list_add(&idx_gc->list, &c->idx_gc); in ubifs_gc_start_commit()
908 ubifs_release_lprops(c); in ubifs_gc_start_commit()
918 int ubifs_gc_end_commit(struct ubifs_info *c) in ubifs_gc_end_commit() argument
924 wbuf = &c->jheads[GCHD].wbuf; in ubifs_gc_end_commit()
926 list_for_each_entry_safe(idx_gc, tmp, &c->idx_gc, list) in ubifs_gc_end_commit()
929 err = ubifs_leb_unmap(c, idx_gc->lnum); in ubifs_gc_end_commit()
932 err = ubifs_change_one_lp(c, idx_gc->lnum, LPROPS_NC, in ubifs_gc_end_commit()
952 void ubifs_destroy_idx_gc(struct ubifs_info *c) in ubifs_destroy_idx_gc() argument
954 while (!list_empty(&c->idx_gc)) { in ubifs_destroy_idx_gc()
957 idx_gc = list_entry(c->idx_gc.next, struct ubifs_gced_idx_leb, in ubifs_destroy_idx_gc()
959 c->idx_gc_cnt -= 1; in ubifs_destroy_idx_gc()
971 int ubifs_get_idx_gc_leb(struct ubifs_info *c) in ubifs_get_idx_gc_leb() argument
976 if (list_empty(&c->idx_gc)) in ubifs_get_idx_gc_leb()
978 idx_gc = list_entry(c->idx_gc.next, struct ubifs_gced_idx_leb, list); in ubifs_get_idx_gc_leb()