Lines Matching full:c
5 * Copyright (C) 2006-2008 Nokia Corporation.
23 static int dbg_check_bud_bytes(struct ubifs_info *c);
27 * @c: UBIFS file-system description object
33 struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum) in ubifs_search_bud() argument
38 spin_lock(&c->buds_lock); in ubifs_search_bud()
39 p = c->buds.rb_node; in ubifs_search_bud()
47 spin_unlock(&c->buds_lock); in ubifs_search_bud()
51 spin_unlock(&c->buds_lock); in ubifs_search_bud()
57 * @c: UBIFS file-system description object
62 struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum) in ubifs_get_wbuf() argument
68 if (!c->jheads) in ubifs_get_wbuf()
71 spin_lock(&c->buds_lock); in ubifs_get_wbuf()
72 p = c->buds.rb_node; in ubifs_get_wbuf()
81 spin_unlock(&c->buds_lock); in ubifs_get_wbuf()
82 return &c->jheads[jhead].wbuf; in ubifs_get_wbuf()
85 spin_unlock(&c->buds_lock); in ubifs_get_wbuf()
91 * @c: UBIFS file-system description object
93 static inline long long empty_log_bytes(const struct ubifs_info *c) in empty_log_bytes() argument
97 h = (long long)c->lhead_lnum * c->leb_size + c->lhead_offs; in empty_log_bytes()
98 t = (long long)c->ltail_lnum * c->leb_size; in empty_log_bytes()
101 return c->log_bytes - h + t; in empty_log_bytes()
104 else if (c->lhead_lnum != c->ltail_lnum) in empty_log_bytes()
107 return c->log_bytes; in empty_log_bytes()
112 * @c: UBIFS file-system description object
115 void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud) in ubifs_add_bud() argument
121 spin_lock(&c->buds_lock); in ubifs_add_bud()
122 p = &c->buds.rb_node; in ubifs_add_bud()
134 rb_insert_color(&bud->rb, &c->buds); in ubifs_add_bud()
135 if (c->jheads) { in ubifs_add_bud()
136 jhead = &c->jheads[bud->jhead]; in ubifs_add_bud()
139 ubifs_assert(c->replaying && c->ro_mount); in ubifs_add_bud()
147 c->bud_bytes += c->leb_size - bud->start; in ubifs_add_bud()
150 bud->start, dbg_jhead(bud->jhead), c->bud_bytes); in ubifs_add_bud()
151 spin_unlock(&c->buds_lock); in ubifs_add_bud()
156 * @c: UBIFS file-system description object
163 * exceed the 'c->max_bud_bytes' limit. Returns zero in case of success,
167 int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs) in ubifs_add_bud_to_log() argument
176 ref = kzalloc(c->ref_node_alsz, GFP_NOFS); in ubifs_add_bud_to_log()
182 mutex_lock(&c->log_mutex); in ubifs_add_bud_to_log()
183 ubifs_assert(!c->ro_media && !c->ro_mount); in ubifs_add_bud_to_log()
184 if (c->ro_error) { in ubifs_add_bud_to_log()
190 if (empty_log_bytes(c) - c->ref_node_alsz < c->min_log_bytes) { in ubifs_add_bud_to_log()
192 empty_log_bytes(c), c->min_log_bytes); in ubifs_add_bud_to_log()
193 ubifs_commit_required(c); in ubifs_add_bud_to_log()
200 * 'c->max_bud_bytes' limit, because we want to guarantee mount time in ubifs_add_bud_to_log()
203 * It is not necessary to hold @c->buds_lock when reading @c->bud_bytes in ubifs_add_bud_to_log()
204 * because we are holding @c->log_mutex. All @c->bud_bytes take place in ubifs_add_bud_to_log()
205 * when both @c->log_mutex and @c->bud_bytes are locked. in ubifs_add_bud_to_log()
207 if (c->bud_bytes + c->leb_size - offs > c->max_bud_bytes) { in ubifs_add_bud_to_log()
209 c->bud_bytes, c->max_bud_bytes); in ubifs_add_bud_to_log()
210 ubifs_commit_required(c); in ubifs_add_bud_to_log()
217 * OK to read 'c->cmt_state' without spinlock because integer reads in ubifs_add_bud_to_log()
220 if (c->bud_bytes >= c->bg_bud_bytes && in ubifs_add_bud_to_log()
221 c->cmt_state == COMMIT_RESTING) { in ubifs_add_bud_to_log()
223 c->bud_bytes, c->max_bud_bytes); in ubifs_add_bud_to_log()
224 ubifs_request_bg_commit(c); in ubifs_add_bud_to_log()
236 if (c->lhead_offs > c->leb_size - c->ref_node_alsz) { in ubifs_add_bud_to_log()
237 c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum); in ubifs_add_bud_to_log()
238 ubifs_assert(c->lhead_lnum != c->ltail_lnum); in ubifs_add_bud_to_log()
239 c->lhead_offs = 0; in ubifs_add_bud_to_log()
242 if (c->lhead_offs == 0) { in ubifs_add_bud_to_log()
244 err = ubifs_leb_unmap(c, c->lhead_lnum); in ubifs_add_bud_to_log()
257 err = ubifs_leb_map(c, bud->lnum); in ubifs_add_bud_to_log()
263 c->lhead_lnum, c->lhead_offs); in ubifs_add_bud_to_log()
264 err = ubifs_write_node(c, ref, UBIFS_REF_NODE_SZ, c->lhead_lnum, in ubifs_add_bud_to_log()
265 c->lhead_offs); in ubifs_add_bud_to_log()
269 c->lhead_offs += c->ref_node_alsz; in ubifs_add_bud_to_log()
271 ubifs_add_bud(c, bud); in ubifs_add_bud_to_log()
273 mutex_unlock(&c->log_mutex); in ubifs_add_bud_to_log()
278 mutex_unlock(&c->log_mutex); in ubifs_add_bud_to_log()
286 * @c: UBIFS file-system description object
291 static void remove_buds(struct ubifs_info *c) in remove_buds() argument
295 ubifs_assert(list_empty(&c->old_buds)); in remove_buds()
296 c->cmt_bud_bytes = 0; in remove_buds()
297 spin_lock(&c->buds_lock); in remove_buds()
298 p = rb_first(&c->buds); in remove_buds()
306 wbuf = &c->jheads[bud->jhead].wbuf; in remove_buds()
313 c->cmt_bud_bytes += wbuf->offs - bud->start; in remove_buds()
316 wbuf->offs - bud->start, c->cmt_bud_bytes); in remove_buds()
319 c->cmt_bud_bytes += c->leb_size - bud->start; in remove_buds()
322 c->leb_size - bud->start, c->cmt_bud_bytes); in remove_buds()
323 rb_erase(p1, &c->buds); in remove_buds()
331 list_move(&bud->list, &c->old_buds); in remove_buds()
334 spin_unlock(&c->buds_lock); in remove_buds()
339 * @c: UBIFS file-system description object
350 int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum) in ubifs_log_start_commit() argument
357 err = dbg_check_bud_bytes(c); in ubifs_log_start_commit()
361 max_len = UBIFS_CS_NODE_SZ + c->jhead_cnt * UBIFS_REF_NODE_SZ; in ubifs_log_start_commit()
362 max_len = ALIGN(max_len, c->min_io_size); in ubifs_log_start_commit()
368 cs->cmt_no = cpu_to_le64(c->cmt_no); in ubifs_log_start_commit()
369 ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0); in ubifs_log_start_commit()
372 * Note, we do not lock 'c->log_mutex' because this is the commit start in ubifs_log_start_commit()
379 for (i = 0; i < c->jhead_cnt; i++) { in ubifs_log_start_commit()
380 int lnum = c->jheads[i].wbuf.lnum; in ubifs_log_start_commit()
381 int offs = c->jheads[i].wbuf.offs; in ubifs_log_start_commit()
383 if (lnum == -1 || offs == c->leb_size) in ubifs_log_start_commit()
394 ubifs_prepare_node(c, ref, UBIFS_REF_NODE_SZ, 0); in ubifs_log_start_commit()
398 ubifs_pad(c, buf + len, ALIGN(len, c->min_io_size) - len); in ubifs_log_start_commit()
401 if (c->lhead_offs) { in ubifs_log_start_commit()
402 c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum); in ubifs_log_start_commit()
403 ubifs_assert(c->lhead_lnum != c->ltail_lnum); in ubifs_log_start_commit()
404 c->lhead_offs = 0; in ubifs_log_start_commit()
408 err = ubifs_leb_unmap(c, c->lhead_lnum); in ubifs_log_start_commit()
412 len = ALIGN(len, c->min_io_size); in ubifs_log_start_commit()
413 dbg_log("writing commit start at LEB %d:0, len %d", c->lhead_lnum, len); in ubifs_log_start_commit()
414 err = ubifs_leb_write(c, c->lhead_lnum, cs, 0, len); in ubifs_log_start_commit()
418 *ltail_lnum = c->lhead_lnum; in ubifs_log_start_commit()
420 c->lhead_offs += len; in ubifs_log_start_commit()
421 if (c->lhead_offs == c->leb_size) { in ubifs_log_start_commit()
422 c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum); in ubifs_log_start_commit()
423 c->lhead_offs = 0; in ubifs_log_start_commit()
426 remove_buds(c); in ubifs_log_start_commit()
432 c->min_log_bytes = 0; in ubifs_log_start_commit()
441 * @c: UBIFS file-system description object
449 int ubifs_log_end_commit(struct ubifs_info *c, int ltail_lnum) in ubifs_log_end_commit() argument
454 * At this phase we have to lock 'c->log_mutex' because UBIFS allows FS in ubifs_log_end_commit()
458 mutex_lock(&c->log_mutex); in ubifs_log_end_commit()
461 c->ltail_lnum, ltail_lnum); in ubifs_log_end_commit()
463 c->ltail_lnum = ltail_lnum; in ubifs_log_end_commit()
468 c->min_log_bytes = c->leb_size; in ubifs_log_end_commit()
470 spin_lock(&c->buds_lock); in ubifs_log_end_commit()
471 c->bud_bytes -= c->cmt_bud_bytes; in ubifs_log_end_commit()
472 spin_unlock(&c->buds_lock); in ubifs_log_end_commit()
474 err = dbg_check_bud_bytes(c); in ubifs_log_end_commit()
478 err = ubifs_write_master(c); in ubifs_log_end_commit()
481 mutex_unlock(&c->log_mutex); in ubifs_log_end_commit()
487 * @c: UBIFS file-system description object
498 int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum) in ubifs_log_post_commit() argument
502 while (!list_empty(&c->old_buds)) { in ubifs_log_post_commit()
505 bud = list_entry(c->old_buds.next, struct ubifs_bud, list); in ubifs_log_post_commit()
506 err = ubifs_return_leb(c, bud->lnum); in ubifs_log_post_commit()
512 mutex_lock(&c->log_mutex); in ubifs_log_post_commit()
513 for (lnum = old_ltail_lnum; lnum != c->ltail_lnum; in ubifs_log_post_commit()
514 lnum = ubifs_next_log_lnum(c, lnum)) { in ubifs_log_post_commit()
516 err = ubifs_leb_unmap(c, lnum); in ubifs_log_post_commit()
521 mutex_unlock(&c->log_mutex); in ubifs_log_post_commit()
585 * @c: UBIFS file-system description object
593 static int add_node(struct ubifs_info *c, void *buf, int *lnum, int *offs, in add_node() argument
597 int len = le32_to_cpu(ch->len), remains = c->leb_size - *offs; in add_node()
600 int sz = ALIGN(*offs, c->min_io_size), err; in add_node()
602 ubifs_pad(c, buf + *offs, sz - *offs); in add_node()
603 err = ubifs_leb_change(c, *lnum, buf, sz); in add_node()
606 *lnum = ubifs_next_log_lnum(c, *lnum); in add_node()
616 * @c: UBIFS file-system description object
624 int ubifs_consolidate_log(struct ubifs_info *c) in ubifs_consolidate_log() argument
632 dbg_rcvry("log tail LEB %d, log head LEB %d", c->ltail_lnum, in ubifs_consolidate_log()
633 c->lhead_lnum); in ubifs_consolidate_log()
634 buf = vmalloc(c->leb_size); in ubifs_consolidate_log()
637 lnum = c->ltail_lnum; in ubifs_consolidate_log()
640 sleb = ubifs_scan(c, lnum, 0, c->sbuf, 0); in ubifs_consolidate_log()
655 err = add_node(c, buf, &write_lnum, in ubifs_consolidate_log()
665 err = add_node(c, buf, &write_lnum, &offs, in ubifs_consolidate_log()
674 if (lnum == c->lhead_lnum) in ubifs_consolidate_log()
676 lnum = ubifs_next_log_lnum(c, lnum); in ubifs_consolidate_log()
679 int sz = ALIGN(offs, c->min_io_size); in ubifs_consolidate_log()
681 ubifs_pad(c, buf + offs, sz - offs); in ubifs_consolidate_log()
682 err = ubifs_leb_change(c, write_lnum, buf, sz); in ubifs_consolidate_log()
685 offs = ALIGN(offs, c->min_io_size); in ubifs_consolidate_log()
689 if (write_lnum == c->lhead_lnum) { in ubifs_consolidate_log()
690 ubifs_err(c, "log is too full"); in ubifs_consolidate_log()
696 lnum = ubifs_next_log_lnum(c, lnum); in ubifs_consolidate_log()
697 err = ubifs_leb_unmap(c, lnum); in ubifs_consolidate_log()
700 } while (lnum != c->lhead_lnum); in ubifs_consolidate_log()
701 c->lhead_lnum = write_lnum; in ubifs_consolidate_log()
702 c->lhead_offs = offs; in ubifs_consolidate_log()
703 dbg_rcvry("new log head at %d:%d", c->lhead_lnum, c->lhead_offs); in ubifs_consolidate_log()
716 * @c: UBIFS file-system description object
719 * ('c->bud_bytes' is correct). Returns zero in case of success and %-EINVAL in
722 static int dbg_check_bud_bytes(struct ubifs_info *c) in dbg_check_bud_bytes() argument
728 if (!dbg_is_chk_gen(c)) in dbg_check_bud_bytes()
731 spin_lock(&c->buds_lock); in dbg_check_bud_bytes()
732 for (i = 0; i < c->jhead_cnt; i++) in dbg_check_bud_bytes()
733 list_for_each_entry(bud, &c->jheads[i].buds_list, list) in dbg_check_bud_bytes()
734 bud_bytes += c->leb_size - bud->start; in dbg_check_bud_bytes()
736 if (c->bud_bytes != bud_bytes) { in dbg_check_bud_bytes()
737 ubifs_err(c, "bad bud_bytes %lld, calculated %lld", in dbg_check_bud_bytes()
738 c->bud_bytes, bud_bytes); in dbg_check_bud_bytes()
741 spin_unlock(&c->buds_lock); in dbg_check_bud_bytes()