Lines Matching refs:c

32 static int dbg_check_bud_bytes(struct ubifs_info *c);
42 struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum) in ubifs_search_bud() argument
47 spin_lock(&c->buds_lock); in ubifs_search_bud()
48 p = c->buds.rb_node; in ubifs_search_bud()
56 spin_unlock(&c->buds_lock); in ubifs_search_bud()
60 spin_unlock(&c->buds_lock); in ubifs_search_bud()
71 struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum) in ubifs_get_wbuf() argument
77 if (!c->jheads) in ubifs_get_wbuf()
80 spin_lock(&c->buds_lock); in ubifs_get_wbuf()
81 p = c->buds.rb_node; in ubifs_get_wbuf()
90 spin_unlock(&c->buds_lock); in ubifs_get_wbuf()
91 return &c->jheads[jhead].wbuf; in ubifs_get_wbuf()
94 spin_unlock(&c->buds_lock); in ubifs_get_wbuf()
102 static inline long long empty_log_bytes(const struct ubifs_info *c) in empty_log_bytes() argument
106 h = (long long)c->lhead_lnum * c->leb_size + c->lhead_offs; in empty_log_bytes()
107 t = (long long)c->ltail_lnum * c->leb_size; in empty_log_bytes()
110 return c->log_bytes - h + t; in empty_log_bytes()
113 else if (c->lhead_lnum != c->ltail_lnum) in empty_log_bytes()
116 return c->log_bytes; in empty_log_bytes()
124 void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud) in ubifs_add_bud() argument
130 spin_lock(&c->buds_lock); in ubifs_add_bud()
131 p = &c->buds.rb_node; in ubifs_add_bud()
143 rb_insert_color(&bud->rb, &c->buds); in ubifs_add_bud()
144 if (c->jheads) { in ubifs_add_bud()
145 jhead = &c->jheads[bud->jhead]; in ubifs_add_bud()
148 ubifs_assert(c->replaying && c->ro_mount); in ubifs_add_bud()
156 c->bud_bytes += c->leb_size - bud->start; in ubifs_add_bud()
159 bud->start, dbg_jhead(bud->jhead), c->bud_bytes); in ubifs_add_bud()
160 spin_unlock(&c->buds_lock); in ubifs_add_bud()
176 int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs) in ubifs_add_bud_to_log() argument
185 ref = kzalloc(c->ref_node_alsz, GFP_NOFS); in ubifs_add_bud_to_log()
191 mutex_lock(&c->log_mutex); in ubifs_add_bud_to_log()
192 ubifs_assert(!c->ro_media && !c->ro_mount); in ubifs_add_bud_to_log()
193 if (c->ro_error) { in ubifs_add_bud_to_log()
199 if (empty_log_bytes(c) - c->ref_node_alsz < c->min_log_bytes) { in ubifs_add_bud_to_log()
201 empty_log_bytes(c), c->min_log_bytes); in ubifs_add_bud_to_log()
202 ubifs_commit_required(c); in ubifs_add_bud_to_log()
216 if (c->bud_bytes + c->leb_size - offs > c->max_bud_bytes) { in ubifs_add_bud_to_log()
218 c->bud_bytes, c->max_bud_bytes); in ubifs_add_bud_to_log()
219 ubifs_commit_required(c); in ubifs_add_bud_to_log()
229 if (c->bud_bytes >= c->bg_bud_bytes && in ubifs_add_bud_to_log()
230 c->cmt_state == COMMIT_RESTING) { in ubifs_add_bud_to_log()
232 c->bud_bytes, c->max_bud_bytes); in ubifs_add_bud_to_log()
233 ubifs_request_bg_commit(c); in ubifs_add_bud_to_log()
245 if (c->lhead_offs > c->leb_size - c->ref_node_alsz) { in ubifs_add_bud_to_log()
246 c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum); in ubifs_add_bud_to_log()
247 ubifs_assert(c->lhead_lnum != c->ltail_lnum); in ubifs_add_bud_to_log()
248 c->lhead_offs = 0; in ubifs_add_bud_to_log()
251 if (c->lhead_offs == 0) { in ubifs_add_bud_to_log()
253 err = ubifs_leb_unmap(c, c->lhead_lnum); in ubifs_add_bud_to_log()
266 err = ubifs_leb_map(c, bud->lnum); in ubifs_add_bud_to_log()
272 c->lhead_lnum, c->lhead_offs); in ubifs_add_bud_to_log()
273 err = ubifs_write_node(c, ref, UBIFS_REF_NODE_SZ, c->lhead_lnum, in ubifs_add_bud_to_log()
274 c->lhead_offs); in ubifs_add_bud_to_log()
278 c->lhead_offs += c->ref_node_alsz; in ubifs_add_bud_to_log()
280 ubifs_add_bud(c, bud); in ubifs_add_bud_to_log()
282 mutex_unlock(&c->log_mutex); in ubifs_add_bud_to_log()
287 mutex_unlock(&c->log_mutex); in ubifs_add_bud_to_log()
300 static void remove_buds(struct ubifs_info *c) in remove_buds() argument
304 ubifs_assert(list_empty(&c->old_buds)); in remove_buds()
305 c->cmt_bud_bytes = 0; in remove_buds()
306 spin_lock(&c->buds_lock); in remove_buds()
307 p = rb_first(&c->buds); in remove_buds()
315 wbuf = &c->jheads[bud->jhead].wbuf; in remove_buds()
322 c->cmt_bud_bytes += wbuf->offs - bud->start; in remove_buds()
325 wbuf->offs - bud->start, c->cmt_bud_bytes); in remove_buds()
328 c->cmt_bud_bytes += c->leb_size - bud->start; in remove_buds()
331 c->leb_size - bud->start, c->cmt_bud_bytes); in remove_buds()
332 rb_erase(p1, &c->buds); in remove_buds()
340 list_move(&bud->list, &c->old_buds); in remove_buds()
343 spin_unlock(&c->buds_lock); in remove_buds()
359 int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum) in ubifs_log_start_commit() argument
366 err = dbg_check_bud_bytes(c); in ubifs_log_start_commit()
370 max_len = UBIFS_CS_NODE_SZ + c->jhead_cnt * UBIFS_REF_NODE_SZ; in ubifs_log_start_commit()
371 max_len = ALIGN(max_len, c->min_io_size); in ubifs_log_start_commit()
377 cs->cmt_no = cpu_to_le64(c->cmt_no); in ubifs_log_start_commit()
378 ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0); in ubifs_log_start_commit()
388 for (i = 0; i < c->jhead_cnt; i++) { in ubifs_log_start_commit()
389 int lnum = c->jheads[i].wbuf.lnum; in ubifs_log_start_commit()
390 int offs = c->jheads[i].wbuf.offs; in ubifs_log_start_commit()
392 if (lnum == -1 || offs == c->leb_size) in ubifs_log_start_commit()
403 ubifs_prepare_node(c, ref, UBIFS_REF_NODE_SZ, 0); in ubifs_log_start_commit()
407 ubifs_pad(c, buf + len, ALIGN(len, c->min_io_size) - len); in ubifs_log_start_commit()
410 if (c->lhead_offs) { in ubifs_log_start_commit()
411 c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum); in ubifs_log_start_commit()
412 ubifs_assert(c->lhead_lnum != c->ltail_lnum); in ubifs_log_start_commit()
413 c->lhead_offs = 0; in ubifs_log_start_commit()
417 err = ubifs_leb_unmap(c, c->lhead_lnum); in ubifs_log_start_commit()
421 len = ALIGN(len, c->min_io_size); in ubifs_log_start_commit()
422 dbg_log("writing commit start at LEB %d:0, len %d", c->lhead_lnum, len); in ubifs_log_start_commit()
423 err = ubifs_leb_write(c, c->lhead_lnum, cs, 0, len); in ubifs_log_start_commit()
427 *ltail_lnum = c->lhead_lnum; in ubifs_log_start_commit()
429 c->lhead_offs += len; in ubifs_log_start_commit()
430 if (c->lhead_offs == c->leb_size) { in ubifs_log_start_commit()
431 c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum); in ubifs_log_start_commit()
432 c->lhead_offs = 0; in ubifs_log_start_commit()
435 remove_buds(c); in ubifs_log_start_commit()
441 c->min_log_bytes = 0; in ubifs_log_start_commit()
458 int ubifs_log_end_commit(struct ubifs_info *c, int ltail_lnum) in ubifs_log_end_commit() argument
467 mutex_lock(&c->log_mutex); in ubifs_log_end_commit()
470 c->ltail_lnum, ltail_lnum); in ubifs_log_end_commit()
472 c->ltail_lnum = ltail_lnum; in ubifs_log_end_commit()
477 c->min_log_bytes = c->leb_size; in ubifs_log_end_commit()
479 spin_lock(&c->buds_lock); in ubifs_log_end_commit()
480 c->bud_bytes -= c->cmt_bud_bytes; in ubifs_log_end_commit()
481 spin_unlock(&c->buds_lock); in ubifs_log_end_commit()
483 err = dbg_check_bud_bytes(c); in ubifs_log_end_commit()
487 err = ubifs_write_master(c); in ubifs_log_end_commit()
490 mutex_unlock(&c->log_mutex); in ubifs_log_end_commit()
507 int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum) in ubifs_log_post_commit() argument
511 while (!list_empty(&c->old_buds)) { in ubifs_log_post_commit()
514 bud = list_entry(c->old_buds.next, struct ubifs_bud, list); in ubifs_log_post_commit()
515 err = ubifs_return_leb(c, bud->lnum); in ubifs_log_post_commit()
521 mutex_lock(&c->log_mutex); in ubifs_log_post_commit()
522 for (lnum = old_ltail_lnum; lnum != c->ltail_lnum; in ubifs_log_post_commit()
523 lnum = ubifs_next_log_lnum(c, lnum)) { in ubifs_log_post_commit()
525 err = ubifs_leb_unmap(c, lnum); in ubifs_log_post_commit()
530 mutex_unlock(&c->log_mutex); in ubifs_log_post_commit()
602 static int add_node(struct ubifs_info *c, void *buf, int *lnum, int *offs, in add_node() argument
606 int len = le32_to_cpu(ch->len), remains = c->leb_size - *offs; in add_node()
609 int sz = ALIGN(*offs, c->min_io_size), err; in add_node()
611 ubifs_pad(c, buf + *offs, sz - *offs); in add_node()
612 err = ubifs_leb_change(c, *lnum, buf, sz); in add_node()
615 *lnum = ubifs_next_log_lnum(c, *lnum); in add_node()
633 int ubifs_consolidate_log(struct ubifs_info *c) in ubifs_consolidate_log() argument
641 dbg_rcvry("log tail LEB %d, log head LEB %d", c->ltail_lnum, in ubifs_consolidate_log()
642 c->lhead_lnum); in ubifs_consolidate_log()
643 buf = vmalloc(c->leb_size); in ubifs_consolidate_log()
646 lnum = c->ltail_lnum; in ubifs_consolidate_log()
649 sleb = ubifs_scan(c, lnum, 0, c->sbuf, 0); in ubifs_consolidate_log()
664 err = add_node(c, buf, &write_lnum, in ubifs_consolidate_log()
674 err = add_node(c, buf, &write_lnum, &offs, in ubifs_consolidate_log()
683 if (lnum == c->lhead_lnum) in ubifs_consolidate_log()
685 lnum = ubifs_next_log_lnum(c, lnum); in ubifs_consolidate_log()
688 int sz = ALIGN(offs, c->min_io_size); in ubifs_consolidate_log()
690 ubifs_pad(c, buf + offs, sz - offs); in ubifs_consolidate_log()
691 err = ubifs_leb_change(c, write_lnum, buf, sz); in ubifs_consolidate_log()
694 offs = ALIGN(offs, c->min_io_size); in ubifs_consolidate_log()
698 if (write_lnum == c->lhead_lnum) { in ubifs_consolidate_log()
699 ubifs_err(c, "log is too full"); in ubifs_consolidate_log()
705 lnum = ubifs_next_log_lnum(c, lnum); in ubifs_consolidate_log()
706 err = ubifs_leb_unmap(c, lnum); in ubifs_consolidate_log()
709 } while (lnum != c->lhead_lnum); in ubifs_consolidate_log()
710 c->lhead_lnum = write_lnum; in ubifs_consolidate_log()
711 c->lhead_offs = offs; in ubifs_consolidate_log()
712 dbg_rcvry("new log head at %d:%d", c->lhead_lnum, c->lhead_offs); in ubifs_consolidate_log()
731 static int dbg_check_bud_bytes(struct ubifs_info *c) in dbg_check_bud_bytes() argument
737 if (!dbg_is_chk_gen(c)) in dbg_check_bud_bytes()
740 spin_lock(&c->buds_lock); in dbg_check_bud_bytes()
741 for (i = 0; i < c->jhead_cnt; i++) in dbg_check_bud_bytes()
742 list_for_each_entry(bud, &c->jheads[i].buds_list, list) in dbg_check_bud_bytes()
743 bud_bytes += c->leb_size - bud->start; in dbg_check_bud_bytes()
745 if (c->bud_bytes != bud_bytes) { in dbg_check_bud_bytes()
746 ubifs_err(c, "bad bud_bytes %lld, calculated %lld", in dbg_check_bud_bytes()
747 c->bud_bytes, bud_bytes); in dbg_check_bud_bytes()
750 spin_unlock(&c->buds_lock); in dbg_check_bud_bytes()