Lines Matching refs:c
39 static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
46 static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
48 static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
51 static inline int min_free(struct jffs2_sb_info *c) in min_free() argument
55 if (!jffs2_can_mark_obsolete(c) && min < c->wbuf_pagesize) in min_free()
56 return c->wbuf_pagesize; in min_free()
69 static int file_dirty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) in file_dirty() argument
73 if ((ret = jffs2_prealloc_raw_node_refs(c, jeb, 1))) in file_dirty()
75 if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size))) in file_dirty()
80 c->dirty_size += jeb->wasted_size; in file_dirty()
81 c->wasted_size -= jeb->wasted_size; in file_dirty()
83 if (VERYDIRTY(c, jeb->dirty_size)) { in file_dirty()
84 list_add(&jeb->list, &c->very_dirty_list); in file_dirty()
86 list_add(&jeb->list, &c->dirty_list); in file_dirty()
91 int jffs2_scan_medium(struct jffs2_sb_info *c) in jffs2_scan_medium() argument
101 ret = mtd_point(c->mtd, 0, c->mtd->size, &pointlen, in jffs2_scan_medium()
103 if (!ret && pointlen < c->mtd->size) { in jffs2_scan_medium()
107 mtd_unpoint(c->mtd, 0, pointlen); in jffs2_scan_medium()
116 if (jffs2_cleanmarker_oob(c)) in jffs2_scan_medium()
117 try_size = c->sector_size; in jffs2_scan_medium()
124 flashbuf = mtd_kmalloc_up_to(c->mtd, &try_size); in jffs2_scan_medium()
143 for (i=0; i<c->nr_blocks; i++) { in jffs2_scan_medium()
144 struct jffs2_eraseblock *jeb = &c->blocks[i]; in jffs2_scan_medium()
151 ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), in jffs2_scan_medium()
157 jffs2_dbg_acct_paranoia_check_nolock(c, jeb); in jffs2_scan_medium()
170 list_add(&jeb->list, &c->erase_pending_list); in jffs2_scan_medium()
171 c->nr_erasing_blocks++; in jffs2_scan_medium()
178 list_add(&jeb->list, &c->free_list); in jffs2_scan_medium()
179 c->nr_free_blocks++; in jffs2_scan_medium()
184 list_add(&jeb->list, &c->erase_pending_list); in jffs2_scan_medium()
185 c->nr_erasing_blocks++; in jffs2_scan_medium()
191 list_add(&jeb->list, &c->clean_list); in jffs2_scan_medium()
198 if (jeb->free_size > min_free(c) && in jffs2_scan_medium()
199 (!c->nextblock || c->nextblock->free_size < jeb->free_size)) { in jffs2_scan_medium()
201 if (c->nextblock) { in jffs2_scan_medium()
202 ret = file_dirty(c, c->nextblock); in jffs2_scan_medium()
206 jffs2_sum_reset_collected(c->summary); in jffs2_scan_medium()
209 jffs2_sum_move_collected(c, s); in jffs2_scan_medium()
212 c->nextblock = jeb; in jffs2_scan_medium()
214 ret = file_dirty(c, jeb); in jffs2_scan_medium()
225 list_add(&jeb->list, &c->erase_pending_list); in jffs2_scan_medium()
226 c->nr_erasing_blocks++; in jffs2_scan_medium()
231 list_add(&jeb->list, &c->bad_list); in jffs2_scan_medium()
232 c->bad_size += c->sector_size; in jffs2_scan_medium()
233 c->free_size -= c->sector_size; in jffs2_scan_medium()
243 if (c->nextblock && (c->nextblock->dirty_size)) { in jffs2_scan_medium()
244 c->nextblock->wasted_size += c->nextblock->dirty_size; in jffs2_scan_medium()
245 c->wasted_size += c->nextblock->dirty_size; in jffs2_scan_medium()
246 c->dirty_size -= c->nextblock->dirty_size; in jffs2_scan_medium()
247 c->nextblock->dirty_size = 0; in jffs2_scan_medium()
250 …if (!jffs2_can_mark_obsolete(c) && c->wbuf_pagesize && c->nextblock && (c->nextblock->free_size % … in jffs2_scan_medium()
255 uint32_t skip = c->nextblock->free_size % c->wbuf_pagesize; in jffs2_scan_medium()
259 jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); in jffs2_scan_medium()
260 jffs2_scan_dirty_space(c, c->nextblock, skip); in jffs2_scan_medium()
263 if (c->nr_erasing_blocks) { in jffs2_scan_medium()
264 …if ( !c->used_size && ((c->nr_free_blocks+empty_blocks+bad_blocks)!= c->nr_blocks || bad_blocks ==… in jffs2_scan_medium()
267 empty_blocks, bad_blocks, c->nr_blocks); in jffs2_scan_medium()
271 spin_lock(&c->erase_completion_lock); in jffs2_scan_medium()
272 jffs2_garbage_collect_trigger(c); in jffs2_scan_medium()
273 spin_unlock(&c->erase_completion_lock); in jffs2_scan_medium()
281 mtd_unpoint(c->mtd, 0, c->mtd->size); in jffs2_scan_medium()
287 static int jffs2_fill_scan_buf(struct jffs2_sb_info *c, void *buf, in jffs2_fill_scan_buf() argument
293 ret = jffs2_flash_read(c, ofs, len, &retlen, buf); in jffs2_fill_scan_buf()
307 int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) in jffs2_scan_classify_jeb() argument
309 if ((jeb->used_size + jeb->unchecked_size) == PAD(c->cleanmarker_size) && !jeb->dirty_size in jffs2_scan_classify_jeb()
314 else if (!ISDIRTY(c->sector_size - (jeb->used_size + jeb->unchecked_size))) { in jffs2_scan_classify_jeb()
315 c->dirty_size -= jeb->dirty_size; in jffs2_scan_classify_jeb()
316 c->wasted_size += jeb->dirty_size; in jffs2_scan_classify_jeb()
327 static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_xattr_node() argument
339 if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen)))) in jffs2_scan_xattr_node()
352 if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen)))) in jffs2_scan_xattr_node()
357 xd = jffs2_setup_xattr_datum(c, xid, version); in jffs2_scan_xattr_node()
363 = jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, NULL); in jffs2_scan_xattr_node()
373 jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, (void *)xd); in jffs2_scan_xattr_node()
383 static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_xref_node() argument
395 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rr->totlen))))) in jffs2_scan_xref_node()
404 if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rr->totlen)))) in jffs2_scan_xref_node()
425 if (ref->xseqno > c->highest_xseqno) in jffs2_scan_xref_node()
426 c->highest_xseqno = (ref->xseqno & ~XREF_DELETE_MARKER); in jffs2_scan_xref_node()
427 ref->next = c->xref_temp; in jffs2_scan_xref_node()
428 c->xref_temp = ref; in jffs2_scan_xref_node()
430 jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(rr->totlen)), (void *)ref); in jffs2_scan_xref_node()
442 static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_eraseblock() argument
462 if (jffs2_cleanmarker_oob(c)) { in jffs2_scan_eraseblock()
465 if (mtd_block_isbad(c->mtd, jeb->offset)) in jffs2_scan_eraseblock()
468 ret = jffs2_check_nand_cleanmarker(c, jeb); in jffs2_scan_eraseblock()
489 sm = (void *)buf + c->sector_size - sizeof(*sm); in jffs2_scan_eraseblock()
492 sumlen = c->sector_size - je32_to_cpu(sm->offset); in jffs2_scan_eraseblock()
496 if (c->wbuf_pagesize) in jffs2_scan_eraseblock()
497 buf_len = c->wbuf_pagesize; in jffs2_scan_eraseblock()
502 err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len, in jffs2_scan_eraseblock()
503 jeb->offset + c->sector_size - buf_len, in jffs2_scan_eraseblock()
510 sumlen = c->sector_size - je32_to_cpu(sm->offset); in jffs2_scan_eraseblock()
514 if (sumlen > c->sector_size) in jffs2_scan_eraseblock()
527 err = jffs2_fill_scan_buf(c, sumptr, in jffs2_scan_eraseblock()
528 jeb->offset + c->sector_size - sumlen, in jffs2_scan_eraseblock()
538 err = jffs2_sum_scan_sumnode(c, jeb, sumptr, sumlen, &pseudo_random); in jffs2_scan_eraseblock()
556 buf_len = c->sector_size; in jffs2_scan_eraseblock()
558 buf_len = EMPTY_SCAN_SIZE(c->sector_size); in jffs2_scan_eraseblock()
559 err = jffs2_fill_scan_buf(c, buf, buf_ofs, buf_len); in jffs2_scan_eraseblock()
566 max_ofs = EMPTY_SCAN_SIZE(c->sector_size); in jffs2_scan_eraseblock()
573 if (jffs2_cleanmarker_oob(c)) { in jffs2_scan_eraseblock()
575 int ret = jffs2_check_oob_empty(c, jeb, cleanmarkerfound); in jffs2_scan_eraseblock()
587 if (c->cleanmarker_size == 0) in jffs2_scan_eraseblock()
595 if ((err = jffs2_prealloc_raw_node_refs(c, jeb, 1))) in jffs2_scan_eraseblock()
597 if ((err = jffs2_scan_dirty_space(c, jeb, ofs))) in jffs2_scan_eraseblock()
609 while(ofs < jeb->offset + c->sector_size) { in jffs2_scan_eraseblock()
611 jffs2_dbg_acct_paranoia_check_nolock(c, jeb); in jffs2_scan_eraseblock()
614 err = jffs2_prealloc_raw_node_refs(c, jeb, 2); in jffs2_scan_eraseblock()
628 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
635 if (jeb->offset + c->sector_size < ofs + sizeof(*node)) { in jffs2_scan_eraseblock()
638 jeb->offset, c->sector_size, ofs, in jffs2_scan_eraseblock()
640 if ((err = jffs2_scan_dirty_space(c, jeb, (jeb->offset + c->sector_size)-ofs))) in jffs2_scan_eraseblock()
646 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
650 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
664 scan_end = min_t(uint32_t, EMPTY_SCAN_SIZE(c->sector_size)/8, buf_len); in jffs2_scan_eraseblock()
673 if ((err = jffs2_scan_dirty_space(c, jeb, ofs-empty_start))) in jffs2_scan_eraseblock()
687 if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) && in jffs2_scan_eraseblock()
688 c->cleanmarker_size && !jeb->dirty_size && !ref_next(jeb->first_node)) { in jffs2_scan_eraseblock()
690 EMPTY_SCAN_SIZE(c->sector_size)); in jffs2_scan_eraseblock()
699 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
711 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
721 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
728 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
736 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
747 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
766 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
772 if (ofs + je32_to_cpu(node->totlen) > jeb->offset + c->sector_size) { in jffs2_scan_eraseblock()
777 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
787 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
796 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
800 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
806 err = jffs2_scan_inode_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
813 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
817 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
823 err = jffs2_scan_dirent_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
831 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
835 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
841 err = jffs2_scan_xattr_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
848 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
852 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
858 err = jffs2_scan_xref_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
867 if (je32_to_cpu(node->totlen) != c->cleanmarker_size) { in jffs2_scan_eraseblock()
870 c->cleanmarker_size); in jffs2_scan_eraseblock()
871 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node))))) in jffs2_scan_eraseblock()
877 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node))))) in jffs2_scan_eraseblock()
881 jffs2_link_node_ref(c, jeb, ofs | REF_NORMAL, c->cleanmarker_size, NULL); in jffs2_scan_eraseblock()
883 ofs += PAD(c->cleanmarker_size); in jffs2_scan_eraseblock()
890 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
900 c->flags |= JFFS2_SB_FLAG_RO; in jffs2_scan_eraseblock()
901 if (!(jffs2_is_readonly(c))) in jffs2_scan_eraseblock()
903 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
916 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
925 jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(node->totlen)), NULL); in jffs2_scan_eraseblock()
951 c->dirty_size += jeb->wasted_size; in jffs2_scan_eraseblock()
952 c->wasted_size -= jeb->wasted_size; in jffs2_scan_eraseblock()
956 return jffs2_scan_classify_jeb(c, jeb); in jffs2_scan_eraseblock()
959 struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino) in jffs2_scan_make_ino_cache() argument
963 ic = jffs2_get_ino_cache(c, ino); in jffs2_scan_make_ino_cache()
967 if (ino > c->highest_ino) in jffs2_scan_make_ino_cache()
968 c->highest_ino = ino; in jffs2_scan_make_ino_cache()
979 jffs2_add_ino_cache(c, ic); in jffs2_scan_make_ino_cache()
985 static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_inode_node() argument
1011 return jffs2_scan_dirty_space(c, jeb, in jffs2_scan_inode_node()
1015 ic = jffs2_get_ino_cache(c, ino); in jffs2_scan_inode_node()
1017 ic = jffs2_scan_make_ino_cache(c, ino); in jffs2_scan_inode_node()
1023 jffs2_link_node_ref(c, jeb, ofs | REF_UNCHECKED, PAD(je32_to_cpu(ri->totlen)), ic); in jffs2_scan_inode_node()
1039 static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_dirent_node() argument
1058 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen))))) in jffs2_scan_dirent_node()
1087 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen))))) in jffs2_scan_dirent_node()
1091 ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(rd->pino)); in jffs2_scan_dirent_node()
1097 fd->raw = jffs2_link_node_ref(c, jeb, ofs | dirent_node_state(rd), in jffs2_scan_dirent_node()
1105 jffs2_add_fd_to_list(c, fd, &ic->scan_dents); in jffs2_scan_dirent_node()
1138 void jffs2_rotate_lists(struct jffs2_sb_info *c) in jffs2_rotate_lists() argument
1143 x = count_list(&c->clean_list); in jffs2_rotate_lists()
1146 rotate_list((&c->clean_list), rotateby); in jffs2_rotate_lists()
1149 x = count_list(&c->very_dirty_list); in jffs2_rotate_lists()
1152 rotate_list((&c->very_dirty_list), rotateby); in jffs2_rotate_lists()
1155 x = count_list(&c->dirty_list); in jffs2_rotate_lists()
1158 rotate_list((&c->dirty_list), rotateby); in jffs2_rotate_lists()
1161 x = count_list(&c->erasable_list); in jffs2_rotate_lists()
1164 rotate_list((&c->erasable_list), rotateby); in jffs2_rotate_lists()
1167 if (c->nr_erasing_blocks) { in jffs2_rotate_lists()
1168 rotateby = pseudo_random % c->nr_erasing_blocks; in jffs2_rotate_lists()
1169 rotate_list((&c->erase_pending_list), rotateby); in jffs2_rotate_lists()
1172 if (c->nr_free_blocks) { in jffs2_rotate_lists()
1173 rotateby = pseudo_random % c->nr_free_blocks; in jffs2_rotate_lists()
1174 rotate_list((&c->free_list), rotateby); in jffs2_rotate_lists()