Lines Matching refs:dev
56 static void yaffs_summary_clear(struct yaffs_dev *dev) in yaffs_summary_clear() argument
58 if (!dev->sum_tags) in yaffs_summary_clear()
60 memset(dev->sum_tags, 0, dev->chunks_per_summary * in yaffs_summary_clear()
65 void yaffs_summary_deinit(struct yaffs_dev *dev) in yaffs_summary_deinit() argument
67 kfree(dev->sum_tags); in yaffs_summary_deinit()
68 dev->sum_tags = NULL; in yaffs_summary_deinit()
69 kfree(dev->gc_sum_tags); in yaffs_summary_deinit()
70 dev->gc_sum_tags = NULL; in yaffs_summary_deinit()
71 dev->chunks_per_summary = 0; in yaffs_summary_deinit()
74 int yaffs_summary_init(struct yaffs_dev *dev) in yaffs_summary_init() argument
80 sum_bytes = dev->param.chunks_per_block * in yaffs_summary_init()
83 chunks_used = (sum_bytes + dev->data_bytes_per_chunk - 1)/ in yaffs_summary_init()
84 (dev->data_bytes_per_chunk - in yaffs_summary_init()
87 dev->chunks_per_summary = dev->param.chunks_per_block - chunks_used; in yaffs_summary_init()
89 dev->chunks_per_summary; in yaffs_summary_init()
90 dev->sum_tags = kmalloc(sum_tags_bytes, GFP_NOFS); in yaffs_summary_init()
91 dev->gc_sum_tags = kmalloc(sum_tags_bytes, GFP_NOFS); in yaffs_summary_init()
92 if (!dev->sum_tags || !dev->gc_sum_tags) { in yaffs_summary_init()
93 yaffs_summary_deinit(dev); in yaffs_summary_init()
97 yaffs_summary_clear(dev); in yaffs_summary_init()
102 static unsigned yaffs_summary_sum(struct yaffs_dev *dev) in yaffs_summary_sum() argument
104 u8 *sum_buffer = (u8 *)dev->sum_tags; in yaffs_summary_sum()
109 dev->chunks_per_summary; in yaffs_summary_sum()
119 static int yaffs_summary_write(struct yaffs_dev *dev, int blk) in yaffs_summary_write() argument
123 u8 *sum_buffer = (u8 *)dev->sum_tags; in yaffs_summary_write()
130 int sum_bytes_per_chunk = dev->data_bytes_per_chunk - sizeof(hdr); in yaffs_summary_write()
131 struct yaffs_block_info *bi = yaffs_get_block_info(dev, blk); in yaffs_summary_write()
133 buffer = yaffs_get_temp_buffer(dev); in yaffs_summary_write()
135 dev->chunks_per_summary; in yaffs_summary_write()
139 chunk_in_block = dev->chunks_per_summary; in yaffs_summary_write()
140 chunk_in_nand = dev->alloc_block * dev->param.chunks_per_block + in yaffs_summary_write()
141 dev->chunks_per_summary; in yaffs_summary_write()
145 hdr.sum = yaffs_summary_sum(dev); in yaffs_summary_write()
154 result = yaffs_wr_chunk_tags_nand(dev, chunk_in_nand, in yaffs_summary_write()
159 yaffs_set_chunk_bit(dev, blk, chunk_in_block); in yaffs_summary_write()
161 dev->n_free_chunks--; in yaffs_summary_write()
169 yaffs_release_temp_buffer(dev, buffer); in yaffs_summary_write()
179 int yaffs_summary_read(struct yaffs_dev *dev, in yaffs_summary_read() argument
193 struct yaffs_block_info *bi = yaffs_get_block_info(dev, blk); in yaffs_summary_read()
194 int sum_bytes_per_chunk = dev->data_bytes_per_chunk - sizeof(hdr); in yaffs_summary_read()
196 buffer = yaffs_get_temp_buffer(dev); in yaffs_summary_read()
197 n_bytes = sizeof(struct yaffs_summary_tags) * dev->chunks_per_summary; in yaffs_summary_read()
198 chunk_in_block = dev->chunks_per_summary; in yaffs_summary_read()
199 chunk_in_nand = blk * dev->param.chunks_per_block + in yaffs_summary_read()
200 dev->chunks_per_summary; in yaffs_summary_read()
206 result = yaffs_rd_chunk_tags_nand(dev, chunk_in_nand, in yaffs_summary_read()
218 if (st == dev->sum_tags) { in yaffs_summary_read()
220 yaffs_set_chunk_bit(dev, blk, chunk_in_block); in yaffs_summary_read()
231 yaffs_release_temp_buffer(dev, buffer); in yaffs_summary_read()
237 hdr.sum != yaffs_summary_sum(dev)) in yaffs_summary_read()
241 if (st == dev->sum_tags && result == YAFFS_OK) in yaffs_summary_read()
247 int yaffs_summary_add(struct yaffs_dev *dev, in yaffs_summary_add() argument
253 int block_in_nand = chunk_in_nand / dev->param.chunks_per_block; in yaffs_summary_add()
254 int chunk_in_block = chunk_in_nand % dev->param.chunks_per_block; in yaffs_summary_add()
256 if (!dev->sum_tags) in yaffs_summary_add()
259 if (chunk_in_block >= 0 && chunk_in_block < dev->chunks_per_summary) { in yaffs_summary_add()
261 sum_tags = &dev->sum_tags[chunk_in_block]; in yaffs_summary_add()
266 if (chunk_in_block == dev->chunks_per_summary - 1) { in yaffs_summary_add()
268 yaffs_summary_write(dev, block_in_nand); in yaffs_summary_add()
269 yaffs_summary_clear(dev); in yaffs_summary_add()
270 yaffs_skip_rest_of_block(dev); in yaffs_summary_add()
276 int yaffs_summary_fetch(struct yaffs_dev *dev, in yaffs_summary_fetch() argument
282 if (chunk_in_block >= 0 && chunk_in_block < dev->chunks_per_summary) { in yaffs_summary_fetch()
283 sum_tags = &dev->sum_tags[chunk_in_block]; in yaffs_summary_fetch()
293 void yaffs_summary_gc(struct yaffs_dev *dev, int blk) in yaffs_summary_gc() argument
295 struct yaffs_block_info *bi = yaffs_get_block_info(dev, blk); in yaffs_summary_gc()
301 for (i = dev->chunks_per_summary; in yaffs_summary_gc()
302 i < dev->param.chunks_per_block; in yaffs_summary_gc()
304 if (yaffs_check_chunk_bit(dev, blk, i)) { in yaffs_summary_gc()
305 yaffs_clear_chunk_bit(dev, blk, i); in yaffs_summary_gc()
307 dev->n_free_chunks++; in yaffs_summary_gc()