Lines Matching full:c

5  * Copyright (C) 2006-2008 Nokia Corporation.
41 * @c: UBIFS file-system description object
50 * This function has to be called with @c->commit_sem locked for writing -
51 * this function does not take LPT/TNC locks because the @c->commit_sem
56 static int nothing_to_commit(struct ubifs_info *c) in nothing_to_commit() argument
62 if (c->mounting || c->remounting_rw) in nothing_to_commit()
69 if (c->zroot.znode && ubifs_zn_dirty(c->zroot.znode)) in nothing_to_commit()
73 * Increasing @c->dirty_pn_cnt/@c->dirty_nn_cnt and marking in nothing_to_commit()
75 * checking, which leads inconsistent states between @c->nroot in nothing_to_commit()
76 * and @c->dirty_pn_cnt/@c->dirty_nn_cnt, holding @c->lp_mutex in nothing_to_commit()
79 mutex_lock(&c->lp_mutex); in nothing_to_commit()
87 if (c->nroot && test_bit(DIRTY_CNODE, &c->nroot->flags)) { in nothing_to_commit()
88 mutex_unlock(&c->lp_mutex); in nothing_to_commit()
92 ubifs_assert(c, atomic_long_read(&c->dirty_zn_cnt) == 0); in nothing_to_commit()
93 ubifs_assert(c, c->dirty_pn_cnt == 0); in nothing_to_commit()
94 ubifs_assert(c, c->dirty_nn_cnt == 0); in nothing_to_commit()
95 mutex_unlock(&c->lp_mutex); in nothing_to_commit()
102 * @c: UBIFS file-system description object
108 static int do_commit(struct ubifs_info *c) in do_commit() argument
115 ubifs_assert(c, !c->ro_media && !c->ro_mount); in do_commit()
117 if (c->ro_error) { in do_commit()
122 if (nothing_to_commit(c)) { in do_commit()
123 up_write(&c->commit_sem); in do_commit()
129 for (i = 0; i < c->jhead_cnt; i++) { in do_commit()
130 err = ubifs_wbuf_sync(&c->jheads[i].wbuf); in do_commit()
135 c->cmt_no += 1; in do_commit()
136 err = ubifs_gc_start_commit(c); in do_commit()
139 err = dbg_check_lprops(c); in do_commit()
142 err = ubifs_log_start_commit(c, &new_ltail_lnum); in do_commit()
145 err = ubifs_tnc_start_commit(c, &zroot); in do_commit()
148 err = ubifs_lpt_start_commit(c); in do_commit()
151 err = ubifs_orphan_start_commit(c); in do_commit()
155 ubifs_get_lp_stats(c, &lst); in do_commit()
157 up_write(&c->commit_sem); in do_commit()
159 err = ubifs_tnc_end_commit(c); in do_commit()
162 err = ubifs_lpt_end_commit(c); in do_commit()
165 err = ubifs_orphan_end_commit(c); in do_commit()
168 err = dbg_check_old_index(c, &zroot); in do_commit()
172 c->mst_node->cmt_no = cpu_to_le64(c->cmt_no); in do_commit()
173 c->mst_node->log_lnum = cpu_to_le32(new_ltail_lnum); in do_commit()
174 c->mst_node->root_lnum = cpu_to_le32(zroot.lnum); in do_commit()
175 c->mst_node->root_offs = cpu_to_le32(zroot.offs); in do_commit()
176 c->mst_node->root_len = cpu_to_le32(zroot.len); in do_commit()
177 c->mst_node->ihead_lnum = cpu_to_le32(c->ihead_lnum); in do_commit()
178 c->mst_node->ihead_offs = cpu_to_le32(c->ihead_offs); in do_commit()
179 c->mst_node->index_size = cpu_to_le64(c->bi.old_idx_sz); in do_commit()
180 c->mst_node->lpt_lnum = cpu_to_le32(c->lpt_lnum); in do_commit()
181 c->mst_node->lpt_offs = cpu_to_le32(c->lpt_offs); in do_commit()
182 c->mst_node->nhead_lnum = cpu_to_le32(c->nhead_lnum); in do_commit()
183 c->mst_node->nhead_offs = cpu_to_le32(c->nhead_offs); in do_commit()
184 c->mst_node->ltab_lnum = cpu_to_le32(c->ltab_lnum); in do_commit()
185 c->mst_node->ltab_offs = cpu_to_le32(c->ltab_offs); in do_commit()
186 c->mst_node->lsave_lnum = cpu_to_le32(c->lsave_lnum); in do_commit()
187 c->mst_node->lsave_offs = cpu_to_le32(c->lsave_offs); in do_commit()
188 c->mst_node->lscan_lnum = cpu_to_le32(c->lscan_lnum); in do_commit()
189 c->mst_node->empty_lebs = cpu_to_le32(lst.empty_lebs); in do_commit()
190 c->mst_node->idx_lebs = cpu_to_le32(lst.idx_lebs); in do_commit()
191 c->mst_node->total_free = cpu_to_le64(lst.total_free); in do_commit()
192 c->mst_node->total_dirty = cpu_to_le64(lst.total_dirty); in do_commit()
193 c->mst_node->total_used = cpu_to_le64(lst.total_used); in do_commit()
194 c->mst_node->total_dead = cpu_to_le64(lst.total_dead); in do_commit()
195 c->mst_node->total_dark = cpu_to_le64(lst.total_dark); in do_commit()
196 if (c->no_orphs) in do_commit()
197 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS); in do_commit()
199 c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_NO_ORPHS); in do_commit()
201 old_ltail_lnum = c->ltail_lnum; in do_commit()
202 err = ubifs_log_end_commit(c, new_ltail_lnum); in do_commit()
206 err = ubifs_log_post_commit(c, old_ltail_lnum); in do_commit()
209 err = ubifs_gc_end_commit(c); in do_commit()
212 err = ubifs_lpt_post_commit(c); in do_commit()
217 spin_lock(&c->cs_lock); in do_commit()
218 c->cmt_state = COMMIT_RESTING; in do_commit()
219 wake_up(&c->cmt_wq); in do_commit()
221 spin_unlock(&c->cs_lock); in do_commit()
225 up_write(&c->commit_sem); in do_commit()
227 ubifs_err(c, "commit failed, error %d", err); in do_commit()
228 spin_lock(&c->cs_lock); in do_commit()
229 c->cmt_state = COMMIT_BROKEN; in do_commit()
230 wake_up(&c->cmt_wq); in do_commit()
231 spin_unlock(&c->cs_lock); in do_commit()
232 ubifs_ro_mode(c, err); in do_commit()
238 * @c: UBIFS file-system description object
243 static int run_bg_commit(struct ubifs_info *c) in run_bg_commit() argument
245 spin_lock(&c->cs_lock); in run_bg_commit()
250 if (c->cmt_state != COMMIT_BACKGROUND && in run_bg_commit()
251 c->cmt_state != COMMIT_REQUIRED) in run_bg_commit()
253 spin_unlock(&c->cs_lock); in run_bg_commit()
255 down_write(&c->commit_sem); in run_bg_commit()
256 spin_lock(&c->cs_lock); in run_bg_commit()
257 if (c->cmt_state == COMMIT_REQUIRED) in run_bg_commit()
258 c->cmt_state = COMMIT_RUNNING_REQUIRED; in run_bg_commit()
259 else if (c->cmt_state == COMMIT_BACKGROUND) in run_bg_commit()
260 c->cmt_state = COMMIT_RUNNING_BACKGROUND; in run_bg_commit()
263 spin_unlock(&c->cs_lock); in run_bg_commit()
265 return do_commit(c); in run_bg_commit()
268 up_write(&c->commit_sem); in run_bg_commit()
270 spin_unlock(&c->cs_lock); in run_bg_commit()
289 struct ubifs_info *c = info; in ubifs_bg_thread() local
291 ubifs_msg(c, "background thread \"%s\" started, PID %d", in ubifs_bg_thread()
292 c->bgt_name, current->pid); in ubifs_bg_thread()
304 if (!c->need_bgt) { in ubifs_bg_thread()
317 c->need_bgt = 0; in ubifs_bg_thread()
318 err = ubifs_bg_wbufs_sync(c); in ubifs_bg_thread()
320 ubifs_ro_mode(c, err); in ubifs_bg_thread()
322 run_bg_commit(c); in ubifs_bg_thread()
326 ubifs_msg(c, "background thread \"%s\" stops", c->bgt_name); in ubifs_bg_thread()
332 * @c: UBIFS file-system description object
337 void ubifs_commit_required(struct ubifs_info *c) in ubifs_commit_required() argument
339 spin_lock(&c->cs_lock); in ubifs_commit_required()
340 switch (c->cmt_state) { in ubifs_commit_required()
343 dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state), in ubifs_commit_required()
345 c->cmt_state = COMMIT_REQUIRED; in ubifs_commit_required()
348 dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state), in ubifs_commit_required()
350 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_commit_required()
357 spin_unlock(&c->cs_lock); in ubifs_commit_required()
362 * @c: UBIFS file-system description object
367 void ubifs_request_bg_commit(struct ubifs_info *c) in ubifs_request_bg_commit() argument
369 spin_lock(&c->cs_lock); in ubifs_request_bg_commit()
370 if (c->cmt_state == COMMIT_RESTING) { in ubifs_request_bg_commit()
371 dbg_cmt("old: %s, new: %s", dbg_cstate(c->cmt_state), in ubifs_request_bg_commit()
373 c->cmt_state = COMMIT_BACKGROUND; in ubifs_request_bg_commit()
374 spin_unlock(&c->cs_lock); in ubifs_request_bg_commit()
375 ubifs_wake_up_bgt(c); in ubifs_request_bg_commit()
377 spin_unlock(&c->cs_lock); in ubifs_request_bg_commit()
382 * @c: UBIFS file-system description object
386 static int wait_for_commit(struct ubifs_info *c) in wait_for_commit() argument
397 wait_event(c->cmt_wq, c->cmt_state != COMMIT_RUNNING_BACKGROUND && in wait_for_commit()
398 c->cmt_state != COMMIT_RUNNING_REQUIRED); in wait_for_commit()
405 * @c: UBIFS file-system description object
410 int ubifs_run_commit(struct ubifs_info *c) in ubifs_run_commit() argument
414 spin_lock(&c->cs_lock); in ubifs_run_commit()
415 if (c->cmt_state == COMMIT_BROKEN) { in ubifs_run_commit()
420 if (c->cmt_state == COMMIT_RUNNING_BACKGROUND) in ubifs_run_commit()
425 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_run_commit()
427 if (c->cmt_state == COMMIT_RUNNING_REQUIRED) { in ubifs_run_commit()
428 spin_unlock(&c->cs_lock); in ubifs_run_commit()
429 return wait_for_commit(c); in ubifs_run_commit()
431 spin_unlock(&c->cs_lock); in ubifs_run_commit()
435 down_write(&c->commit_sem); in ubifs_run_commit()
436 spin_lock(&c->cs_lock); in ubifs_run_commit()
438 * Since we unlocked 'c->cs_lock', the state may have changed, so in ubifs_run_commit()
441 if (c->cmt_state == COMMIT_BROKEN) { in ubifs_run_commit()
446 if (c->cmt_state == COMMIT_RUNNING_BACKGROUND) in ubifs_run_commit()
447 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_run_commit()
449 if (c->cmt_state == COMMIT_RUNNING_REQUIRED) { in ubifs_run_commit()
450 up_write(&c->commit_sem); in ubifs_run_commit()
451 spin_unlock(&c->cs_lock); in ubifs_run_commit()
452 return wait_for_commit(c); in ubifs_run_commit()
454 c->cmt_state = COMMIT_RUNNING_REQUIRED; in ubifs_run_commit()
455 spin_unlock(&c->cs_lock); in ubifs_run_commit()
457 err = do_commit(c); in ubifs_run_commit()
461 up_write(&c->commit_sem); in ubifs_run_commit()
463 spin_unlock(&c->cs_lock); in ubifs_run_commit()
469 * @c: UBIFS file-system description object
478 int ubifs_gc_should_commit(struct ubifs_info *c) in ubifs_gc_should_commit() argument
482 spin_lock(&c->cs_lock); in ubifs_gc_should_commit()
483 if (c->cmt_state == COMMIT_BACKGROUND) { in ubifs_gc_should_commit()
485 c->cmt_state = COMMIT_REQUIRED; in ubifs_gc_should_commit()
488 if (c->cmt_state == COMMIT_REQUIRED) in ubifs_gc_should_commit()
490 spin_unlock(&c->cs_lock); in ubifs_gc_should_commit()
517 * @c: UBIFS file-system description object
525 int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot) in dbg_old_index_check_init() argument
529 struct ubifs_debug_info *d = c->dbg; in dbg_old_index_check_init()
536 idx = kmalloc(c->max_idx_node_sz, GFP_NOFS); in dbg_old_index_check_init()
540 err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs); in dbg_old_index_check_init()
553 * @c: UBIFS file-system description object
564 int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot) in dbg_check_old_index() argument
568 struct ubifs_debug_info *d = c->dbg; in dbg_check_old_index()
576 if (!dbg_is_chk_index(c)) in dbg_check_old_index()
581 sz = sizeof(struct idx_node) + ubifs_idx_node_sz(c, c->fanout) - in dbg_check_old_index()
608 err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs); in dbg_check_old_index()
613 if (child_cnt < 1 || child_cnt > c->fanout) { in dbg_check_old_index()
631 key_read(c, ubifs_idx_key(c, idx), &lower_key); in dbg_check_old_index()
632 highest_ino_key(c, &upper_key, INUM_WATERMARK); in dbg_check_old_index()
634 key_copy(c, &upper_key, &i->upper_key); in dbg_check_old_index()
648 key_read(c, ubifs_idx_key(c, idx), &l_key); in dbg_check_old_index()
649 br = ubifs_idx_branch(c, idx, child_cnt - 1); in dbg_check_old_index()
650 key_read(c, &br->key, &u_key); in dbg_check_old_index()
651 if (keys_cmp(c, &lower_key, &l_key) > 0) { in dbg_check_old_index()
655 if (keys_cmp(c, &upper_key, &u_key) < 0) { in dbg_check_old_index()
659 if (keys_cmp(c, &upper_key, &u_key) == 0) in dbg_check_old_index()
660 if (!is_hash_key(c, &u_key)) { in dbg_check_old_index()
695 br = ubifs_idx_branch(c, idx, iip); in dbg_check_old_index()
699 key_read(c, &br->key, &lower_key); in dbg_check_old_index()
701 br = ubifs_idx_branch(c, idx, iip + 1); in dbg_check_old_index()
702 key_read(c, &br->key, &upper_key); in dbg_check_old_index()
704 key_copy(c, &i->upper_key, &upper_key); in dbg_check_old_index()
707 err = dbg_old_index_check_init(c, zroot); in dbg_check_old_index()
714 ubifs_err(c, "dumping index node (iip=%d)", i->iip); in dbg_check_old_index()
715 ubifs_dump_node(c, idx, ubifs_idx_node_sz(c, c->fanout)); in dbg_check_old_index()
720 ubifs_err(c, "dumping parent index node"); in dbg_check_old_index()
721 ubifs_dump_node(c, &i->idx, ubifs_idx_node_sz(c, c->fanout)); in dbg_check_old_index()
729 ubifs_err(c, "failed, error %d", err); in dbg_check_old_index()