diff options
Diffstat (limited to 'drivers/mtd/sm_ftl.c')
-rw-r--r-- | drivers/mtd/sm_ftl.c | 17 |
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)) |