fs/spiffs: Fix more problems found in testing. It is getting closer but examples/fstest is still showing problem.
This commit is contained in:
parent
955527b14f
commit
6d2cce99e1
@ -190,7 +190,8 @@ static void *ram_write(FAR void *dest, FAR const void *src, size_t len)
|
||||
* Name: ram_erase
|
||||
****************************************************************************/
|
||||
|
||||
static int ram_erase(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks)
|
||||
static int ram_erase(FAR struct mtd_dev_s *dev, off_t startblock,
|
||||
size_t nblocks)
|
||||
{
|
||||
FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
|
||||
off_t offset;
|
||||
|
@ -543,7 +543,7 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs,
|
||||
ret = spiffs_objlu_find_id_and_span_byphdr(fs,
|
||||
pghdr->objid | SPIFFS_OBJID_NDXFLAG,
|
||||
0, 0, 0);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
int16_t new_pgndx;
|
||||
|
||||
@ -1229,7 +1229,7 @@ static int spiffs_check_objidconsistency_callback(FAR struct spiffs_s *fs,
|
||||
0, 0, &objhdr_pgndx);
|
||||
retc = SPIFFS_VIS_COUNTINUE_RELOAD;
|
||||
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* Found, register as reachable */
|
||||
|
||||
@ -1767,7 +1767,7 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs)
|
||||
ret = spiffs_check_get_data_pgndx(fs, pghdr.objid,
|
||||
pghdr.spndx, &rpgndx,
|
||||
&objndx_pgndx);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
if (((rpgndx == (int16_t) - 1 ||
|
||||
rpgndx > SPIFFS_GEO_PAGE_COUNT(fs)) ||
|
||||
|
@ -189,10 +189,10 @@ static int spiffs_page_index_check(FAR struct spiffs_s *fs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&ph, fobj->objid, spndx);
|
||||
ret = spiffs_validate_objndx(&ph, fobj->objid, spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
@ -418,7 +418,7 @@ spiffs_objlu_find_free_objid_compact_callback(FAR struct spiffs_s *fs,
|
||||
SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, entry),
|
||||
sizeof(struct spiffs_pgobj_ndxheader_s),
|
||||
(FAR uint8_t *)&objhdr);
|
||||
if (ret == OK && objhdr.phdr.spndx == 0 &&
|
||||
if (ret >= 0 && objhdr.phdr.spndx == 0 &&
|
||||
((objhdr.phdr.flags & (SPIFFS_PH_FLAG_INDEX |
|
||||
SPIFFS_PH_FLAG_FINAL |
|
||||
SPIFFS_PH_FLAG_DELET)) ==
|
||||
@ -451,7 +451,7 @@ spiffs_objlu_find_free_objid_compact_callback(FAR struct spiffs_s *fs,
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: spiffs_validate_objix
|
||||
* Name: spiffs_validate_objndx
|
||||
*
|
||||
* Description:
|
||||
* Returns zero (OK) if everything checks out. Otherwise, a negated errno
|
||||
@ -459,8 +459,8 @@ spiffs_objlu_find_free_objid_compact_callback(FAR struct spiffs_s *fs,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int spiffs_validate_objix(FAR struct spiffs_page_header_s *ph, int16_t objid,
|
||||
int16_t spndx)
|
||||
int spiffs_validate_objndx(FAR struct spiffs_page_header_s *ph,
|
||||
int16_t objid, int16_t spndx)
|
||||
{
|
||||
int ret = OK;
|
||||
|
||||
@ -584,7 +584,7 @@ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block,
|
||||
entry_count = SPIFFS_GEO_BLOCK_COUNT(fs) * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs);
|
||||
cur_block = starting_block;
|
||||
cur_block_addr = starting_block * SPIFFS_GEO_BLOCK_SIZE(fs);
|
||||
objlu_buf = (FAR int16_t *) fs->lu_work;
|
||||
objlu_buf = (FAR int16_t *)fs->lu_work;
|
||||
cur_entry = starting_lu_entry;
|
||||
entries_per_page = (SPIFFS_GEO_PAGE_SIZE(fs) / sizeof(int16_t));
|
||||
ret = OK;
|
||||
@ -615,13 +615,13 @@ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block,
|
||||
|
||||
/* Check each block */
|
||||
|
||||
while (ret == OK && entry_count > 0)
|
||||
while (ret >= 0 && entry_count > 0)
|
||||
{
|
||||
int obj_lookup_page = cur_entry / entries_per_page;
|
||||
|
||||
/* Check each object lookup page */
|
||||
|
||||
while (ret == OK &&
|
||||
while (ret >= 0 &&
|
||||
obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))
|
||||
{
|
||||
int entry_offset = obj_lookup_page * entries_per_page;
|
||||
@ -632,7 +632,7 @@ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block,
|
||||
|
||||
/* Check each entry */
|
||||
|
||||
while (ret == OK &&
|
||||
while (ret >= 0 &&
|
||||
cur_entry - entry_offset < entries_per_page &&
|
||||
cur_entry < (int)SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs))
|
||||
{
|
||||
@ -900,7 +900,7 @@ int spiffs_objlu_find_free(FAR struct spiffs_s *fs, int16_t starting_block,
|
||||
|
||||
ret = spiffs_objlu_find_id(fs, starting_block, starting_lu_entry,
|
||||
SPIFFS_OBJID_FREE, blkndx, lu_entry);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
fs->free_blkndx = *blkndx;
|
||||
fs->free_entry = (*lu_entry) + 1;
|
||||
@ -1442,10 +1442,10 @@ int spiffs_object_update_index_hdr(FAR struct spiffs_s *fs,
|
||||
objhdr = (FAR struct spiffs_pgobj_ndxheader_s *) fs->work;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&objhdr->phdr, objid, 0);
|
||||
ret = spiffs_validate_objndx(&objhdr->phdr, objid, 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1662,10 +1662,10 @@ int spiffs_object_open_bypage(FAR struct spiffs_s *fs, int16_t pgndx,
|
||||
fobj->objid = objid;
|
||||
fobj->flags = flags;
|
||||
|
||||
ret = spiffs_validate_objix(&objndx_hdr.phdr, fobj->objid, 0);
|
||||
ret = spiffs_validate_objndx(&objndx_hdr.phdr, fobj->objid, 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1727,7 +1727,7 @@ int spiffs_object_append(FAR struct spiffs_s *fs,
|
||||
|
||||
/* Write all data */
|
||||
|
||||
while (ret == OK && written < len)
|
||||
while (ret >= 0 && written < len)
|
||||
{
|
||||
size_t to_write;
|
||||
|
||||
@ -1875,11 +1875,11 @@ int spiffs_object_append(FAR struct spiffs_s *fs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
ret = spiffs_validate_objndx(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@ -1967,11 +1967,11 @@ int spiffs_object_append(FAR struct spiffs_s *fs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
ret = spiffs_validate_objndx(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n",
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
@ -2261,7 +2261,7 @@ int spiffs_object_modify(FAR struct spiffs_s *fs,
|
||||
|
||||
/* Write all data */
|
||||
|
||||
while (ret == OK && written < len)
|
||||
while (ret >= 0 && written < len)
|
||||
{
|
||||
size_t to_write;
|
||||
int16_t orig_data_pgndx;
|
||||
@ -2358,11 +2358,11 @@ int spiffs_object_modify(FAR struct spiffs_s *fs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
ret = spiffs_validate_objndx(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@ -2405,11 +2405,11 @@ int spiffs_object_modify(FAR struct spiffs_s *fs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
ret = spiffs_validate_objndx(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -2882,11 +2882,11 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
ret = spiffs_validate_objndx(&objhdr->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -3280,11 +3280,11 @@ ssize_t spiffs_object_read(FAR struct spiffs_s *fs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = spiffs_validate_objix(&objndx->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
ret = spiffs_validate_objndx(&objndx->phdr, fobj->objid,
|
||||
cur_objndx_spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -391,8 +391,8 @@ typedef int (*spiffs_callback_t)(FAR struct spiffs_s *fs, int16_t objid,
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
int spiffs_validate_objix(FAR struct spiffs_page_header_s *ph,
|
||||
int16_t objid, int16_t spndx);
|
||||
int spiffs_validate_objndx(FAR struct spiffs_page_header_s *ph,
|
||||
int16_t objid, int16_t spndx);
|
||||
int spiffs_phys_cpy(FAR struct spiffs_s *fs,
|
||||
int16_t objid, uint32_t dest, uint32_t src, uint32_t len);
|
||||
int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block,
|
||||
|
@ -168,7 +168,7 @@ static int spiffs_gc_epage_stats(FAR struct spiffs_s *fs, int16_t blkndx)
|
||||
|
||||
/* Check each object lookup page */
|
||||
|
||||
while (ret == OK && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))
|
||||
while (ret >= 0 && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))
|
||||
{
|
||||
int entry_offset = obj_lookup_page * entries_per_page;
|
||||
ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, 0,
|
||||
@ -178,7 +178,7 @@ static int spiffs_gc_epage_stats(FAR struct spiffs_s *fs, int16_t blkndx)
|
||||
|
||||
/* Check each entry */
|
||||
|
||||
while (ret == OK &&
|
||||
while (ret >= 0 &&
|
||||
cur_entry - entry_offset < entries_per_page &&
|
||||
cur_entry <
|
||||
(int)(SPIFFS_GEO_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)))
|
||||
@ -272,7 +272,7 @@ static int spiffs_gc_find_candidate(FAR struct spiffs_s *fs,
|
||||
|
||||
/* Check each block */
|
||||
|
||||
while (ret == OK && blocks--)
|
||||
while (ret >= 0 && blocks--)
|
||||
{
|
||||
uint16_t deleted_pages_in_block = 0;
|
||||
uint16_t used_pages_in_block = 0;
|
||||
@ -280,7 +280,7 @@ static int spiffs_gc_find_candidate(FAR struct spiffs_s *fs,
|
||||
|
||||
/* check each object lookup page */
|
||||
|
||||
while (ret == OK &&
|
||||
while (ret >= 0 &&
|
||||
obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))
|
||||
{
|
||||
int entry_offset = obj_lookup_page * entries_per_page;
|
||||
@ -291,7 +291,7 @@ static int spiffs_gc_find_candidate(FAR struct spiffs_s *fs,
|
||||
|
||||
/* Check each entry */
|
||||
|
||||
while (ret == OK &&
|
||||
while (ret >= 0 &&
|
||||
cur_entry - entry_offset < entries_per_page &&
|
||||
cur_entry <
|
||||
(int)(SPIFFS_GEO_PAGES_PER_BLOCK(fs) -
|
||||
@ -332,7 +332,7 @@ static int spiffs_gc_find_candidate(FAR struct spiffs_s *fs,
|
||||
* probably not so many blocks
|
||||
*/
|
||||
|
||||
if (ret == OK /* && deleted_pages_in_block > 0 */ )
|
||||
if (ret >= 0 /* && deleted_pages_in_block > 0 */ )
|
||||
{
|
||||
int32_t score;
|
||||
int16_t erase_count;
|
||||
@ -476,7 +476,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx)
|
||||
spiffs_gcinfo("Move free cursor to block=%0rx\n", fs->free_blkndx);
|
||||
}
|
||||
|
||||
while (ret == OK && gc.state != FINISHED)
|
||||
while (ret >= 0 && gc.state != FINISHED)
|
||||
{
|
||||
int obj_lookup_page;
|
||||
uint8_t scan;
|
||||
@ -492,7 +492,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx)
|
||||
|
||||
/* Check each object lookup page */
|
||||
|
||||
while (scan && ret == OK &&
|
||||
while (scan && ret >= 0 &&
|
||||
obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))
|
||||
{
|
||||
int entry_offset = obj_lookup_page * entries_per_page;
|
||||
@ -504,7 +504,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx)
|
||||
|
||||
/* Check each object lookup entry */
|
||||
|
||||
while (scan && ret == OK &&
|
||||
while (scan && ret >= 0 &&
|
||||
cur_entry - entry_offset < entries_per_page &&
|
||||
cur_entry <
|
||||
(int)(SPIFFS_GEO_PAGES_PER_BLOCK(fs) -
|
||||
@ -845,12 +845,12 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx)
|
||||
* index, a check must run or lot of data may be lost
|
||||
*/
|
||||
|
||||
ret = spiffs_validate_objix(&objndx->phdr,
|
||||
gc.cur_objid | SPIFFS_OBJID_NDXFLAG,
|
||||
gc.cur_objndx_spndx);
|
||||
ret = spiffs_validate_objndx(&objndx->phdr,
|
||||
gc.cur_objid | SPIFFS_OBJID_NDXFLAG,
|
||||
gc.cur_objndx_spndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret);
|
||||
ferr("ERROR: spiffs_validate_objndx() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -981,7 +981,7 @@ int spiffs_gc_quick(FAR struct spiffs_s *fs, uint16_t max_free_pages)
|
||||
|
||||
/* Find fully deleted blocks */
|
||||
|
||||
while (ret == OK && blocks--)
|
||||
while (ret >= 0 && blocks--)
|
||||
{
|
||||
uint16_t deleted_pages_in_block = 0;
|
||||
uint16_t free_pages_in_block = 0;
|
||||
@ -989,7 +989,7 @@ int spiffs_gc_quick(FAR struct spiffs_s *fs, uint16_t max_free_pages)
|
||||
|
||||
/* Check each object lookup page */
|
||||
|
||||
while (ret == OK &&
|
||||
while (ret >= 0 &&
|
||||
obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))
|
||||
{
|
||||
int entry_offset = obj_lookup_page * entries_per_page;
|
||||
@ -1001,7 +1001,7 @@ int spiffs_gc_quick(FAR struct spiffs_s *fs, uint16_t max_free_pages)
|
||||
|
||||
/* Check each entry */
|
||||
|
||||
while (ret == OK &&
|
||||
while (ret >= 0 &&
|
||||
cur_entry - entry_offset < entries_per_page &&
|
||||
cur_entry <
|
||||
(int)(SPIFFS_GEO_PAGES_PER_BLOCK(fs) -
|
||||
@ -1045,7 +1045,7 @@ int spiffs_gc_quick(FAR struct spiffs_s *fs, uint16_t max_free_pages)
|
||||
ret = OK;
|
||||
}
|
||||
|
||||
if (ret == OK &&
|
||||
if (ret >= 0 &&
|
||||
deleted_pages_in_block + free_pages_in_block ==
|
||||
SPIFFS_GEO_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs) &&
|
||||
free_pages_in_block <= max_free_pages)
|
||||
@ -1062,7 +1062,7 @@ int spiffs_gc_quick(FAR struct spiffs_s *fs, uint16_t max_free_pages)
|
||||
cur_block_addr += SPIFFS_GEO_BLOCK_SIZE(fs);
|
||||
}
|
||||
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* No deleted blocks */
|
||||
|
||||
|
@ -89,7 +89,9 @@ ssize_t spiffs_mtd_write(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
off_t blkstart;
|
||||
off_t blkend;
|
||||
|
||||
DEBUGASSERT(fs != NULL && fs->mtd != NULL && src != NULL);
|
||||
DEBUGASSERT(fs != NULL && fs->mtd != NULL && src != NULL && len > 0);
|
||||
|
||||
remaining = len;
|
||||
|
||||
#ifdef CONFIG_MTD_BYTE_WRITE
|
||||
/* Try to do the byte write */
|
||||
@ -105,14 +107,14 @@ ssize_t spiffs_mtd_write(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
* blkmask - Mask that isolates fractional block bytes.
|
||||
* blkoffset - The offset of data in the first block written
|
||||
* blkstart - Start block number (aligned down)
|
||||
* blkend - End block number (aligned up)
|
||||
* blkend - End block number (aligned down)
|
||||
*/
|
||||
|
||||
blksize = fs->geo.blocksize;
|
||||
blkmask = blksize - 1;
|
||||
blkoffset = blksize & ~blkmask;
|
||||
blkoffset = offset & blkmask;
|
||||
blkstart = offset / blksize;
|
||||
blkend = (offset + len + blkmask) / blksize;
|
||||
blkend = (offset + len) / blksize;
|
||||
|
||||
/* Check if we have to do a read-modify-write on the first block. We
|
||||
* need to do this if the blkoffset is not zero. In that case we need
|
||||
@ -159,23 +161,20 @@ ssize_t spiffs_mtd_write(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
|
||||
/* Write all intervening complete blocks... all at once */
|
||||
|
||||
nblocks = blkend - blkstart;
|
||||
|
||||
if ((remaining & blkmask) == 0)
|
||||
nblocks = blkend - blkstart + 1;
|
||||
if (nblocks > 0)
|
||||
{
|
||||
nblocks++; /* Include the final block */
|
||||
}
|
||||
ret = MTD_BWRITE(fs->mtd, blkstart, nblocks, src);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: MTD_BWRITE() failed: %d\n", ret);
|
||||
return (ssize_t)ret;
|
||||
}
|
||||
|
||||
ret = MTD_BWRITE(fs->mtd, blkstart, nblocks, src);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: MTD_BWRITE() failed: %d\n", ret);
|
||||
return (ssize_t)ret;
|
||||
src += (remaining & ~blkmask);
|
||||
remaining = (remaining & blkmask);
|
||||
}
|
||||
|
||||
src += (remaining & ~blkmask);
|
||||
remaining = (remaining & blkmask);
|
||||
|
||||
/* Check if we need to perform a read-modify-write on the final block.
|
||||
* If the remaining bytes to write is less then a full block, then we
|
||||
* need write only the data at the beginning of the block.
|
||||
@ -183,6 +182,10 @@ ssize_t spiffs_mtd_write(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
|
||||
if (remaining > 0)
|
||||
{
|
||||
/* The real end block is the next block */
|
||||
|
||||
blkend++;
|
||||
|
||||
#warning "REVISIT: is fs->work available here?"
|
||||
ret = MTD_BREAD(fs->mtd, blkend, 1, fs->work);
|
||||
if (ret < 0)
|
||||
@ -239,7 +242,9 @@ ssize_t spiffs_mtd_read(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
off_t blkstart;
|
||||
off_t blkend;
|
||||
|
||||
DEBUGASSERT(fs != NULL && fs->mtd != NULL && dest != NULL);
|
||||
DEBUGASSERT(fs != NULL && fs->mtd != NULL && dest != NULL && len > 0);
|
||||
|
||||
remaining = len;
|
||||
|
||||
/* Try to do the byte read */
|
||||
|
||||
@ -253,14 +258,14 @@ ssize_t spiffs_mtd_read(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
* blkmask - Mask that isolates fractional block bytes.
|
||||
* blkoffset - The offset of data in the first block read.
|
||||
* blkstart - Start block number (aligned down)
|
||||
* blkend - End block number (aligned up)
|
||||
* blkend - End block number (aligned down)
|
||||
*/
|
||||
|
||||
blksize = fs->geo.blocksize;
|
||||
blkmask = blksize - 1;
|
||||
blkoffset = blksize & ~blkmask;
|
||||
blkoffset = offset & blkmask;
|
||||
blkstart = offset / blksize;
|
||||
blkend = (offset + len + blkmask) / blksize;
|
||||
blkend = (offset + len) / blksize;
|
||||
|
||||
/* Check if we have to do a partial read on the first block. We
|
||||
* need to do this if the blkoffset is not zero. In that case we need
|
||||
@ -298,23 +303,20 @@ ssize_t spiffs_mtd_read(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
|
||||
/* Read all intervening complete blocks... all at once */
|
||||
|
||||
nblocks = blkend - blkstart;
|
||||
|
||||
if ((remaining & blkmask) == 0)
|
||||
nblocks = blkend - blkstart + 1;
|
||||
if (nblocks > 0)
|
||||
{
|
||||
nblocks++; /* Include the final block */
|
||||
}
|
||||
ret = MTD_BREAD(fs->mtd, blkstart, nblocks, dest);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: MTD_BREAD() failed: %d\n", ret);
|
||||
return (ssize_t)ret;
|
||||
}
|
||||
|
||||
ret = MTD_BREAD(fs->mtd, blkstart, nblocks, dest);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: MTD_BREAD() failed: %d\n", ret);
|
||||
return (ssize_t)ret;
|
||||
dest += (remaining & ~blkmask);
|
||||
remaining = (remaining & blkmask);
|
||||
}
|
||||
|
||||
dest += (remaining & ~blkmask);
|
||||
remaining = (remaining & blkmask);
|
||||
|
||||
/* Check if we need to perform a partial read on the final block.
|
||||
* If the remaining bytes to write is less then a full block, then we
|
||||
* need write only the data at the beginning of the block.
|
||||
@ -323,7 +325,7 @@ ssize_t spiffs_mtd_read(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
if (remaining > 0)
|
||||
{
|
||||
#warning "REVISIT: is fs->work available here?"
|
||||
ret = MTD_BREAD(fs->mtd, blkend, 1, fs->work);
|
||||
ret = MTD_BREAD(fs->mtd, blkend + 1, 1, fs->work);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: MTD_BREAD() failed: %d\n", ret);
|
||||
@ -347,7 +349,7 @@ ssize_t spiffs_mtd_read(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
*
|
||||
* Input Parameters:
|
||||
* fs - A reference to the volume structure
|
||||
* offset - The physical offset to begin erasing
|
||||
* offset - The byte offset to begin erasing
|
||||
* len - The number of bytes to erase
|
||||
*
|
||||
* Returned Value:
|
||||
@ -358,20 +360,35 @@ ssize_t spiffs_mtd_read(FAR struct spiffs_s *fs, off_t offset, size_t len,
|
||||
|
||||
ssize_t spiffs_mtd_erase(FAR struct spiffs_s *fs, off_t offset, size_t len)
|
||||
{
|
||||
int16_t blksize;
|
||||
off_t blkstart;
|
||||
off_t blkend;
|
||||
int16_t erasesize;
|
||||
off_t eblkstart;
|
||||
off_t eblkend;
|
||||
ssize_t nerased;
|
||||
|
||||
DEBUGASSERT(fs != NULL && fs->mtd != NULL);
|
||||
|
||||
#warning REVISIT: What are units of offset and len?
|
||||
/* We will have to do block read(s)
|
||||
*
|
||||
* erasesize - Size of one erase block.
|
||||
* eblkstart - Start erase block number (aligned down)
|
||||
* eblkend - End block number (aligned down)
|
||||
*/
|
||||
|
||||
blksize = fs->geo.erasesize;
|
||||
DEBUGASSERT(offset = offset % blksize);
|
||||
DEBUGASSERT(len = len % blksize);
|
||||
erasesize = fs->geo.erasesize;
|
||||
eblkstart = offset / erasesize;
|
||||
eblkend = (offset + len) / erasesize;
|
||||
|
||||
blkstart = offset / blksize; /* Truncates to floor */
|
||||
blkend = (offset + len + blksize - 1) / blksize; /* Rounds up to ceil */
|
||||
/* Must be even multiples of the erase block size */
|
||||
|
||||
return MTD_ERASE(fs->mtd, blkstart, blkend - blkstart);
|
||||
DEBUGASSERT(offset == erasesize * eblkstart);
|
||||
DEBUGASSERT(len == erasesize * eblkend - offset);
|
||||
|
||||
nerased = MTD_ERASE(fs->mtd, eblkstart, eblkend - eblkstart);
|
||||
if (nerased < 0)
|
||||
{
|
||||
ferr("ERROR: MTD_ERASE() failed: %d\n");
|
||||
return nerased;
|
||||
}
|
||||
|
||||
return erasesize * nerased;
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ static void spiffs_lock_reentrant(FAR struct spiffs_sem_s *rsem)
|
||||
* was awakened by a signal.
|
||||
*/
|
||||
|
||||
DEBUGASSERT(ret == OK || ret == -EINTR);
|
||||
DEBUGASSERT(ret >= 0 || ret == -EINTR);
|
||||
}
|
||||
while (ret == -EINTR);
|
||||
|
||||
@ -245,7 +245,7 @@ static int spiffs_consistency_check(FAR struct spiffs_s *fs)
|
||||
if (status < 0)
|
||||
{
|
||||
fwarn("WARNING spiffs_check_luconsistency failed: %d\n", status);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
ret = status;
|
||||
}
|
||||
@ -255,7 +255,7 @@ static int spiffs_consistency_check(FAR struct spiffs_s *fs)
|
||||
if (status < 0)
|
||||
{
|
||||
fwarn("WARNING spiffs_check_objidconsistency failed: %d\n", status);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
ret = status;
|
||||
}
|
||||
@ -265,7 +265,7 @@ static int spiffs_consistency_check(FAR struct spiffs_s *fs)
|
||||
if (status < 0)
|
||||
{
|
||||
fwarn("WARNING spiffs_check_pgconsistency failed: %d\n", status);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
ret = status;
|
||||
}
|
||||
@ -275,7 +275,7 @@ static int spiffs_consistency_check(FAR struct spiffs_s *fs)
|
||||
if (status < 0)
|
||||
{
|
||||
fwarn("WARNING spiffs_objlu_scan failed: %d\n", status);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
ret = status;
|
||||
}
|
||||
@ -378,6 +378,7 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath,
|
||||
fobj = (FAR struct spiffs_file_s *)kmm_zalloc(sizeof(struct spiffs_file_s));
|
||||
if (fobj == NULL)
|
||||
{
|
||||
ferr("ERROR: Failed to allocate fail object\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -389,19 +390,19 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath,
|
||||
|
||||
/* Check of the file object already exists */
|
||||
|
||||
ret = spiffs_find_objhdr_pgndx(fs,
|
||||
(FAR const uint8_t *)relpath,
|
||||
&pgndx);
|
||||
ret = spiffs_find_objhdr_pgndx(fs, (FAR const uint8_t *)relpath, &pgndx);
|
||||
if (ret < 0 && (oflags & O_CREAT) == 0)
|
||||
{
|
||||
/* It does not exist and we were not asked to create it */
|
||||
|
||||
fwarn("WARNING: File does not exist a O_CREAT not set\n");
|
||||
goto errout_with_fileobject;
|
||||
}
|
||||
else if (ret == OK && (oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
|
||||
else if (ret >= 0 && (oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
|
||||
{
|
||||
/* O_CREAT and O_EXCL and file exists - fail */
|
||||
|
||||
fwarn("WARNING: File exists and O_CREAT|O_EXCL is selected\n");
|
||||
ret = -EEXIST;
|
||||
goto errout_with_fileobject;
|
||||
}
|
||||
@ -414,6 +415,7 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath,
|
||||
ret = spiffs_objlu_find_free_objid(fs, &objid, 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_objlu_find_free_objid() failed: %d\n", ret);
|
||||
goto errout_with_fileobject;
|
||||
}
|
||||
|
||||
@ -421,6 +423,7 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath,
|
||||
DTYPE_FILE, &pgndx);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_object_create() failed: %d\n", ret);
|
||||
goto errout_with_fileobject;
|
||||
}
|
||||
|
||||
@ -430,6 +433,7 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath,
|
||||
}
|
||||
else if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_find_objhdr_pgndx() failed: %d\n", ret);
|
||||
goto errout_with_fileobject;
|
||||
}
|
||||
|
||||
@ -438,6 +442,7 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath,
|
||||
ret = spiffs_object_open_bypage(fs, pgndx, fobj, oflags, mode);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_object_open_bypage() failed: %d\n", ret);
|
||||
goto errout_with_fileobject;
|
||||
}
|
||||
|
||||
@ -448,6 +453,7 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath,
|
||||
ret = spiffs_object_truncate(fs, fobj, 0, false);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: spiffs_object_truncate() failed: %d\n", ret);
|
||||
goto errout_with_fileobject;
|
||||
}
|
||||
}
|
||||
@ -1242,7 +1248,7 @@ static int spiffs_readdir(FAR struct inode *mountpt,
|
||||
ret = spiffs_foreach_objlu(fs, dir->u.spiffs.block, dir->u.spiffs.entry,
|
||||
SPIFFS_VIS_NO_WRAP, 0, spiffs_readdir_callback,
|
||||
NULL, dir, &blkndx, &entry);
|
||||
if (ret == OK)
|
||||
if (ret >= 0)
|
||||
{
|
||||
dir->u.spiffs.block = blkndx;
|
||||
dir->u.spiffs.entry = entry + 1;
|
||||
@ -1725,7 +1731,7 @@ static int spiffs_rename(FAR struct inode *mountpt, FAR const char *oldrelpath,
|
||||
{
|
||||
ret = OK;
|
||||
}
|
||||
else if (ret == OK)
|
||||
else if (ret >= 0)
|
||||
{
|
||||
ret = -EEXIST;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user