Lines Matching refs:c
68 static int nothing_to_commit(struct ubifs_info *c) in nothing_to_commit() argument
74 if (c->mounting || c->remounting_rw) in nothing_to_commit()
81 if (c->zroot.znode && ubifs_zn_dirty(c->zroot.znode)) in nothing_to_commit()
91 if (c->nroot && test_bit(DIRTY_CNODE, &c->nroot->flags)) in nothing_to_commit()
94 ubifs_assert(atomic_long_read(&c->dirty_zn_cnt) == 0); in nothing_to_commit()
95 ubifs_assert(c->dirty_pn_cnt == 0); in nothing_to_commit()
96 ubifs_assert(c->dirty_nn_cnt == 0); in nothing_to_commit()
109 static int do_commit(struct ubifs_info *c) in do_commit() argument
116 ubifs_assert(!c->ro_media && !c->ro_mount); in do_commit()
118 if (c->ro_error) { in do_commit()
123 if (nothing_to_commit(c)) { in do_commit()
124 up_write(&c->commit_sem); in do_commit()
130 for (i = 0; i < c->jhead_cnt; i++) { in do_commit()
131 err = ubifs_wbuf_sync(&c->jheads[i].wbuf); in do_commit()
136 c->cmt_no += 1; in do_commit()
137 err = ubifs_gc_start_commit(c); in do_commit()
140 err = dbg_check_lprops(c); in do_commit()
143 err = ubifs_log_start_commit(c, &new_ltail_lnum); in do_commit()
146 err = ubifs_tnc_start_commit(c, &zroot); in do_commit()
149 err = ubifs_lpt_start_commit(c); in do_commit()
152 err = ubifs_orphan_start_commit(c); in do_commit()
156 ubifs_get_lp_stats(c, &lst); in do_commit()
158 up_write(&c->commit_sem); in do_commit()
160 err = ubifs_tnc_end_commit(c); in do_commit()
163 err = ubifs_lpt_end_commit(c); in do_commit()
166 err = ubifs_orphan_end_commit(c); in do_commit()
169 err = dbg_check_old_index(c, &zroot); in do_commit()
173 c->mst_node->cmt_no = cpu_to_le64(c->cmt_no); in do_commit()
174 c->mst_node->log_lnum = cpu_to_le32(new_ltail_lnum); in do_commit()
175 c->mst_node->root_lnum = cpu_to_le32(zroot.lnum); in do_commit()
176 c->mst_node->root_offs = cpu_to_le32(zroot.offs); in do_commit()
177 c->mst_node->root_len = cpu_to_le32(zroot.len); in do_commit()
178 c->mst_node->ihead_lnum = cpu_to_le32(c->ihead_lnum); in do_commit()
179 c->mst_node->ihead_offs = cpu_to_le32(c->ihead_offs); in do_commit()
180 c->mst_node->index_size = cpu_to_le64(c->bi.old_idx_sz); in do_commit()
181 c->mst_node->lpt_lnum = cpu_to_le32(c->lpt_lnum); in do_commit()
182 c->mst_node->lpt_offs = cpu_to_le32(c->lpt_offs); in do_commit()
183 c->mst_node->nhead_lnum = cpu_to_le32(c->nhead_lnum); in do_commit()
184 c->mst_node->nhead_offs = cpu_to_le32(c->nhead_offs); in do_commit()
185 c->mst_node->ltab_lnum = cpu_to_le32(c->ltab_lnum); in do_commit()
186 c->mst_node->ltab_offs = cpu_to_le32(c->ltab_offs); in do_commit()
187 c->mst_node->lsave_lnum = cpu_to_le32(c->lsave_lnum); in do_commit()
188 c->mst_node->lsave_offs = cpu_to_le32(c->lsave_offs); in do_commit()
189 c->mst_node->lscan_lnum = cpu_to_le32(c->lscan_lnum); in do_commit()
190 c->mst_node->empty_lebs = cpu_to_le32(lst.empty_lebs); in do_commit()
191 c->mst_node->idx_lebs = cpu_to_le32(lst.idx_lebs); in do_commit()
192 c->mst_node->total_free = cpu_to_le64(lst.total_free); in do_commit()
193 c->mst_node->total_dirty = cpu_to_le64(lst.total_dirty); in do_commit()
194 c->mst_node->total_used = cpu_to_le64(lst.total_used); in do_commit()
195 c->mst_node->total_dead = cpu_to_le64(lst.total_dead); in do_commit()
196 c->mst_node->total_dark = cpu_to_le64(lst.total_dark); in do_commit()
197 if (c->no_orphs) in do_commit()
198 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS); in do_commit()
200 c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_NO_ORPHS); in do_commit()
202 old_ltail_lnum = c->ltail_lnum; in do_commit()
203 err = ubifs_log_end_commit(c, new_ltail_lnum); in do_commit()
207 err = ubifs_log_post_commit(c, old_ltail_lnum); in do_commit()
210 err = ubifs_gc_end_commit(c); in do_commit()
213 err = ubifs_lpt_post_commit(c); in do_commit()
218 spin_lock(&c->cs_lock); in do_commit()
219 c->cmt_state = COMMIT_RESTING; in do_commit()
220 wake_up(&c->cmt_wq); in do_commit()
222 spin_unlock(&c->cs_lock); in do_commit()
226 up_write(&c->commit_sem); in do_commit()
228 ubifs_err(c, "commit failed, error %d", err); in do_commit()
229 spin_lock(&c->cs_lock); in do_commit()
230 c->cmt_state = COMMIT_BROKEN; in do_commit()
231 wake_up(&c->cmt_wq); in do_commit()
232 spin_unlock(&c->cs_lock); in do_commit()
233 ubifs_ro_mode(c, err); in do_commit()
244 static int run_bg_commit(struct ubifs_info *c) in run_bg_commit() argument
246 spin_lock(&c->cs_lock); in run_bg_commit()
251 if (c->cmt_state != COMMIT_BACKGROUND && in run_bg_commit()
252 c->cmt_state != COMMIT_REQUIRED) in run_bg_commit()
254 spin_unlock(&c->cs_lock); in run_bg_commit()
256 down_write(&c->commit_sem); in run_bg_commit()
257 spin_lock(&c->cs_lock); in run_bg_commit()
258 if (c->cmt_state == COMMIT_REQUIRED) in run_bg_commit()
259 c->cmt_state = COMMIT_RUNNING_REQUIRED; in run_bg_commit()
260 else if (c->cmt_state == COMMIT_BACKGROUND) in run_bg_commit()
261 c->cmt_state = COMMIT_RUNNING_BACKGROUND; in run_bg_commit()
264 spin_unlock(&c->cs_lock); in run_bg_commit()
266 return do_commit(c); in run_bg_commit()
269 up_write(&c->commit_sem); in run_bg_commit()
271 spin_unlock(&c->cs_lock); in run_bg_commit()
290 struct ubifs_info *c = info; in ubifs_bg_thread() local
292 ubifs_msg(c, "background thread \"%s\" started, PID %d", in ubifs_bg_thread()
293 c->bgt_name, current->pid); in ubifs_bg_thread()
305 if (!c->need_bgt) { in ubifs_bg_thread()
318 c->need_bgt = 0; in ubifs_bg_thread()
319 err = ubifs_bg_wbufs_sync(c); in ubifs_bg_thread()
321 ubifs_ro_mode(c, err); in ubifs_bg_thread()
323 run_bg_commit(c); in ubifs_bg_thread()
327 ubifs_msg(c, "background thread \"%s\" stops", c->bgt_name); in ubifs_bg_thread()
338 void ubifs_commit_required(struct ubifs_info *c) in ubifs_commit_required() argument
340 spin_lock(&c->cs_lock); in ubifs_commit_required()
341 switch (c->cmt_state) { in ubifs_commit_required()
344 dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state), in ubifs_commit_required()
346 c->cmt_state = COMMIT_REQUIRED; in ubifs_commit_required()
349 dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state), in ubifs_commit_required()
351 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_commit_required()
358 spin_unlock(&c->cs_lock); in ubifs_commit_required()
368 void ubifs_request_bg_commit(struct ubifs_info *c) in ubifs_request_bg_commit() argument
370 spin_lock(&c->cs_lock); in ubifs_request_bg_commit()
371 if (c->cmt_state == COMMIT_RESTING) { in ubifs_request_bg_commit()
372 dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state), in ubifs_request_bg_commit()
374 c->cmt_state = COMMIT_BACKGROUND; in ubifs_request_bg_commit()
375 spin_unlock(&c->cs_lock); in ubifs_request_bg_commit()
376 ubifs_wake_up_bgt(c); in ubifs_request_bg_commit()
378 spin_unlock(&c->cs_lock); in ubifs_request_bg_commit()
387 static int wait_for_commit(struct ubifs_info *c) in wait_for_commit() argument
398 wait_event(c->cmt_wq, c->cmt_state != COMMIT_RUNNING_BACKGROUND && in wait_for_commit()
399 c->cmt_state != COMMIT_RUNNING_REQUIRED); in wait_for_commit()
411 int ubifs_run_commit(struct ubifs_info *c) in ubifs_run_commit() argument
415 spin_lock(&c->cs_lock); in ubifs_run_commit()
416 if (c->cmt_state == COMMIT_BROKEN) { in ubifs_run_commit()
421 if (c->cmt_state == COMMIT_RUNNING_BACKGROUND) in ubifs_run_commit()
426 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_run_commit()
428 if (c->cmt_state == COMMIT_RUNNING_REQUIRED) { in ubifs_run_commit()
429 spin_unlock(&c->cs_lock); in ubifs_run_commit()
430 return wait_for_commit(c); in ubifs_run_commit()
432 spin_unlock(&c->cs_lock); in ubifs_run_commit()
436 down_write(&c->commit_sem); in ubifs_run_commit()
437 spin_lock(&c->cs_lock); in ubifs_run_commit()
442 if (c->cmt_state == COMMIT_BROKEN) { in ubifs_run_commit()
447 if (c->cmt_state == COMMIT_RUNNING_BACKGROUND) in ubifs_run_commit()
448 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_run_commit()
450 if (c->cmt_state == COMMIT_RUNNING_REQUIRED) { in ubifs_run_commit()
451 up_write(&c->commit_sem); in ubifs_run_commit()
452 spin_unlock(&c->cs_lock); in ubifs_run_commit()
453 return wait_for_commit(c); in ubifs_run_commit()
455 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_run_commit()
456 spin_unlock(&c->cs_lock); in ubifs_run_commit()
458 err = do_commit(c); in ubifs_run_commit()
462 up_write(&c->commit_sem); in ubifs_run_commit()
464 spin_unlock(&c->cs_lock); in ubifs_run_commit()
479 int ubifs_gc_should_commit(struct ubifs_info *c) in ubifs_gc_should_commit() argument
483 spin_lock(&c->cs_lock); in ubifs_gc_should_commit()
484 if (c->cmt_state == COMMIT_BACKGROUND) { in ubifs_gc_should_commit()
486 c->cmt_state = COMMIT_REQUIRED; in ubifs_gc_should_commit()
489 if (c->cmt_state == COMMIT_REQUIRED) in ubifs_gc_should_commit()
491 spin_unlock(&c->cs_lock); in ubifs_gc_should_commit()
526 int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot) in dbg_old_index_check_init() argument
530 struct ubifs_debug_info *d = c->dbg; in dbg_old_index_check_init()
537 idx = kmalloc(c->max_idx_node_sz, GFP_NOFS); in dbg_old_index_check_init()
541 err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs); in dbg_old_index_check_init()
565 int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot) in dbg_check_old_index() argument
569 struct ubifs_debug_info *d = c->dbg; in dbg_check_old_index()
577 if (!dbg_is_chk_index(c)) in dbg_check_old_index()
582 sz = sizeof(struct idx_node) + ubifs_idx_node_sz(c, c->fanout) - in dbg_check_old_index()
609 err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs); in dbg_check_old_index()
614 if (child_cnt < 1 || child_cnt > c->fanout) { in dbg_check_old_index()
632 key_read(c, ubifs_idx_key(c, idx), &lower_key); in dbg_check_old_index()
633 highest_ino_key(c, &upper_key, INUM_WATERMARK); in dbg_check_old_index()
635 key_copy(c, &upper_key, &i->upper_key); in dbg_check_old_index()
649 key_read(c, ubifs_idx_key(c, idx), &l_key); in dbg_check_old_index()
650 br = ubifs_idx_branch(c, idx, child_cnt - 1); in dbg_check_old_index()
651 key_read(c, &br->key, &u_key); in dbg_check_old_index()
652 if (keys_cmp(c, &lower_key, &l_key) > 0) { in dbg_check_old_index()
656 if (keys_cmp(c, &upper_key, &u_key) < 0) { in dbg_check_old_index()
660 if (keys_cmp(c, &upper_key, &u_key) == 0) in dbg_check_old_index()
661 if (!is_hash_key(c, &u_key)) { in dbg_check_old_index()
696 br = ubifs_idx_branch(c, idx, iip); in dbg_check_old_index()
700 key_read(c, &br->key, &lower_key); in dbg_check_old_index()
702 br = ubifs_idx_branch(c, idx, iip + 1); in dbg_check_old_index()
703 key_read(c, &br->key, &upper_key); in dbg_check_old_index()
705 key_copy(c, &i->upper_key, &upper_key); in dbg_check_old_index()
708 err = dbg_old_index_check_init(c, zroot); in dbg_check_old_index()
715 ubifs_err(c, "dumping index node (iip=%d)", i->iip); in dbg_check_old_index()
716 ubifs_dump_node(c, idx); in dbg_check_old_index()
721 ubifs_err(c, "dumping parent index node"); in dbg_check_old_index()
722 ubifs_dump_node(c, &i->idx); in dbg_check_old_index()
730 ubifs_err(c, "failed, error %d", err); in dbg_check_old_index()