diff --git a/drivers/mtd/rammtd.c b/drivers/mtd/rammtd.c index 66c350888c4..138f249e40b 100644 --- a/drivers/mtd/rammtd.c +++ b/drivers/mtd/rammtd.c @@ -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; diff --git a/fs/spiffs/src/spiffs_check.c b/fs/spiffs/src/spiffs_check.c index b644ec9cee1..ec2d7abaf6b 100644 --- a/fs/spiffs/src/spiffs_check.c +++ b/fs/spiffs/src/spiffs_check.c @@ -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)) || diff --git a/fs/spiffs/src/spiffs_core.c b/fs/spiffs/src/spiffs_core.c index 534b347d33b..0098afcfcb2 100644 --- a/fs/spiffs/src/spiffs_core.c +++ b/fs/spiffs/src/spiffs_core.c @@ -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; } diff --git a/fs/spiffs/src/spiffs_core.h b/fs/spiffs/src/spiffs_core.h index d39a48ee176..6c639cc999d 100644 --- a/fs/spiffs/src/spiffs_core.h +++ b/fs/spiffs/src/spiffs_core.h @@ -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, diff --git a/fs/spiffs/src/spiffs_gc.c b/fs/spiffs/src/spiffs_gc.c index b9bd2a2baa3..66fbeb4efe0 100644 --- a/fs/spiffs/src/spiffs_gc.c +++ b/fs/spiffs/src/spiffs_gc.c @@ -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 */ diff --git a/fs/spiffs/src/spiffs_mtd.c b/fs/spiffs/src/spiffs_mtd.c index b200a3b6d94..6f7ce28f8b9 100644 --- a/fs/spiffs/src/spiffs_mtd.c +++ b/fs/spiffs/src/spiffs_mtd.c @@ -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; } diff --git a/fs/spiffs/src/spiffs_vfs.c b/fs/spiffs/src/spiffs_vfs.c index f346c70b84d..b2c91754ede 100644 --- a/fs/spiffs/src/spiffs_vfs.c +++ b/fs/spiffs/src/spiffs_vfs.c @@ -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; }