Lines Matching refs:dev

42 void yaffs_calc_oldest_dirty_seq(struct yaffs_dev *dev)  in yaffs_calc_oldest_dirty_seq()  argument
49 if (!dev->param.is_yaffs2) in yaffs_calc_oldest_dirty_seq()
53 seq = dev->seq_number + 1; in yaffs_calc_oldest_dirty_seq()
54 b = dev->block_info; in yaffs_calc_oldest_dirty_seq()
55 for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) { in yaffs_calc_oldest_dirty_seq()
58 dev->param.chunks_per_block && in yaffs_calc_oldest_dirty_seq()
67 dev->oldest_dirty_seq = seq; in yaffs_calc_oldest_dirty_seq()
68 dev->oldest_dirty_block = block_no; in yaffs_calc_oldest_dirty_seq()
72 void yaffs2_find_oldest_dirty_seq(struct yaffs_dev *dev) in yaffs2_find_oldest_dirty_seq() argument
74 if (!dev->param.is_yaffs2) in yaffs2_find_oldest_dirty_seq()
77 if (!dev->oldest_dirty_seq) in yaffs2_find_oldest_dirty_seq()
78 yaffs_calc_oldest_dirty_seq(dev); in yaffs2_find_oldest_dirty_seq()
87 void yaffs2_clear_oldest_dirty_seq(struct yaffs_dev *dev, in yaffs2_clear_oldest_dirty_seq() argument
91 if (!dev->param.is_yaffs2) in yaffs2_clear_oldest_dirty_seq()
94 if (!bi || bi->seq_number == dev->oldest_dirty_seq) { in yaffs2_clear_oldest_dirty_seq()
95 dev->oldest_dirty_seq = 0; in yaffs2_clear_oldest_dirty_seq()
96 dev->oldest_dirty_block = 0; in yaffs2_clear_oldest_dirty_seq()
105 void yaffs2_update_oldest_dirty_seq(struct yaffs_dev *dev, unsigned block_no, in yaffs2_update_oldest_dirty_seq() argument
108 if (!dev->param.is_yaffs2) in yaffs2_update_oldest_dirty_seq()
111 if (dev->oldest_dirty_seq) { in yaffs2_update_oldest_dirty_seq()
112 if (dev->oldest_dirty_seq > bi->seq_number) { in yaffs2_update_oldest_dirty_seq()
113 dev->oldest_dirty_seq = bi->seq_number; in yaffs2_update_oldest_dirty_seq()
114 dev->oldest_dirty_block = block_no; in yaffs2_update_oldest_dirty_seq()
119 int yaffs_block_ok_for_gc(struct yaffs_dev *dev, struct yaffs_block_info *bi) in yaffs_block_ok_for_gc() argument
122 if (!dev->param.is_yaffs2) in yaffs_block_ok_for_gc()
128 yaffs2_find_oldest_dirty_seq(dev); in yaffs_block_ok_for_gc()
133 return (bi->seq_number <= dev->oldest_dirty_seq); in yaffs_block_ok_for_gc()
141 u32 yaffs2_find_refresh_block(struct yaffs_dev *dev) in yaffs2_find_refresh_block() argument
148 if (!dev->param.is_yaffs2) in yaffs2_find_refresh_block()
154 if (dev->param.refresh_period < 10) in yaffs2_find_refresh_block()
160 if (dev->refresh_skip > dev->param.refresh_period) in yaffs2_find_refresh_block()
161 dev->refresh_skip = dev->param.refresh_period; in yaffs2_find_refresh_block()
163 if (dev->refresh_skip > 0) in yaffs2_find_refresh_block()
171 dev->refresh_skip = dev->param.refresh_period; in yaffs2_find_refresh_block()
172 dev->refresh_count++; in yaffs2_find_refresh_block()
173 bi = dev->block_info; in yaffs2_find_refresh_block()
174 for (b = dev->internal_start_block; b <= dev->internal_end_block; b++) { in yaffs2_find_refresh_block()
189 dev->refresh_count, oldest, oldest_seq); in yaffs2_find_refresh_block()
195 int yaffs2_checkpt_required(struct yaffs_dev *dev) in yaffs2_checkpt_required() argument
199 if (!dev->param.is_yaffs2) in yaffs2_checkpt_required()
202 nblocks = dev->internal_end_block - dev->internal_start_block + 1; in yaffs2_checkpt_required()
204 return !dev->param.skip_checkpt_wr && in yaffs2_checkpt_required()
205 !dev->read_only && (nblocks >= YAFFS_CHECKPOINT_MIN_BLOCKS); in yaffs2_checkpt_required()
208 int yaffs_calc_checkpt_blocks_required(struct yaffs_dev *dev) in yaffs_calc_checkpt_blocks_required() argument
215 if (!dev->param.is_yaffs2) in yaffs_calc_checkpt_blocks_required()
218 if (!dev->checkpoint_blocks_required && yaffs2_checkpt_required(dev)) { in yaffs_calc_checkpt_blocks_required()
220 dev_blocks = dev->param.end_block - dev->param.start_block + 1; in yaffs_calc_checkpt_blocks_required()
224 n_bytes += dev_blocks * dev->chunk_bit_stride; in yaffs_calc_checkpt_blocks_required()
227 dev->n_obj; in yaffs_calc_checkpt_blocks_required()
228 n_bytes += (dev->tnode_size + sizeof(u32)) * dev->n_tnodes; in yaffs_calc_checkpt_blocks_required()
237 (dev->data_bytes_per_chunk * in yaffs_calc_checkpt_blocks_required()
238 dev->param.chunks_per_block)) + 3; in yaffs_calc_checkpt_blocks_required()
240 dev->checkpoint_blocks_required = n_blocks; in yaffs_calc_checkpt_blocks_required()
243 retval = dev->checkpoint_blocks_required - dev->blocks_in_checkpt; in yaffs_calc_checkpt_blocks_required()
251 static int yaffs2_wr_checkpt_validity_marker(struct yaffs_dev *dev, int head) in yaffs2_wr_checkpt_validity_marker() argument
262 return (yaffs2_checkpt_wr(dev, &cp, sizeof(cp)) == sizeof(cp)) ? 1 : 0; in yaffs2_wr_checkpt_validity_marker()
265 static int yaffs2_rd_checkpt_validity_marker(struct yaffs_dev *dev, int head) in yaffs2_rd_checkpt_validity_marker() argument
270 ok = (yaffs2_checkpt_rd(dev, &cp, sizeof(cp)) == sizeof(cp)); in yaffs2_rd_checkpt_validity_marker()
281 struct yaffs_dev *dev) in yaffs2_dev_to_checkpt_dev() argument
283 cp->n_erased_blocks = dev->n_erased_blocks; in yaffs2_dev_to_checkpt_dev()
284 cp->alloc_block = dev->alloc_block; in yaffs2_dev_to_checkpt_dev()
285 cp->alloc_page = dev->alloc_page; in yaffs2_dev_to_checkpt_dev()
286 cp->n_free_chunks = dev->n_free_chunks; in yaffs2_dev_to_checkpt_dev()
288 cp->n_deleted_files = dev->n_deleted_files; in yaffs2_dev_to_checkpt_dev()
289 cp->n_unlinked_files = dev->n_unlinked_files; in yaffs2_dev_to_checkpt_dev()
290 cp->n_bg_deletions = dev->n_bg_deletions; in yaffs2_dev_to_checkpt_dev()
291 cp->seq_number = dev->seq_number; in yaffs2_dev_to_checkpt_dev()
295 static void yaffs_checkpt_dev_to_dev(struct yaffs_dev *dev, in yaffs_checkpt_dev_to_dev() argument
298 dev->n_erased_blocks = cp->n_erased_blocks; in yaffs_checkpt_dev_to_dev()
299 dev->alloc_block = cp->alloc_block; in yaffs_checkpt_dev_to_dev()
300 dev->alloc_page = cp->alloc_page; in yaffs_checkpt_dev_to_dev()
301 dev->n_free_chunks = cp->n_free_chunks; in yaffs_checkpt_dev_to_dev()
303 dev->n_deleted_files = cp->n_deleted_files; in yaffs_checkpt_dev_to_dev()
304 dev->n_unlinked_files = cp->n_unlinked_files; in yaffs_checkpt_dev_to_dev()
305 dev->n_bg_deletions = cp->n_bg_deletions; in yaffs_checkpt_dev_to_dev()
306 dev->seq_number = cp->seq_number; in yaffs_checkpt_dev_to_dev()
309 static int yaffs2_wr_checkpt_dev(struct yaffs_dev *dev) in yaffs2_wr_checkpt_dev() argument
313 u32 n_blocks = dev->internal_end_block - dev->internal_start_block + 1; in yaffs2_wr_checkpt_dev()
317 yaffs2_dev_to_checkpt_dev(&cp, dev); in yaffs2_wr_checkpt_dev()
320 ok = (yaffs2_checkpt_wr(dev, &cp, sizeof(cp)) == sizeof(cp)); in yaffs2_wr_checkpt_dev()
326 ok = (yaffs2_checkpt_wr(dev, dev->block_info, n_bytes) == n_bytes); in yaffs2_wr_checkpt_dev()
331 n_bytes = n_blocks * dev->chunk_bit_stride; in yaffs2_wr_checkpt_dev()
332 ok = (yaffs2_checkpt_wr(dev, dev->chunk_bits, n_bytes) == n_bytes); in yaffs2_wr_checkpt_dev()
337 static int yaffs2_rd_checkpt_dev(struct yaffs_dev *dev) in yaffs2_rd_checkpt_dev() argument
342 (dev->internal_end_block - dev->internal_start_block + 1); in yaffs2_rd_checkpt_dev()
345 ok = (yaffs2_checkpt_rd(dev, &cp, sizeof(cp)) == sizeof(cp)); in yaffs2_rd_checkpt_dev()
352 yaffs_checkpt_dev_to_dev(dev, &cp); in yaffs2_rd_checkpt_dev()
356 ok = (yaffs2_checkpt_rd(dev, dev->block_info, n_bytes) == n_bytes); in yaffs2_rd_checkpt_dev()
361 n_bytes = n_blocks * dev->chunk_bit_stride; in yaffs2_rd_checkpt_dev()
363 ok = (yaffs2_checkpt_rd(dev, dev->chunk_bits, n_bytes) == n_bytes); in yaffs2_rd_checkpt_dev()
450 struct yaffs_dev *dev = in->my_dev; in yaffs2_checkpt_tnode_worker() local
472 ok = (yaffs2_checkpt_wr(dev, &base_offset, sizeof(base_offset)) == in yaffs2_checkpt_tnode_worker()
475 ok = (yaffs2_checkpt_wr(dev, tn, dev->tnode_size) == in yaffs2_checkpt_tnode_worker()
476 dev->tnode_size); in yaffs2_checkpt_tnode_worker()
504 struct yaffs_dev *dev = obj->my_dev; in yaffs2_rd_checkpt_tnodes() local
509 ok = (yaffs2_checkpt_rd(dev, &base_chunk, sizeof(base_chunk)) == in yaffs2_rd_checkpt_tnodes()
516 tn = yaffs_get_tnode(dev); in yaffs2_rd_checkpt_tnodes()
518 ok = (yaffs2_checkpt_rd(dev, tn, dev->tnode_size) == in yaffs2_rd_checkpt_tnodes()
519 dev->tnode_size); in yaffs2_rd_checkpt_tnodes()
524 ok = yaffs_add_find_tnode_0(dev, in yaffs2_rd_checkpt_tnodes()
530 (dev, &base_chunk, in yaffs2_rd_checkpt_tnodes()
541 static int yaffs2_wr_checkpt_objs(struct yaffs_dev *dev) in yaffs2_wr_checkpt_objs() argument
554 list_for_each(lh, &dev->obj_bucket[i].list) { in yaffs2_wr_checkpt_objs()
565 ok = (yaffs2_checkpt_wr(dev, &cp, in yaffs2_wr_checkpt_objs()
581 ok = (yaffs2_checkpt_wr(dev, &cp, sizeof(cp)) == sizeof(cp)); in yaffs2_wr_checkpt_objs()
586 static int yaffs2_rd_checkpt_objs(struct yaffs_dev *dev) in yaffs2_rd_checkpt_objs() argument
596 ok = (yaffs2_checkpt_rd(dev, &cp, sizeof(cp)) == sizeof(cp)); in yaffs2_rd_checkpt_objs()
613 yaffs_find_or_create_by_number(dev, cp.obj_id, in yaffs2_rd_checkpt_objs()
633 yaffs_link_fixup(dev, &hard_list); in yaffs2_rd_checkpt_objs()
638 static int yaffs2_wr_checkpt_sum(struct yaffs_dev *dev) in yaffs2_wr_checkpt_sum() argument
643 yaffs2_get_checkpt_sum(dev, &checkpt_sum); in yaffs2_wr_checkpt_sum()
645 ok = (yaffs2_checkpt_wr(dev, &checkpt_sum, sizeof(checkpt_sum)) == in yaffs2_wr_checkpt_sum()
654 static int yaffs2_rd_checkpt_sum(struct yaffs_dev *dev) in yaffs2_rd_checkpt_sum() argument
660 yaffs2_get_checkpt_sum(dev, &checkpt_sum0); in yaffs2_rd_checkpt_sum()
662 ok = (yaffs2_checkpt_rd(dev, &checkpt_sum1, sizeof(checkpt_sum1)) == in yaffs2_rd_checkpt_sum()
674 static int yaffs2_wr_checkpt_data(struct yaffs_dev *dev) in yaffs2_wr_checkpt_data() argument
678 if (!yaffs2_checkpt_required(dev)) { in yaffs2_wr_checkpt_data()
685 ok = yaffs2_checkpt_open(dev, 1); in yaffs2_wr_checkpt_data()
690 ok = yaffs2_wr_checkpt_validity_marker(dev, 1); in yaffs2_wr_checkpt_data()
695 ok = yaffs2_wr_checkpt_dev(dev); in yaffs2_wr_checkpt_data()
700 ok = yaffs2_wr_checkpt_objs(dev); in yaffs2_wr_checkpt_data()
705 ok = yaffs2_wr_checkpt_validity_marker(dev, 0); in yaffs2_wr_checkpt_data()
709 ok = yaffs2_wr_checkpt_sum(dev); in yaffs2_wr_checkpt_data()
711 if (!yaffs_checkpt_close(dev)) in yaffs2_wr_checkpt_data()
715 dev->is_checkpointed = 1; in yaffs2_wr_checkpt_data()
717 dev->is_checkpointed = 0; in yaffs2_wr_checkpt_data()
719 return dev->is_checkpointed; in yaffs2_wr_checkpt_data()
722 static int yaffs2_rd_checkpt_data(struct yaffs_dev *dev) in yaffs2_rd_checkpt_data() argument
726 if (!dev->param.is_yaffs2) in yaffs2_rd_checkpt_data()
729 if (ok && dev->param.skip_checkpt_rd) { in yaffs2_rd_checkpt_data()
736 ok = yaffs2_checkpt_open(dev, 0); /* open for read */ in yaffs2_rd_checkpt_data()
741 ok = yaffs2_rd_checkpt_validity_marker(dev, 1); in yaffs2_rd_checkpt_data()
746 ok = yaffs2_rd_checkpt_dev(dev); in yaffs2_rd_checkpt_data()
751 ok = yaffs2_rd_checkpt_objs(dev); in yaffs2_rd_checkpt_data()
756 ok = yaffs2_rd_checkpt_validity_marker(dev, 0); in yaffs2_rd_checkpt_data()
760 ok = yaffs2_rd_checkpt_sum(dev); in yaffs2_rd_checkpt_data()
765 if (!yaffs_checkpt_close(dev)) in yaffs2_rd_checkpt_data()
769 dev->is_checkpointed = 1; in yaffs2_rd_checkpt_data()
771 dev->is_checkpointed = 0; in yaffs2_rd_checkpt_data()
776 void yaffs2_checkpt_invalidate(struct yaffs_dev *dev) in yaffs2_checkpt_invalidate() argument
778 if (dev->is_checkpointed || dev->blocks_in_checkpt > 0) { in yaffs2_checkpt_invalidate()
779 dev->is_checkpointed = 0; in yaffs2_checkpt_invalidate()
780 yaffs2_checkpt_invalidate_stream(dev); in yaffs2_checkpt_invalidate()
782 if (dev->param.sb_dirty_fn) in yaffs2_checkpt_invalidate()
783 dev->param.sb_dirty_fn(dev); in yaffs2_checkpt_invalidate()
786 int yaffs_checkpoint_save(struct yaffs_dev *dev) in yaffs_checkpoint_save() argument
790 dev->is_checkpointed); in yaffs_checkpoint_save()
792 yaffs_verify_objects(dev); in yaffs_checkpoint_save()
793 yaffs_verify_blocks(dev); in yaffs_checkpoint_save()
794 yaffs_verify_free_chunks(dev); in yaffs_checkpoint_save()
796 if (!dev->is_checkpointed) { in yaffs_checkpoint_save()
797 yaffs2_checkpt_invalidate(dev); in yaffs_checkpoint_save()
798 yaffs2_wr_checkpt_data(dev); in yaffs_checkpoint_save()
803 dev->is_checkpointed); in yaffs_checkpoint_save()
805 return dev->is_checkpointed; in yaffs_checkpoint_save()
808 int yaffs2_checkpt_restore(struct yaffs_dev *dev) in yaffs2_checkpt_restore() argument
814 dev->is_checkpointed); in yaffs2_checkpt_restore()
816 retval = yaffs2_rd_checkpt_data(dev); in yaffs2_checkpt_restore()
818 if (dev->is_checkpointed) { in yaffs2_checkpt_restore()
819 yaffs_verify_objects(dev); in yaffs2_checkpt_restore()
820 yaffs_verify_blocks(dev); in yaffs2_checkpt_restore()
821 yaffs_verify_free_chunks(dev); in yaffs2_checkpt_restore()
826 dev->is_checkpointed); in yaffs2_checkpt_restore()
842 struct yaffs_dev *dev = NULL; in yaffs2_handle_hole() local
852 dev = obj->my_dev; in yaffs2_handle_hole()
855 if (!dev->param.is_yaffs2) in yaffs2_handle_hole()
865 if (increase < YAFFS_SMALL_HOLE_THRESHOLD * dev->data_bytes_per_chunk && in yaffs2_handle_hole()
866 yaffs_check_alloc_available(dev, YAFFS_SMALL_HOLE_THRESHOLD + 1)) in yaffs2_handle_hole()
872 local_buffer = yaffs_get_temp_buffer(dev); in yaffs2_handle_hole()
879 memset(local_buffer, 0, dev->data_bytes_per_chunk); in yaffs2_handle_hole()
884 if (this_write > dev->data_bytes_per_chunk) in yaffs2_handle_hole()
885 this_write = dev->data_bytes_per_chunk; in yaffs2_handle_hole()
897 yaffs_release_temp_buffer(dev, local_buffer); in yaffs2_handle_hole()
933 static inline int yaffs2_scan_chunk(struct yaffs_dev *dev, in yaffs2_scan_chunk() argument
950 int chunk = blk * dev->param.chunks_per_block + chunk_in_block; in yaffs2_scan_chunk()
956 yaffs_summary_fetch(dev, &tags, chunk_in_block); in yaffs2_scan_chunk()
961 yaffs_rd_chunk_tags_nand(dev, chunk, NULL, &tags); in yaffs2_scan_chunk()
962 dev->tags_used++; in yaffs2_scan_chunk()
964 dev->summary_used++; in yaffs2_scan_chunk()
988 dev->n_erased_blocks++; in yaffs2_scan_chunk()
992 if (dev->seq_number == bi->seq_number) { in yaffs2_scan_chunk()
1000 dev->alloc_block = blk; in yaffs2_scan_chunk()
1001 dev->alloc_page = chunk_in_block; in yaffs2_scan_chunk()
1002 dev->alloc_block_finder = blk; in yaffs2_scan_chunk()
1015 dev->n_free_chunks++; in yaffs2_scan_chunk()
1022 dev->n_free_chunks++; in yaffs2_scan_chunk()
1027 tags.n_bytes > dev->data_bytes_per_chunk) || in yaffs2_scan_chunk()
1033 dev->n_free_chunks++; in yaffs2_scan_chunk()
1038 dev->data_bytes_per_chunk; in yaffs2_scan_chunk()
1042 yaffs_set_chunk_bit(dev, blk, chunk_in_block); in yaffs2_scan_chunk()
1045 in = yaffs_find_or_create_by_number(dev, in yaffs2_scan_chunk()
1080 yaffs_chunk_del(dev, chunk, 1, __LINE__); in yaffs2_scan_chunk()
1089 yaffs_set_chunk_bit(dev, blk, chunk_in_block); in yaffs2_scan_chunk()
1096 in = yaffs_find_or_create_by_number(dev, in yaffs2_scan_chunk()
1104 (!in->valid && dev->param.disable_lazy_load) || in yaffs2_scan_chunk()
1116 yaffs_rd_chunk_tags_nand(dev, chunk, chunk_data, NULL); in yaffs2_scan_chunk()
1120 if (dev->param.inband_tags) { in yaffs2_scan_chunk()
1130 in = yaffs_find_or_create_by_number(dev, in yaffs2_scan_chunk()
1188 yaffs_chunk_del(dev, chunk, 1, __LINE__); in yaffs2_scan_chunk()
1225 yaffs_handle_shadowed_obj(dev, in yaffs2_scan_chunk()
1229 parent = yaffs_find_or_create_by_number(dev, in yaffs2_scan_chunk()
1237 parent = yaffs_find_or_create_by_number(dev, in yaffs2_scan_chunk()
1271 parent = dev->lost_n_found; in yaffs2_scan_chunk()
1275 is_unlinked = (parent == dev->del_dir) || in yaffs2_scan_chunk()
1276 (parent == dev->unlinked_dir); in yaffs2_scan_chunk()
1339 int yaffs2_scan_backwards(struct yaffs_dev *dev) in yaffs2_scan_backwards() argument
1351 int n_blocks = dev->internal_end_block - dev->internal_start_block + 1; in yaffs2_scan_backwards()
1361 dev->internal_start_block, dev->internal_end_block); in yaffs2_scan_backwards()
1363 dev->seq_number = YAFFS_LOWEST_SEQUENCE_NUMBER; in yaffs2_scan_backwards()
1381 dev->blocks_in_checkpt = 0; in yaffs2_scan_backwards()
1383 chunk_data = yaffs_get_temp_buffer(dev); in yaffs2_scan_backwards()
1386 bi = dev->block_info; in yaffs2_scan_backwards()
1387 for (blk = dev->internal_start_block; blk <= dev->internal_end_block; in yaffs2_scan_backwards()
1389 yaffs_clear_chunk_bits(dev, blk); in yaffs2_scan_backwards()
1393 yaffs_query_init_block_state(dev, blk, &state, &seq_number); in yaffs2_scan_backwards()
1408 dev->blocks_in_checkpt++; in yaffs2_scan_backwards()
1415 dev->n_erased_blocks++; in yaffs2_scan_backwards()
1416 dev->n_free_chunks += dev->param.chunks_per_block; in yaffs2_scan_backwards()
1425 if (seq_number >= dev->seq_number) in yaffs2_scan_backwards()
1426 dev->seq_number = seq_number; in yaffs2_scan_backwards()
1464 bi = yaffs_get_block_info(dev, blk); in yaffs2_scan_backwards()
1466 summary_available = yaffs_summary_read(dev, dev->sum_tags, blk); in yaffs2_scan_backwards()
1471 c = dev->chunks_per_summary - 1; in yaffs2_scan_backwards()
1473 c = dev->param.chunks_per_block - 1; in yaffs2_scan_backwards()
1483 if (yaffs2_scan_chunk(dev, bi, blk, c, in yaffs2_scan_backwards()
1500 yaffs_block_became_dirty(dev, blk); in yaffs2_scan_backwards()
1504 yaffs_skip_rest_of_block(dev); in yaffs2_scan_backwards()
1516 yaffs_link_fixup(dev, &hard_list); in yaffs2_scan_backwards()
1518 yaffs_release_temp_buffer(dev, chunk_data); in yaffs2_scan_backwards()