Lines Matching refs:dev

18 static int yaffs2_checkpt_space_ok(struct yaffs_dev *dev)  in yaffs2_checkpt_space_ok()  argument
20 int blocks_avail = dev->n_erased_blocks - dev->param.n_reserved_blocks; in yaffs2_checkpt_space_ok()
28 static int yaffs_checkpt_erase(struct yaffs_dev *dev) in yaffs_checkpt_erase() argument
32 if (!dev->param.erase_fn) in yaffs_checkpt_erase()
36 dev->internal_start_block, dev->internal_end_block); in yaffs_checkpt_erase()
38 for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) { in yaffs_checkpt_erase()
39 struct yaffs_block_info *bi = yaffs_get_block_info(dev, i); in yaffs_checkpt_erase()
44 dev->n_erasures++; in yaffs_checkpt_erase()
46 if (dev->param. in yaffs_checkpt_erase()
47 erase_fn(dev, in yaffs_checkpt_erase()
48 i - dev->block_offset /* realign */)) { in yaffs_checkpt_erase()
50 dev->n_erased_blocks++; in yaffs_checkpt_erase()
51 dev->n_free_chunks += in yaffs_checkpt_erase()
52 dev->param.chunks_per_block; in yaffs_checkpt_erase()
54 dev->param.bad_block_fn(dev, i); in yaffs_checkpt_erase()
60 dev->blocks_in_checkpt = 0; in yaffs_checkpt_erase()
65 static void yaffs2_checkpt_find_erased_block(struct yaffs_dev *dev) in yaffs2_checkpt_find_erased_block() argument
68 int blocks_avail = dev->n_erased_blocks - dev->param.n_reserved_blocks; in yaffs2_checkpt_find_erased_block()
72 dev->n_erased_blocks, dev->param.n_reserved_blocks, in yaffs2_checkpt_find_erased_block()
73 blocks_avail, dev->checkpt_next_block); in yaffs2_checkpt_find_erased_block()
75 if (dev->checkpt_next_block >= 0 && in yaffs2_checkpt_find_erased_block()
76 dev->checkpt_next_block <= dev->internal_end_block && in yaffs2_checkpt_find_erased_block()
79 for (i = dev->checkpt_next_block; i <= dev->internal_end_block; in yaffs2_checkpt_find_erased_block()
82 yaffs_get_block_info(dev, i); in yaffs2_checkpt_find_erased_block()
84 dev->checkpt_next_block = i + 1; in yaffs2_checkpt_find_erased_block()
85 dev->checkpt_cur_block = i; in yaffs2_checkpt_find_erased_block()
94 dev->checkpt_next_block = -1; in yaffs2_checkpt_find_erased_block()
95 dev->checkpt_cur_block = -1; in yaffs2_checkpt_find_erased_block()
98 static void yaffs2_checkpt_find_block(struct yaffs_dev *dev) in yaffs2_checkpt_find_block() argument
105 dev->blocks_in_checkpt, dev->checkpt_next_block); in yaffs2_checkpt_find_block()
107 if (dev->blocks_in_checkpt < dev->checkpt_max_blocks) in yaffs2_checkpt_find_block()
108 for (i = dev->checkpt_next_block; i <= dev->internal_end_block; in yaffs2_checkpt_find_block()
110 int chunk = i * dev->param.chunks_per_block; in yaffs2_checkpt_find_block()
111 int realigned_chunk = chunk - dev->chunk_offset; in yaffs2_checkpt_find_block()
113 dev->param.read_chunk_tags_fn(dev, realigned_chunk, in yaffs2_checkpt_find_block()
122 dev->checkpt_next_block = tags.obj_id; in yaffs2_checkpt_find_block()
123 dev->checkpt_cur_block = i; in yaffs2_checkpt_find_block()
124 dev->checkpt_block_list[dev-> in yaffs2_checkpt_find_block()
126 dev->blocks_in_checkpt++; in yaffs2_checkpt_find_block()
135 dev->checkpt_next_block = -1; in yaffs2_checkpt_find_block()
136 dev->checkpt_cur_block = -1; in yaffs2_checkpt_find_block()
139 int yaffs2_checkpt_open(struct yaffs_dev *dev, int writing) in yaffs2_checkpt_open() argument
143 dev->checkpt_open_write = writing; in yaffs2_checkpt_open()
146 if (!dev->param.write_chunk_tags_fn || in yaffs2_checkpt_open()
147 !dev->param.read_chunk_tags_fn || in yaffs2_checkpt_open()
148 !dev->param.erase_fn || !dev->param.bad_block_fn) in yaffs2_checkpt_open()
151 if (writing && !yaffs2_checkpt_space_ok(dev)) in yaffs2_checkpt_open()
154 if (!dev->checkpt_buffer) in yaffs2_checkpt_open()
155 dev->checkpt_buffer = in yaffs2_checkpt_open()
156 kmalloc(dev->param.total_bytes_per_chunk, GFP_NOFS); in yaffs2_checkpt_open()
157 if (!dev->checkpt_buffer) in yaffs2_checkpt_open()
160 dev->checkpt_page_seq = 0; in yaffs2_checkpt_open()
161 dev->checkpt_byte_count = 0; in yaffs2_checkpt_open()
162 dev->checkpt_sum = 0; in yaffs2_checkpt_open()
163 dev->checkpt_xor = 0; in yaffs2_checkpt_open()
164 dev->checkpt_cur_block = -1; in yaffs2_checkpt_open()
165 dev->checkpt_cur_chunk = -1; in yaffs2_checkpt_open()
166 dev->checkpt_next_block = dev->internal_start_block; in yaffs2_checkpt_open()
170 memset(dev->checkpt_buffer, 0, dev->data_bytes_per_chunk); in yaffs2_checkpt_open()
171 dev->checkpt_byte_offs = 0; in yaffs2_checkpt_open()
172 return yaffs_checkpt_erase(dev); in yaffs2_checkpt_open()
176 dev->checkpt_byte_offs = dev->data_bytes_per_chunk; in yaffs2_checkpt_open()
179 dev->blocks_in_checkpt = 0; in yaffs2_checkpt_open()
180 dev->checkpt_max_blocks = in yaffs2_checkpt_open()
181 (dev->internal_end_block - dev->internal_start_block) / 16 + 2; in yaffs2_checkpt_open()
182 dev->checkpt_block_list = in yaffs2_checkpt_open()
183 kmalloc(sizeof(int) * dev->checkpt_max_blocks, GFP_NOFS); in yaffs2_checkpt_open()
185 if (!dev->checkpt_block_list) in yaffs2_checkpt_open()
188 for (i = 0; i < dev->checkpt_max_blocks; i++) in yaffs2_checkpt_open()
189 dev->checkpt_block_list[i] = -1; in yaffs2_checkpt_open()
194 int yaffs2_get_checkpt_sum(struct yaffs_dev *dev, u32 * sum) in yaffs2_get_checkpt_sum() argument
198 composite_sum = (dev->checkpt_sum << 8) | (dev->checkpt_xor & 0xff); in yaffs2_get_checkpt_sum()
203 static int yaffs2_checkpt_flush_buffer(struct yaffs_dev *dev) in yaffs2_checkpt_flush_buffer() argument
209 if (dev->checkpt_cur_block < 0) { in yaffs2_checkpt_flush_buffer()
210 yaffs2_checkpt_find_erased_block(dev); in yaffs2_checkpt_flush_buffer()
211 dev->checkpt_cur_chunk = 0; in yaffs2_checkpt_flush_buffer()
214 if (dev->checkpt_cur_block < 0) in yaffs2_checkpt_flush_buffer()
218 tags.obj_id = dev->checkpt_next_block; /* Hint to next place to look */ in yaffs2_checkpt_flush_buffer()
219 tags.chunk_id = dev->checkpt_page_seq + 1; in yaffs2_checkpt_flush_buffer()
221 tags.n_bytes = dev->data_bytes_per_chunk; in yaffs2_checkpt_flush_buffer()
222 if (dev->checkpt_cur_chunk == 0) { in yaffs2_checkpt_flush_buffer()
226 yaffs_get_block_info(dev, dev->checkpt_cur_block); in yaffs2_checkpt_flush_buffer()
228 dev->blocks_in_checkpt++; in yaffs2_checkpt_flush_buffer()
232 dev->checkpt_cur_block * dev->param.chunks_per_block + in yaffs2_checkpt_flush_buffer()
233 dev->checkpt_cur_chunk; in yaffs2_checkpt_flush_buffer()
237 chunk, dev->checkpt_cur_block, dev->checkpt_cur_chunk, in yaffs2_checkpt_flush_buffer()
240 realigned_chunk = chunk - dev->chunk_offset; in yaffs2_checkpt_flush_buffer()
242 dev->n_page_writes++; in yaffs2_checkpt_flush_buffer()
244 dev->param.write_chunk_tags_fn(dev, realigned_chunk, in yaffs2_checkpt_flush_buffer()
245 dev->checkpt_buffer, &tags); in yaffs2_checkpt_flush_buffer()
246 dev->checkpt_byte_offs = 0; in yaffs2_checkpt_flush_buffer()
247 dev->checkpt_page_seq++; in yaffs2_checkpt_flush_buffer()
248 dev->checkpt_cur_chunk++; in yaffs2_checkpt_flush_buffer()
249 if (dev->checkpt_cur_chunk >= dev->param.chunks_per_block) { in yaffs2_checkpt_flush_buffer()
250 dev->checkpt_cur_chunk = 0; in yaffs2_checkpt_flush_buffer()
251 dev->checkpt_cur_block = -1; in yaffs2_checkpt_flush_buffer()
253 memset(dev->checkpt_buffer, 0, dev->data_bytes_per_chunk); in yaffs2_checkpt_flush_buffer()
258 int yaffs2_checkpt_wr(struct yaffs_dev *dev, const void *data, int n_bytes) in yaffs2_checkpt_wr() argument
264 if (!dev->checkpt_buffer) in yaffs2_checkpt_wr()
267 if (!dev->checkpt_open_write) in yaffs2_checkpt_wr()
271 dev->checkpt_buffer[dev->checkpt_byte_offs] = *data_bytes; in yaffs2_checkpt_wr()
272 dev->checkpt_sum += *data_bytes; in yaffs2_checkpt_wr()
273 dev->checkpt_xor ^= *data_bytes; in yaffs2_checkpt_wr()
275 dev->checkpt_byte_offs++; in yaffs2_checkpt_wr()
278 dev->checkpt_byte_count++; in yaffs2_checkpt_wr()
280 if (dev->checkpt_byte_offs < 0 || in yaffs2_checkpt_wr()
281 dev->checkpt_byte_offs >= dev->data_bytes_per_chunk) in yaffs2_checkpt_wr()
282 ok = yaffs2_checkpt_flush_buffer(dev); in yaffs2_checkpt_wr()
288 int yaffs2_checkpt_rd(struct yaffs_dev *dev, void *data, int n_bytes) in yaffs2_checkpt_rd() argument
297 if (!dev->checkpt_buffer) in yaffs2_checkpt_rd()
300 if (dev->checkpt_open_write) in yaffs2_checkpt_rd()
305 if (dev->checkpt_byte_offs < 0 || in yaffs2_checkpt_rd()
306 dev->checkpt_byte_offs >= dev->data_bytes_per_chunk) { in yaffs2_checkpt_rd()
308 if (dev->checkpt_cur_block < 0) { in yaffs2_checkpt_rd()
309 yaffs2_checkpt_find_block(dev); in yaffs2_checkpt_rd()
310 dev->checkpt_cur_chunk = 0; in yaffs2_checkpt_rd()
313 if (dev->checkpt_cur_block < 0) { in yaffs2_checkpt_rd()
318 chunk = dev->checkpt_cur_block * in yaffs2_checkpt_rd()
319 dev->param.chunks_per_block + in yaffs2_checkpt_rd()
320 dev->checkpt_cur_chunk; in yaffs2_checkpt_rd()
322 realigned_chunk = chunk - dev->chunk_offset; in yaffs2_checkpt_rd()
323 dev->n_page_reads++; in yaffs2_checkpt_rd()
326 dev->param.read_chunk_tags_fn(dev, in yaffs2_checkpt_rd()
328 dev->checkpt_buffer, in yaffs2_checkpt_rd()
331 if (tags.chunk_id != (dev->checkpt_page_seq + 1) || in yaffs2_checkpt_rd()
338 dev->checkpt_byte_offs = 0; in yaffs2_checkpt_rd()
339 dev->checkpt_page_seq++; in yaffs2_checkpt_rd()
340 dev->checkpt_cur_chunk++; in yaffs2_checkpt_rd()
342 if (dev->checkpt_cur_chunk >= in yaffs2_checkpt_rd()
343 dev->param.chunks_per_block) in yaffs2_checkpt_rd()
344 dev->checkpt_cur_block = -1; in yaffs2_checkpt_rd()
347 *data_bytes = dev->checkpt_buffer[dev->checkpt_byte_offs]; in yaffs2_checkpt_rd()
348 dev->checkpt_sum += *data_bytes; in yaffs2_checkpt_rd()
349 dev->checkpt_xor ^= *data_bytes; in yaffs2_checkpt_rd()
350 dev->checkpt_byte_offs++; in yaffs2_checkpt_rd()
353 dev->checkpt_byte_count++; in yaffs2_checkpt_rd()
359 int yaffs_checkpt_close(struct yaffs_dev *dev) in yaffs_checkpt_close() argument
363 if (dev->checkpt_open_write) { in yaffs_checkpt_close()
364 if (dev->checkpt_byte_offs != 0) in yaffs_checkpt_close()
365 yaffs2_checkpt_flush_buffer(dev); in yaffs_checkpt_close()
366 } else if (dev->checkpt_block_list) { in yaffs_checkpt_close()
368 i < dev->blocks_in_checkpt && in yaffs_checkpt_close()
369 dev->checkpt_block_list[i] >= 0; i++) { in yaffs_checkpt_close()
370 int blk = dev->checkpt_block_list[i]; in yaffs_checkpt_close()
373 if (dev->internal_start_block <= blk && in yaffs_checkpt_close()
374 blk <= dev->internal_end_block) in yaffs_checkpt_close()
375 bi = yaffs_get_block_info(dev, blk); in yaffs_checkpt_close()
379 kfree(dev->checkpt_block_list); in yaffs_checkpt_close()
380 dev->checkpt_block_list = NULL; in yaffs_checkpt_close()
383 dev->n_free_chunks -= in yaffs_checkpt_close()
384 dev->blocks_in_checkpt * dev->param.chunks_per_block; in yaffs_checkpt_close()
385 dev->n_erased_blocks -= dev->blocks_in_checkpt; in yaffs_checkpt_close()
388 dev->checkpt_byte_count); in yaffs_checkpt_close()
390 if (dev->checkpt_buffer) { in yaffs_checkpt_close()
392 kfree(dev->checkpt_buffer); in yaffs_checkpt_close()
393 dev->checkpt_buffer = NULL; in yaffs_checkpt_close()
400 int yaffs2_checkpt_invalidate_stream(struct yaffs_dev *dev) in yaffs2_checkpt_invalidate_stream() argument
406 dev->blocks_in_checkpt); in yaffs2_checkpt_invalidate_stream()
408 return yaffs_checkpt_erase(dev); in yaffs2_checkpt_invalidate_stream()