aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/sm_ftl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/sm_ftl.c')
-rw-r--r--drivers/mtd/sm_ftl.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c
index a59ebb48cae1..9fb56c76ae89 100644
--- a/drivers/mtd/sm_ftl.c
+++ b/drivers/mtd/sm_ftl.c
@@ -228,7 +228,7 @@ static int sm_read_sector(struct sm_ftl *ftl,
228 struct mtd_info *mtd = ftl->trans->mtd; 228 struct mtd_info *mtd = ftl->trans->mtd;
229 struct mtd_oob_ops ops; 229 struct mtd_oob_ops ops;
230 struct sm_oob tmp_oob; 230 struct sm_oob tmp_oob;
231 int ret; 231 int ret = -EIO;
232 int try = 0; 232 int try = 0;
233 233
234 /* FTL can contain -1 entries that are by default filled with bits */ 234 /* FTL can contain -1 entries that are by default filled with bits */
@@ -753,6 +753,7 @@ static int sm_init_zone(struct sm_ftl *ftl, int zone_num)
753 uint16_t block; 753 uint16_t block;
754 int lba; 754 int lba;
755 int i = 0; 755 int i = 0;
756 int len;
756 757
757 dbg("initializing zone %d", zone_num); 758 dbg("initializing zone %d", zone_num);
758 759
@@ -856,7 +857,9 @@ static int sm_init_zone(struct sm_ftl *ftl, int zone_num)
856 i %= (kfifo_len(&zone->free_sectors) / 2); 857 i %= (kfifo_len(&zone->free_sectors) / 2);
857 858
858 while (i--) { 859 while (i--) {
859 kfifo_out(&zone->free_sectors, (unsigned char *)&block, 2); 860 len = kfifo_out(&zone->free_sectors,
861 (unsigned char *)&block, 2);
862 WARN_ON(len != 2);
860 kfifo_in(&zone->free_sectors, (const unsigned char *)&block, 2); 863 kfifo_in(&zone->free_sectors, (const unsigned char *)&block, 2);
861 } 864 }
862 return 0; 865 return 0;
@@ -947,17 +950,17 @@ restart:
947 950
948 if (ftl->unstable) 951 if (ftl->unstable)
949 return -EIO; 952 return -EIO;
950 /* No spare blocks */ 953
951 /* We could still continue by erasing the current block, 954 /* If there are no spare blocks, */
955 /* we could still continue by erasing/writing the current block,
952 but for such worn out media it doesn't worth the trouble, 956 but for such worn out media it doesn't worth the trouble,
953 and the dangers */ 957 and the dangers */
954 958 if (kfifo_out(&zone->free_sectors,
955 if (!kfifo_len(&zone->free_sectors)) { 959 (unsigned char *)&write_sector, 2) != 2) {
956 dbg("no free sectors for write!"); 960 dbg("no free sectors for write!");
957 return -EIO; 961 return -EIO;
958 } 962 }
959 963
960 kfifo_out(&zone->free_sectors, (unsigned char *)&write_sector, 2);
961 964
962 if (sm_write_block(ftl, ftl->cache_data, zone_num, write_sector, 965 if (sm_write_block(ftl, ftl->cache_data, zone_num, write_sector,
963 ftl->cache_block, ftl->cache_data_invalid_bitmap)) 966 ftl->cache_block, ftl->cache_data_invalid_bitmap))