diff options
author | Michael Sparmann <theseven@rockbox.org> | 2010-01-20 11:25:21 +0000 |
---|---|---|
committer | Michael Sparmann <theseven@rockbox.org> | 2010-01-20 11:25:21 +0000 |
commit | 9631f815ac5076ac37343575538e19cee8465714 (patch) | |
tree | 3b91e4cb0de5a4a4fe72961940c1abb0a5daf703 /firmware/target/arm | |
parent | 70cfcf3fd608ee8ce13ac07e9453a62d087aec1e (diff) | |
download | rockbox-9631f815ac5076ac37343575538e19cee8465714.tar.gz rockbox-9631f815ac5076ac37343575538e19cee8465714.zip |
iPod Nano 2G: Fix FTL panics caused by a bogus check
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24295 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c index 0ce268ac30..ad3c85bee5 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c @@ -1186,7 +1186,7 @@ uint32_t ftl_erase_block(uint32_t block) #ifndef FTL_READONLY /* Allocates a block from the pool, - returning its vBlock number, or 0 on error */ + returning its vBlock number, or 0xFFFFFFFF on error */ uint32_t ftl_allocate_pool_block(void) { uint32_t i; @@ -1211,7 +1211,7 @@ uint32_t ftl_allocate_pool_block(void) } if (block > (uint32_t)(*ftl_nand_type).userblocks + 0x17) panicf("FTL: Bad block number in pool: %u", (unsigned)block); - if (ftl_erase_block(block) != 0) return 0; + if (ftl_erase_block(block) != 0) return 0xFFFFFFFF; if (++ftl_cxt.nextfreeidx == 0x14) ftl_cxt.nextfreeidx = 0; ftl_cxt.freecount--; return block; @@ -1223,7 +1223,6 @@ uint32_t ftl_allocate_pool_block(void) /* Releases a vBlock back into the pool */ void ftl_release_pool_block(uint32_t block) { - if (!block) panicf("FTL: Tried to put block 0 into the pool!"); if (block >= (uint32_t)(*ftl_nand_type).userblocks + 0x17) panicf("FTL: Tried to release block %u", (unsigned)block); uint32_t idx = ftl_cxt.nextfreeidx + ftl_cxt.freecount++; @@ -1286,7 +1285,7 @@ uint32_t ftl_next_ctrl_pool_page(void) i = (i + 1) % 3; uint32_t oldblock = ftl_cxt.ftlctrlblocks[i]; uint32_t newblock = ftl_allocate_pool_block(); - if (newblock == 0) return 1; + if (newblock == 0xFFFFFFFF) return 1; ftl_cxt.ftlctrlblocks[i] = newblock; ftl_cxt.ftlctrlpage = newblock * ppb; uint32_t pagestoread = ((*ftl_nand_type).userblocks + 23) >> 10; @@ -1402,7 +1401,7 @@ uint32_t ftl_compact_scattered(struct ftl_log_type* entry) for (i = 0; i < 4; i++) { uint32_t block = ftl_allocate_pool_block(); - if (block == 0) return 1; + if (block == 0xFFFFFFFF) return 1; (*entry).pagesused = 0; (*entry).pagescurrent = 0; (*entry).issequential = 1; @@ -1449,7 +1448,7 @@ uint32_t ftl_commit_scattered(struct ftl_log_type* entry) for (i = 0; i < 4; i++) { block = ftl_allocate_pool_block(); - if (block == 0) return 1; + if (block == 0xFFFFFFFF) return 1; error = ftl_copy_block((*entry).logicalvblock, block); if (error == 0) break; ftl_release_pool_block(block); @@ -1574,7 +1573,7 @@ struct ftl_log_type* ftl_allocate_log_entry(uint32_t block) entry = ftl_log; while ((*entry).scatteredvblock != 0xFFFF) entry = &entry[1]; (*entry).scatteredvblock = ftl_allocate_pool_block(); - if ((*entry).scatteredvblock == 0) + if ((*entry).scatteredvblock == 0xFFFFFFFF) { (*entry).scatteredvblock = 0xFFFF; return (struct ftl_log_type*)0; @@ -1731,7 +1730,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) { ftl_release_pool_block(vblock); vblock = ftl_allocate_pool_block(); - if (vblock == 0) + if (vblock == 0xFFFFFFFF) { mutex_unlock(&ftl_mtx); return 1; |