Lines Matching refs:c
37 static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
44 static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
46 static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
49 static inline int min_free(struct jffs2_sb_info *c) in min_free() argument
53 if (!jffs2_can_mark_obsolete(c) && min < c->wbuf_pagesize) in min_free()
54 return c->wbuf_pagesize; in min_free()
67 static int file_dirty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) in file_dirty() argument
71 if ((ret = jffs2_prealloc_raw_node_refs(c, jeb, 1))) in file_dirty()
73 if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size))) in file_dirty()
78 c->dirty_size += jeb->wasted_size; in file_dirty()
79 c->wasted_size -= jeb->wasted_size; in file_dirty()
81 if (VERYDIRTY(c, jeb->dirty_size)) { in file_dirty()
82 list_add(&jeb->list, &c->very_dirty_list); in file_dirty()
84 list_add(&jeb->list, &c->dirty_list); in file_dirty()
89 int jffs2_scan_medium(struct jffs2_sb_info *c) in jffs2_scan_medium() argument
99 if (c->mtd->point) { in jffs2_scan_medium()
100 ret = c->mtd->point(c->mtd, 0, c->mtd->size, &pointlen, in jffs2_scan_medium()
102 if (!ret && pointlen < c->mtd->size) { in jffs2_scan_medium()
105 c->mtd->unpoint(c->mtd, 0, pointlen); in jffs2_scan_medium()
115 if (jffs2_cleanmarker_oob(c)) in jffs2_scan_medium()
116 buf_size = c->sector_size; in jffs2_scan_medium()
139 for (i=0; i<c->nr_blocks; i++) { in jffs2_scan_medium()
140 struct jffs2_eraseblock *jeb = &c->blocks[i]; in jffs2_scan_medium()
147 ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), in jffs2_scan_medium()
153 jffs2_dbg_acct_paranoia_check_nolock(c, jeb); in jffs2_scan_medium()
166 list_add(&jeb->list, &c->erase_pending_list); in jffs2_scan_medium()
167 c->nr_erasing_blocks++; in jffs2_scan_medium()
174 list_add(&jeb->list, &c->free_list); in jffs2_scan_medium()
175 c->nr_free_blocks++; in jffs2_scan_medium()
179 list_add(&jeb->list, &c->erase_pending_list); in jffs2_scan_medium()
180 c->nr_erasing_blocks++; in jffs2_scan_medium()
186 list_add(&jeb->list, &c->clean_list); in jffs2_scan_medium()
193 if (jeb->free_size > min_free(c) && in jffs2_scan_medium()
194 (!c->nextblock || c->nextblock->free_size < jeb->free_size)) { in jffs2_scan_medium()
196 if (c->nextblock) { in jffs2_scan_medium()
197 ret = file_dirty(c, c->nextblock); in jffs2_scan_medium()
201 jffs2_sum_reset_collected(c->summary); in jffs2_scan_medium()
204 jffs2_sum_move_collected(c, s); in jffs2_scan_medium()
206 c->nextblock = jeb; in jffs2_scan_medium()
208 ret = file_dirty(c, jeb); in jffs2_scan_medium()
218 list_add(&jeb->list, &c->erase_pending_list); in jffs2_scan_medium()
219 c->nr_erasing_blocks++; in jffs2_scan_medium()
224 list_add(&jeb->list, &c->bad_list); in jffs2_scan_medium()
225 c->bad_size += c->sector_size; in jffs2_scan_medium()
226 c->free_size -= c->sector_size; in jffs2_scan_medium()
236 if (c->nextblock && (c->nextblock->dirty_size)) { in jffs2_scan_medium()
237 c->nextblock->wasted_size += c->nextblock->dirty_size; in jffs2_scan_medium()
238 c->wasted_size += c->nextblock->dirty_size; in jffs2_scan_medium()
239 c->dirty_size -= c->nextblock->dirty_size; in jffs2_scan_medium()
240 c->nextblock->dirty_size = 0; in jffs2_scan_medium()
243 …if (!jffs2_can_mark_obsolete(c) && c->wbuf_pagesize && c->nextblock && (c->nextblock->free_size % … in jffs2_scan_medium()
248 uint32_t skip = c->nextblock->free_size % c->wbuf_pagesize; in jffs2_scan_medium()
252 jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); in jffs2_scan_medium()
253 jffs2_scan_dirty_space(c, c->nextblock, skip); in jffs2_scan_medium()
256 if (c->nr_erasing_blocks) { in jffs2_scan_medium()
257 …if ( !c->used_size && ((c->nr_free_blocks+empty_blocks+bad_blocks)!= c->nr_blocks || bad_blocks ==… in jffs2_scan_medium()
259 …printk(KERN_NOTICE "empty_blocks %d, bad_blocks %d, c->nr_blocks %d\n",empty_blocks,bad_blocks,c->… in jffs2_scan_medium()
263 jffs2_erase_pending_trigger(c); in jffs2_scan_medium()
271 c->mtd->unpoint(c->mtd, 0, c->mtd->size); in jffs2_scan_medium()
279 static int jffs2_fill_scan_buf(struct jffs2_sb_info *c, void *buf, in jffs2_fill_scan_buf() argument
285 ret = jffs2_flash_read(c, ofs, len, &retlen, buf); in jffs2_fill_scan_buf()
297 int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) in jffs2_scan_classify_jeb() argument
299 if ((jeb->used_size + jeb->unchecked_size) == PAD(c->cleanmarker_size) && !jeb->dirty_size in jffs2_scan_classify_jeb()
304 else if (!ISDIRTY(c->sector_size - (jeb->used_size + jeb->unchecked_size))) { in jffs2_scan_classify_jeb()
305 c->dirty_size -= jeb->dirty_size; in jffs2_scan_classify_jeb()
306 c->wasted_size += jeb->dirty_size; in jffs2_scan_classify_jeb()
317 static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_xattr_node() argument
329 if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen)))) in jffs2_scan_xattr_node()
342 if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen)))) in jffs2_scan_xattr_node()
347 xd = jffs2_setup_xattr_datum(c, xid, version); in jffs2_scan_xattr_node()
353 = jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, NULL); in jffs2_scan_xattr_node()
363 jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, (void *)xd); in jffs2_scan_xattr_node()
373 static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_xref_node() argument
385 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rr->totlen))))) in jffs2_scan_xref_node()
394 if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rr->totlen)))) in jffs2_scan_xref_node()
415 if (ref->xseqno > c->highest_xseqno) in jffs2_scan_xref_node()
416 c->highest_xseqno = (ref->xseqno & ~XREF_DELETE_MARKER); in jffs2_scan_xref_node()
417 ref->next = c->xref_temp; in jffs2_scan_xref_node()
418 c->xref_temp = ref; in jffs2_scan_xref_node()
420 jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(rr->totlen)), (void *)ref); in jffs2_scan_xref_node()
432 static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_eraseblock() argument
452 if (jffs2_cleanmarker_oob(c)) { in jffs2_scan_eraseblock()
455 if (c->mtd->block_isbad(c->mtd, jeb->offset)) in jffs2_scan_eraseblock()
458 ret = jffs2_check_nand_cleanmarker(c, jeb); in jffs2_scan_eraseblock()
479 sm = (void *)buf + c->sector_size - sizeof(*sm); in jffs2_scan_eraseblock()
482 sumlen = c->sector_size - je32_to_cpu(sm->offset); in jffs2_scan_eraseblock()
486 if (c->wbuf_pagesize) in jffs2_scan_eraseblock()
487 buf_len = c->wbuf_pagesize; in jffs2_scan_eraseblock()
492 err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len, in jffs2_scan_eraseblock()
493 jeb->offset + c->sector_size - buf_len, in jffs2_scan_eraseblock()
500 sumlen = c->sector_size - je32_to_cpu(sm->offset); in jffs2_scan_eraseblock()
513 err = jffs2_fill_scan_buf(c, sumptr, in jffs2_scan_eraseblock()
514 jeb->offset + c->sector_size - sumlen, in jffs2_scan_eraseblock()
524 err = jffs2_sum_scan_sumnode(c, jeb, sumptr, sumlen, &pseudo_random); in jffs2_scan_eraseblock()
541 buf_len = c->sector_size; in jffs2_scan_eraseblock()
543 buf_len = EMPTY_SCAN_SIZE(c->sector_size); in jffs2_scan_eraseblock()
544 err = jffs2_fill_scan_buf(c, buf, buf_ofs, buf_len); in jffs2_scan_eraseblock()
553 while(ofs < EMPTY_SCAN_SIZE(c->sector_size) && *(uint32_t *)(&buf[ofs]) == 0xFFFFFFFF) in jffs2_scan_eraseblock()
556 if (ofs == EMPTY_SCAN_SIZE(c->sector_size)) { in jffs2_scan_eraseblock()
558 if (jffs2_cleanmarker_oob(c)) { in jffs2_scan_eraseblock()
560 int ret = jffs2_check_oob_empty(c, jeb, cleanmarkerfound); in jffs2_scan_eraseblock()
570 if (c->cleanmarker_size == 0) in jffs2_scan_eraseblock()
578 if ((err = jffs2_prealloc_raw_node_refs(c, jeb, 1))) in jffs2_scan_eraseblock()
580 if ((err = jffs2_scan_dirty_space(c, jeb, ofs))) in jffs2_scan_eraseblock()
592 while(ofs < jeb->offset + c->sector_size) { in jffs2_scan_eraseblock()
594 jffs2_dbg_acct_paranoia_check_nolock(c, jeb); in jffs2_scan_eraseblock()
597 err = jffs2_prealloc_raw_node_refs(c, jeb, 2); in jffs2_scan_eraseblock()
610 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
617 if (jeb->offset + c->sector_size < ofs + sizeof(*node)) { in jffs2_scan_eraseblock()
619 jeb->offset, c->sector_size, ofs, sizeof(*node))); in jffs2_scan_eraseblock()
620 if ((err = jffs2_scan_dirty_space(c, jeb, (jeb->offset + c->sector_size)-ofs))) in jffs2_scan_eraseblock()
626 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
629 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
643 scan_end = min_t(uint32_t, EMPTY_SCAN_SIZE(c->sector_size)/8, buf_len); in jffs2_scan_eraseblock()
652 if ((err = jffs2_scan_dirty_space(c, jeb, ofs-empty_start))) in jffs2_scan_eraseblock()
665 if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) && in jffs2_scan_eraseblock()
666 c->cleanmarker_size && !jeb->dirty_size && !ref_next(jeb->first_node)) { in jffs2_scan_eraseblock()
667 …%d bytes at start of block seems clean... assuming all clean\n", EMPTY_SCAN_SIZE(c->sector_size))); in jffs2_scan_eraseblock()
676 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
687 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
696 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
703 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
711 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
721 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
739 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
745 if (ofs + je32_to_cpu(node->totlen) > jeb->offset + c->sector_size) { in jffs2_scan_eraseblock()
750 if ((err = jffs2_scan_dirty_space(c, jeb, 4))) in jffs2_scan_eraseblock()
759 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
768 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
771 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
777 err = jffs2_scan_inode_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
784 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
787 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
793 err = jffs2_scan_dirent_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
801 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
805 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
811 err = jffs2_scan_xattr_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
818 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); in jffs2_scan_eraseblock()
822 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); in jffs2_scan_eraseblock()
828 err = jffs2_scan_xref_node(c, jeb, (void *)node, ofs, s); in jffs2_scan_eraseblock()
837 if (je32_to_cpu(node->totlen) != c->cleanmarker_size) { in jffs2_scan_eraseblock()
839 ofs, je32_to_cpu(node->totlen), c->cleanmarker_size); in jffs2_scan_eraseblock()
840 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node))))) in jffs2_scan_eraseblock()
845 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node))))) in jffs2_scan_eraseblock()
849 jffs2_link_node_ref(c, jeb, ofs | REF_NORMAL, c->cleanmarker_size, NULL); in jffs2_scan_eraseblock()
851 ofs += PAD(c->cleanmarker_size); in jffs2_scan_eraseblock()
858 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
867 c->flags |= JFFS2_SB_FLAG_RO; in jffs2_scan_eraseblock()
868 if (!(jffs2_is_readonly(c))) in jffs2_scan_eraseblock()
870 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
881 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) in jffs2_scan_eraseblock()
889 jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(node->totlen)), NULL); in jffs2_scan_eraseblock()
914 c->dirty_size += jeb->wasted_size; in jffs2_scan_eraseblock()
915 c->wasted_size -= jeb->wasted_size; in jffs2_scan_eraseblock()
919 return jffs2_scan_classify_jeb(c, jeb); in jffs2_scan_eraseblock()
922 struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino) in jffs2_scan_make_ino_cache() argument
926 ic = jffs2_get_ino_cache(c, ino); in jffs2_scan_make_ino_cache()
930 if (ino > c->highest_ino) in jffs2_scan_make_ino_cache()
931 c->highest_ino = ino; in jffs2_scan_make_ino_cache()
942 jffs2_add_ino_cache(c, ic); in jffs2_scan_make_ino_cache()
948 static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_inode_node() argument
975 return jffs2_scan_dirty_space(c, jeb, in jffs2_scan_inode_node()
979 ic = jffs2_get_ino_cache(c, ino); in jffs2_scan_inode_node()
981 ic = jffs2_scan_make_ino_cache(c, ino); in jffs2_scan_inode_node()
987 jffs2_link_node_ref(c, jeb, ofs | REF_UNCHECKED, PAD(je32_to_cpu(ri->totlen)), ic); in jffs2_scan_inode_node()
1003 static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, in jffs2_scan_dirent_node() argument
1022 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen))))) in jffs2_scan_dirent_node()
1050 if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen))))) in jffs2_scan_dirent_node()
1054 ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(rd->pino)); in jffs2_scan_dirent_node()
1060 fd->raw = jffs2_link_node_ref(c, jeb, ofs | dirent_node_state(rd), in jffs2_scan_dirent_node()
1068 jffs2_add_fd_to_list(c, fd, &ic->scan_dents); in jffs2_scan_dirent_node()
1101 void jffs2_rotate_lists(struct jffs2_sb_info *c) in jffs2_rotate_lists() argument
1106 x = count_list(&c->clean_list); in jffs2_rotate_lists()
1109 rotate_list((&c->clean_list), rotateby); in jffs2_rotate_lists()
1112 x = count_list(&c->very_dirty_list); in jffs2_rotate_lists()
1115 rotate_list((&c->very_dirty_list), rotateby); in jffs2_rotate_lists()
1118 x = count_list(&c->dirty_list); in jffs2_rotate_lists()
1121 rotate_list((&c->dirty_list), rotateby); in jffs2_rotate_lists()
1124 x = count_list(&c->erasable_list); in jffs2_rotate_lists()
1127 rotate_list((&c->erasable_list), rotateby); in jffs2_rotate_lists()
1130 if (c->nr_erasing_blocks) { in jffs2_rotate_lists()
1131 rotateby = pseudo_random % c->nr_erasing_blocks; in jffs2_rotate_lists()
1132 rotate_list((&c->erase_pending_list), rotateby); in jffs2_rotate_lists()
1135 if (c->nr_free_blocks) { in jffs2_rotate_lists()
1136 rotateby = pseudo_random % c->nr_free_blocks; in jffs2_rotate_lists()
1137 rotate_list((&c->free_list), rotateby); in jffs2_rotate_lists()