Lines Matching defs:block
57 struct block {
80 int reserved_block; /* block next up for reclaim */
81 int current_block; /* block to write to */
88 struct block *blocks;
95 struct block *block = &part->blocks[block_no];
98 block->offset = part->block_size * block_no;
101 block->state = BLOCK_UNUSED;
105 block->state = BLOCK_OK;
116 block->free_sectors++;
139 part->sector_map[entry] = block->offset +
142 block->used_sectors++;
145 if (block->free_sectors == part->data_sectors_per_block)
164 /* each erase block has three bytes header, followed by the map */
188 part->blocks = kcalloc(part->total_blocks, sizeof(struct block),
268 static int erase_block(struct partition *part, int block)
277 erase->addr = part->blocks[block].offset;
280 part->blocks[block].state = BLOCK_ERASING;
281 part->blocks[block].free_sectors = 0;
288 part->blocks[block].state = BLOCK_FAILED;
289 part->blocks[block].free_sectors = 0;
290 part->blocks[block].used_sectors = 0;
295 part->blocks[block].state = BLOCK_ERASED;
296 part->blocks[block].free_sectors = part->data_sectors_per_block;
297 part->blocks[block].used_sectors = 0;
298 part->blocks[block].erases++;
300 rc = mtd_write(part->mbd.mtd, part->blocks[block].offset,
307 part->mbd.mtd->name, part->blocks[block].offset);
308 part->blocks[block].state = BLOCK_FAILED;
310 part->blocks[block].state = BLOCK_OK;
409 int block, best_block, score, old_sector_block;
422 for (block=0; block<part->total_blocks; block++) {
425 if (block == part->reserved_block)
433 if (part->blocks[block].free_sectors)
436 this_score = part->blocks[block].used_sectors;
438 if (block == old_sector_block)
441 /* no point in moving a full block */
442 if (part->blocks[block].used_sectors ==
447 this_score += part->blocks[block].erases;
450 best_block = block;
461 pr_debug("reclaim_block: reclaiming block #%d with %d used "
475 * IMPROVE: It would be best to choose the block with the most deleted sectors,
481 int block, stop;
483 block = part->current_block == -1 ?
485 stop = block;
488 if (part->blocks[block].free_sectors &&
489 block != part->reserved_block)
490 return block;
492 if (part->blocks[block].state == BLOCK_UNUSED)
493 erase_block(part, block);
495 if (++block >= part->total_blocks)
496 block = 0;
498 } while (block != stop);
505 int rc, block;
508 block = find_free_block(part);
510 if (block == -1) {
516 block = find_free_block(part);
519 if (block == -1) {
525 rc = mtd_read(part->mbd.mtd, part->blocks[block].offset,
535 part->blocks[block].offset);
539 part->current_block = block;
547 int block, offset, rc;
552 block = old_addr / part->block_size;
556 addr = part->blocks[block].offset +
569 if (block == part->current_block)
572 part->blocks[block].used_sectors--;
574 if (!part->blocks[block].used_sectors &&
575 !part->blocks[block].free_sectors)
576 rc = erase_block(part, block);
582 static int find_free_sector(const struct partition *part, const struct block *block)
586 i = stop = part->data_sectors_per_block - block->free_sectors;
604 struct block *block;
619 block = &part->blocks[part->current_block];
621 i = find_free_sector(part, block);
629 block->offset;
648 addr = block->offset + (HEADER_MAP_OFFSET + i) * sizeof(u16);
660 block->used_sectors++;
661 block->free_sectors--;