Lines Matching refs:c

25 static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c,
28 static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
30 static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
32 static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *…
34 static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
37 static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
40 static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
44 static struct jffs2_eraseblock *jffs2_find_gc_block(struct jffs2_sb_info *c) in jffs2_find_gc_block() argument
55 if (!list_empty(&c->bad_used_list) && c->nr_free_blocks > c->resv_blocks_gcbad) { in jffs2_find_gc_block()
57 nextlist = &c->bad_used_list; in jffs2_find_gc_block()
58 } else if (n < 50 && !list_empty(&c->erasable_list)) { in jffs2_find_gc_block()
62 nextlist = &c->erasable_list; in jffs2_find_gc_block()
63 } else if (n < 110 && !list_empty(&c->very_dirty_list)) { in jffs2_find_gc_block()
66 nextlist = &c->very_dirty_list; in jffs2_find_gc_block()
67 } else if (n < 126 && !list_empty(&c->dirty_list)) { in jffs2_find_gc_block()
69 nextlist = &c->dirty_list; in jffs2_find_gc_block()
70 } else if (!list_empty(&c->clean_list)) { in jffs2_find_gc_block()
72 nextlist = &c->clean_list; in jffs2_find_gc_block()
73 } else if (!list_empty(&c->dirty_list)) { in jffs2_find_gc_block()
76 nextlist = &c->dirty_list; in jffs2_find_gc_block()
77 } else if (!list_empty(&c->very_dirty_list)) { in jffs2_find_gc_block()
79 nextlist = &c->very_dirty_list; in jffs2_find_gc_block()
80 } else if (!list_empty(&c->erasable_list)) { in jffs2_find_gc_block()
83 nextlist = &c->erasable_list; in jffs2_find_gc_block()
84 } else if (!list_empty(&c->erasable_pending_wbuf_list)) { in jffs2_find_gc_block()
87 spin_unlock(&c->erase_completion_lock); in jffs2_find_gc_block()
88 jffs2_flush_wbuf_pad(c); in jffs2_find_gc_block()
89 spin_lock(&c->erase_completion_lock); in jffs2_find_gc_block()
99 c->gcblock = ret; in jffs2_find_gc_block()
112 c->wasted_size -= ret->wasted_size; in jffs2_find_gc_block()
113 c->dirty_size += ret->wasted_size; in jffs2_find_gc_block()
124 int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) in jffs2_garbage_collect_pass() argument
134 if (mutex_lock_interruptible(&c->alloc_sem)) in jffs2_garbage_collect_pass()
138 spin_lock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
139 if (!c->unchecked_size) in jffs2_garbage_collect_pass()
146 if (c->checked_ino > c->highest_ino && xattr) { in jffs2_garbage_collect_pass()
148 c->unchecked_size); in jffs2_garbage_collect_pass()
149 jffs2_dbg_dump_block_lists_nolock(c); in jffs2_garbage_collect_pass()
150 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
151 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
155 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
158 xattr = jffs2_verify_xattr(c); in jffs2_garbage_collect_pass()
160 spin_lock(&c->inocache_lock); in jffs2_garbage_collect_pass()
162 ic = jffs2_get_ino_cache(c, c->checked_ino++); in jffs2_garbage_collect_pass()
165 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
172 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
173 jffs2_xattr_delete_inode(c, ic); in jffs2_garbage_collect_pass()
181 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
188 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
199 c->checked_ino--; in jffs2_garbage_collect_pass()
201 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
202 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); in jffs2_garbage_collect_pass()
212 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
217 ret = jffs2_do_crccheck_inode(c, ic); in jffs2_garbage_collect_pass()
222 jffs2_set_inocache_state(c, ic, INO_STATE_CHECKEDABSENT); in jffs2_garbage_collect_pass()
223 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
228 if (!list_empty(&c->erase_complete_list) || in jffs2_garbage_collect_pass()
229 !list_empty(&c->erase_pending_list)) { in jffs2_garbage_collect_pass()
230 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
231 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
233 if (jffs2_erase_pending_blocks(c, 1)) in jffs2_garbage_collect_pass()
237 mutex_lock(&c->alloc_sem); in jffs2_garbage_collect_pass()
238 spin_lock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
242 jeb = c->gcblock; in jffs2_garbage_collect_pass()
245 jeb = jffs2_find_gc_block(c); in jffs2_garbage_collect_pass()
249 if (c->nr_erasing_blocks) { in jffs2_garbage_collect_pass()
250 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
251 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
255 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
256 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
262 D1(if (c->nextblock) in jffs2_garbage_collect_pass()
263 … %08x, free_size %08x\n", c->nextblock->offset, c->nextblock->used_size, c->nextblock->dirty_size,… in jffs2_garbage_collect_pass()
266 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
283 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
284 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
295 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
298 jffs2_garbage_collect_pristine(c, NULL, raw); in jffs2_garbage_collect_pass()
301 jffs2_mark_node_obsolete(c, raw); in jffs2_garbage_collect_pass()
303 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
314 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
317 ret = jffs2_garbage_collect_xattr_datum(c, (struct jffs2_xattr_datum *)ic, raw); in jffs2_garbage_collect_pass()
319 ret = jffs2_garbage_collect_xattr_ref(c, (struct jffs2_xattr_ref *)ic, raw); in jffs2_garbage_collect_pass()
328 spin_lock(&c->inocache_lock); in jffs2_garbage_collect_pass()
330 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
373 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
374 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
384 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
387 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); in jffs2_garbage_collect_pass()
407 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
409 ret = jffs2_garbage_collect_pristine(c, ic, raw); in jffs2_garbage_collect_pass()
411 spin_lock(&c->inocache_lock); in jffs2_garbage_collect_pass()
413 wake_up(&c->inocache_wq); in jffs2_garbage_collect_pass()
416 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
432 spin_unlock(&c->inocache_lock); in jffs2_garbage_collect_pass()
434 f = jffs2_gc_fetch_inode(c, inum, !nlink); in jffs2_garbage_collect_pass()
444 ret = jffs2_garbage_collect_live(c, jeb, raw, f); in jffs2_garbage_collect_pass()
446 jffs2_gc_release_inode(c, f); in jffs2_garbage_collect_pass()
456 mutex_unlock(&c->alloc_sem); in jffs2_garbage_collect_pass()
460 spin_lock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
463 if (c->gcblock && !c->gcblock->used_size) { in jffs2_garbage_collect_pass()
465 c->gcblock->offset); in jffs2_garbage_collect_pass()
467 list_add_tail(&c->gcblock->list, &c->erase_pending_list); in jffs2_garbage_collect_pass()
468 c->gcblock = NULL; in jffs2_garbage_collect_pass()
469 c->nr_erasing_blocks++; in jffs2_garbage_collect_pass()
470 jffs2_garbage_collect_trigger(c); in jffs2_garbage_collect_pass()
472 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_pass()
477 static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_garbage_collect_live() argument
491 spin_lock(&c->erase_completion_lock); in jffs2_garbage_collect_live()
493 if (c->gcblock != jeb) { in jffs2_garbage_collect_live()
494 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_live()
499 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_live()
504 spin_unlock(&c->erase_completion_lock); in jffs2_garbage_collect_live()
509 ret = jffs2_garbage_collect_metadata(c, jeb, f, fn); in jffs2_garbage_collect_live()
526 ret = jffs2_garbage_collect_pristine(c, f->inocache, raw); in jffs2_garbage_collect_live()
537 ret = jffs2_garbage_collect_hole(c, jeb, f, fn, start, end); in jffs2_garbage_collect_live()
540 ret = jffs2_garbage_collect_dnode(c, jeb, f, fn, start, end); in jffs2_garbage_collect_live()
552 ret = jffs2_garbage_collect_dirent(c, jeb, f, fd); in jffs2_garbage_collect_live()
554 ret = jffs2_garbage_collect_deletion_dirent(c, jeb, f, fd); in jffs2_garbage_collect_live()
561 jffs2_dbg_dump_node(c, ref_offset(raw)); in jffs2_garbage_collect_live()
571 static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, in jffs2_garbage_collect_pristine() argument
585 alloclen = rawlen = ref_totlen(c, c->gcblock, raw); in jffs2_garbage_collect_pristine()
593 ret = jffs2_reserve_space_gc(c, alloclen, &alloclen, rawlen); in jffs2_garbage_collect_pristine()
608 ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)node); in jffs2_garbage_collect_pristine()
678 phys_ofs = write_ofs(c); in jffs2_garbage_collect_pristine()
680 ret = jffs2_flash_write(c, phys_ofs, rawlen, &retlen, (char *)node); in jffs2_garbage_collect_pristine()
686 jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, rawlen, NULL); in jffs2_garbage_collect_pristine()
694 struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size]; in jffs2_garbage_collect_pristine()
700 jffs2_dbg_acct_sanity_check(c,jeb); in jffs2_garbage_collect_pristine()
701 jffs2_dbg_acct_paranoia_check(c, jeb); in jffs2_garbage_collect_pristine()
703 ret = jffs2_reserve_space_gc(c, rawlen, &dummy, rawlen); in jffs2_garbage_collect_pristine()
711 jffs2_dbg_acct_sanity_check(c,jeb); in jffs2_garbage_collect_pristine()
712 jffs2_dbg_acct_paranoia_check(c, jeb); in jffs2_garbage_collect_pristine()
724 jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, rawlen, ic); in jffs2_garbage_collect_pristine()
726 jffs2_mark_node_obsolete(c, raw); in jffs2_garbage_collect_pristine()
738 static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_garbage_collect_metadata() argument
764 ret = jffs2_read_dnode(c, f, fn, mdata, 0, mdatalen); in jffs2_garbage_collect_metadata()
776 ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &alloclen, in jffs2_garbage_collect_metadata()
814 new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, ALLOC_GC); in jffs2_garbage_collect_metadata()
821 jffs2_mark_node_obsolete(c, fn->raw); in jffs2_garbage_collect_metadata()
830 static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_garbage_collect_dirent() argument
857 ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &alloclen, in jffs2_garbage_collect_dirent()
864 new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, ALLOC_GC); in jffs2_garbage_collect_dirent()
871 jffs2_add_fd_to_list(c, new_fd, &f->dents); in jffs2_garbage_collect_dirent()
875 static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *… in jffs2_garbage_collect_deletion_dirent() argument
886 if (!jffs2_can_mark_obsolete(c)) { in jffs2_garbage_collect_deletion_dirent()
893 uint32_t rawlen = ref_totlen(c, jeb, fd->raw); in jffs2_garbage_collect_deletion_dirent()
902 mutex_lock(&c->erase_free_sem); in jffs2_garbage_collect_deletion_dirent()
913 if (ref_totlen(c, NULL, raw) != rawlen) in jffs2_garbage_collect_deletion_dirent()
926 ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)rd); in jffs2_garbage_collect_deletion_dirent()
958 mutex_unlock(&c->erase_free_sem); in jffs2_garbage_collect_deletion_dirent()
965 return jffs2_garbage_collect_dirent(c, jeb, f, fd); in jffs2_garbage_collect_deletion_dirent()
968 mutex_unlock(&c->erase_free_sem); in jffs2_garbage_collect_deletion_dirent()
988 jffs2_mark_node_obsolete(c, fd->raw); in jffs2_garbage_collect_deletion_dirent()
993 static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_garbage_collect_hole() argument
1013 ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(ri), &readlen, (char *)&ri); in jffs2_garbage_collect_hole()
1081 ret = jffs2_reserve_space_gc(c, sizeof(ri), &alloclen, in jffs2_garbage_collect_hole()
1088 new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, ALLOC_GC); in jffs2_garbage_collect_hole()
1095 jffs2_add_full_dnode_to_inode(c, f, new_fn); in jffs2_garbage_collect_hole()
1097 jffs2_mark_node_obsolete(c, f->metadata->raw); in jffs2_garbage_collect_hole()
1138 jffs2_mark_node_obsolete(c, fn->raw); in jffs2_garbage_collect_hole()
1144 static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *orig_jeb, in jffs2_garbage_collect_dnode() argument
1164 if (c->nr_free_blocks + c->nr_erasing_blocks > c->resv_blocks_gcmerge) { in jffs2_garbage_collect_dnode()
1209 jeb = &c->blocks[raw->flash_offset / c->sector_size]; in jffs2_garbage_collect_dnode()
1211 if (jeb == c->gcblock) { in jffs2_garbage_collect_dnode()
1265 jeb = &c->blocks[raw->flash_offset / c->sector_size]; in jffs2_garbage_collect_dnode()
1267 if (jeb == c->gcblock) { in jffs2_garbage_collect_dnode()
1308 pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg); in jffs2_garbage_collect_dnode()
1323 ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, in jffs2_garbage_collect_dnode()
1336 comprtype = jffs2_compress(c, f, writebuf, &comprbuf, &datalen, &cdatalen); in jffs2_garbage_collect_dnode()
1360 new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, ALLOC_GC); in jffs2_garbage_collect_dnode()
1370 ret = jffs2_add_full_dnode_to_inode(c, f, new_fn); in jffs2_garbage_collect_dnode()
1373 jffs2_mark_node_obsolete(c, f->metadata->raw); in jffs2_garbage_collect_dnode()
1379 jffs2_gc_release_page(c, pg_ptr, &pg); in jffs2_garbage_collect_dnode()