Lines Matching refs:zone

192 static loff_t sm_mkoffset(struct sm_ftl *ftl, int zone, int block, int boffset)  in sm_mkoffset()  argument
195 WARN_ON(zone < 0 || zone >= ftl->zone_count); in sm_mkoffset()
202 return (zone * SM_MAX_ZONE_SIZE + block) * ftl->block_size + boffset; in sm_mkoffset()
207 int *zone, int *block, int *boffset) in sm_break_offset() argument
212 *zone = offset >= ftl->zone_count ? -1 : offset; in sm_break_offset()
239 int zone, int block, int boffset, in sm_read_sector() argument
269 if (zone == 0 && block == ftl->cis_block && boffset == in sm_read_sector()
280 ret = mtd_read_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops); in sm_read_sector()
285 block, zone, ret); in sm_read_sector()
303 " as bad" , block, zone); in sm_read_sector()
312 block, zone); in sm_read_sector()
321 int zone, int block, int boffset, in sm_write_sector() argument
330 if (zone == 0 && (block == ftl->cis_block || block == 0)) { in sm_write_sector()
345 ret = mtd_write_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops); in sm_write_sector()
351 block, zone, ret); in sm_write_sector()
368 int zone, int block, int lba, in sm_write_block() argument
391 boffset / SM_SECTOR_SIZE, lba, zone); in sm_write_block()
405 if (!sm_write_sector(ftl, zone, block, boffset, in sm_write_block()
417 if (sm_erase_block(ftl, zone, block, 0)) in sm_write_block()
423 sm_mark_block_bad(ftl, zone, block); in sm_write_block()
432 static void sm_mark_block_bad(struct sm_ftl *ftl, int zone, int block) in sm_mark_block_bad() argument
446 sm_printk("marking block %d of zone %d as bad", block, zone); in sm_mark_block_bad()
452 sm_write_sector(ftl, zone, block, boffset, NULL, &oob); in sm_mark_block_bad()
462 struct ftl_zone *zone = &ftl->zones[zone_num]; in sm_erase_block() local
486 kfifo_in(&zone->free_sectors, in sm_erase_block()
496 static int sm_check_block(struct sm_ftl *ftl, int zone, int block) in sm_check_block() argument
512 if (sm_read_sector(ftl, zone, block, boffset, NULL, &oob)) in sm_check_block()
527 sm_erase_block(ftl, zone, block, 1); in sm_check_block()
746 struct ftl_zone *zone = &ftl->zones[zone_num]; in sm_init_zone() local
756 zone->lba_to_phys_table = kmalloc_array(ftl->max_lba, 2, GFP_KERNEL); in sm_init_zone()
758 if (!zone->lba_to_phys_table) in sm_init_zone()
760 memset(zone->lba_to_phys_table, -1, ftl->max_lba * 2); in sm_init_zone()
764 if (kfifo_alloc(&zone->free_sectors, ftl->zone_size * 2, GFP_KERNEL)) { in sm_init_zone()
765 kfree(zone->lba_to_phys_table); in sm_init_zone()
778 kfifo_free(&zone->free_sectors); in sm_init_zone()
779 kfree(zone->lba_to_phys_table); in sm_init_zone()
786 kfifo_in(&zone->free_sectors, in sm_init_zone()
814 if (zone->lba_to_phys_table[lba] < 0) { in sm_init_zone()
816 zone->lba_to_phys_table[lba] = block; in sm_init_zone()
822 lba, zone->lba_to_phys_table[lba], block, zone_num); in sm_init_zone()
830 zone->lba_to_phys_table[lba])) { in sm_init_zone()
831 zone->lba_to_phys_table[lba] = block; in sm_init_zone()
844 zone->initialized = 1; in sm_init_zone()
848 if (!kfifo_len(&zone->free_sectors)) { in sm_init_zone()
855 i %= (kfifo_len(&zone->free_sectors) / 2); in sm_init_zone()
858 len = kfifo_out(&zone->free_sectors, in sm_init_zone()
861 kfifo_in(&zone->free_sectors, (const unsigned char *)&block, 2); in sm_init_zone()
869 struct ftl_zone *zone; in sm_get_zone() local
873 zone = &ftl->zones[zone_num]; in sm_get_zone()
875 if (!zone->initialized) { in sm_get_zone()
881 return zone; in sm_get_zone()
919 struct ftl_zone *zone; in sm_cache_flush() local
933 zone = &ftl->zones[zone_num]; in sm_cache_flush()
934 block_num = zone->lba_to_phys_table[ftl->cache_block]; in sm_cache_flush()
956 if (kfifo_out(&zone->free_sectors, in sm_cache_flush()
968 zone->lba_to_phys_table[ftl->cache_block] = write_sector; in sm_cache_flush()
1003 struct ftl_zone *zone; in sm_read() local
1011 zone = sm_get_zone(ftl, zone_num); in sm_read()
1012 if (IS_ERR(zone)) { in sm_read()
1013 error = PTR_ERR(zone); in sm_read()
1025 block = zone->lba_to_phys_table[block]; in sm_read()
1049 struct ftl_zone *zone; in sm_write() local
1059 zone = sm_get_zone(ftl, zone_num); in sm_write()
1060 if (IS_ERR(zone)) { in sm_write()
1061 error = PTR_ERR(zone); in sm_write()