diff --git a/fs/spiffs/src/spiffs.h b/fs/spiffs/src/spiffs.h index d5b2de43a1..ef6896c872 100644 --- a/fs/spiffs/src/spiffs.h +++ b/fs/spiffs/src/spiffs.h @@ -77,7 +77,6 @@ extern "C" #define SPIFFS_ERR_INDEX_FREE -10018 #define SPIFFS_ERR_INDEX_LU -10019 #define SPIFFS_ERR_INDEX_INVALID -10020 -#define SPIFFS_ERR_INTERNAL -10050 /* Flags on open file/directory options */ diff --git a/fs/spiffs/src/spiffs_check.c b/fs/spiffs/src/spiffs_check.c index 755706d08f..b40016d89b 100644 --- a/fs/spiffs/src/spiffs_check.c +++ b/fs/spiffs/src/spiffs_check.c @@ -109,11 +109,11 @@ static int spiffs_check_get_data_pgndx(FAR struct spiffs_s *fs, /* Find the object index for the object ID and span index */ - ret = spiffs_obj_lu_find_id_and_span(fs, objid | SPIFFS_OBJ_ID_IX_FLAG, - objndx_spndx, 0, objndx_pgndx); + ret = spiffs_objlu_find_id_and_span(fs, objid | SPIFFS_OBJ_ID_IX_FLAG, + objndx_spndx, 0, objndx_pgndx); if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -124,14 +124,14 @@ static int spiffs_check_get_data_pgndx(FAR struct spiffs_s *fs, { /* Get the referenced page from object index header */ - addr += sizeof(struct spiffs_pgobj_ixheader_s) + + addr += sizeof(struct spiffs_pgobj_ndxheader_s) + data_spndx * sizeof(int16_t); } else { /* Get the referenced page from object index */ - addr += sizeof(spiffs_page_object_ix) + + addr += sizeof(struct spiffs_page_objndx_s) + SPIFFS_OBJ_IX_ENTRY(fs, data_spndx) * sizeof(int16_t); } @@ -230,11 +230,11 @@ static int spiffs_check_rewrite_index(FAR struct spiffs_s *fs, /* Find free entry */ - ret = spiffs_obj_lu_find_free(fs, fs->free_blkndx, - fs->free_entry, &blkndx, &entry); + ret = spiffs_objlu_find_free(fs, fs->free_blkndx, + fs->free_entry, &blkndx, &entry); if (ret < 0) { - fwarn("WARNING: spiffs_obj_lu_find_free() failed: %d\n", ret); + fwarn("WARNING: spiffs_objlu_find_free() failed: %d\n", ret); return ret; } @@ -299,13 +299,13 @@ static int spiffs_check_rewrite_index(FAR struct spiffs_s *fs, if (objndx_spndx == 0) { ((FAR int16_t *)((FAR uint8_t *)fs->lu_work + - sizeof(struct spiffs_pgobj_ixheader_s)))[data_spndx] = + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx] = new_data_pgndx; } else { ((FAR int16_t *)((FAR uint8_t *)fs->lu_work + - sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = + sizeof(struct spiffs_page_objndx_s)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = new_data_pgndx; } @@ -360,14 +360,14 @@ static int spiffs_check_delobj_lazy(FAR struct spiffs_s *fs, int16_t objid) uint8_t flags = 0xff; int ret; - ret = spiffs_obj_lu_find_id_and_span(fs, objid, 0, 0, &objhdr_pgndx); + ret = spiffs_objlu_find_id_and_span(fs, objid, 0, 0, &objhdr_pgndx); if (ret == -ENOENT) { return OK; } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -531,18 +531,18 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, * with same objid and span index is found */ - ret = spiffs_obj_lu_find_id_and_span(fs, - pghdr->objid | SPIFFS_OBJ_ID_IX_FLAG, - pghdr->spndx, cur_pgndx, 0); + ret = spiffs_objlu_find_id_and_span(fs, + pghdr->objid | SPIFFS_OBJ_ID_IX_FLAG, + pghdr->spndx, cur_pgndx, 0); if (ret == -ENOENT) { /* No such index page found, check for a data page amongst page * headers. lu cannot be trusted */ - ret = spiffs_obj_lu_find_id_and_span_byphdr(fs, - pghdr->objid | SPIFFS_OBJ_ID_IX_FLAG, - 0, 0, 0); + ret = spiffs_objlu_find_id_and_span_byphdr(fs, + pghdr->objid | SPIFFS_OBJ_ID_IX_FLAG, + 0, 0, 0); if (ret == OK) { int16_t new_pgndx; @@ -568,7 +568,7 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span_byphdr() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span_byphdr() failed: %d\n", ret); return ret; } } @@ -675,10 +675,10 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, * and span index */ - ret = spiffs_obj_lu_find_id_and_span(fs, - lu_objid | SPIFFS_OBJ_ID_IX_FLAG, - pghdr->spndx, 0, - &objndx_pgndx_lu); + ret = spiffs_objlu_find_id_and_span(fs, + lu_objid | SPIFFS_OBJ_ID_IX_FLAG, + pghdr->spndx, 0, + &objndx_pgndx_lu); if (ret == -ENOENT) { ret = OK; @@ -686,7 +686,7 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -694,10 +694,10 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, * span index */ - ret = spiffs_obj_lu_find_id_and_span(fs, - pghdr->objid | SPIFFS_OBJ_ID_IX_FLAG, - pghdr->spndx, 0, - &objndx_pgndx_ph); + ret = spiffs_objlu_find_id_and_span(fs, + pghdr->objid | SPIFFS_OBJ_ID_IX_FLAG, + pghdr->spndx, 0, + &objndx_pgndx_ph); if (ret == -ENOENT) { ret = OK; @@ -705,7 +705,7 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -724,9 +724,9 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, * span index */ - ret = spiffs_obj_lu_find_id_and_span(fs, - lu_objid & ~SPIFFS_OBJ_ID_IX_FLAG, - 0, 0, &data_pgndx_lu); + ret = spiffs_objlu_find_id_and_span(fs, + lu_objid & ~SPIFFS_OBJ_ID_IX_FLAG, + 0, 0, &data_pgndx_lu); if (ret == -ENOENT) { ret = OK; @@ -734,7 +734,7 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -742,9 +742,9 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, * and span index */ - ret = spiffs_obj_lu_find_id_and_span(fs, - pghdr->objid & ~SPIFFS_OBJ_ID_IX_FLAG, - 0, 0, &data_pgndx_ph); + ret = spiffs_objlu_find_id_and_span(fs, + pghdr->objid & ~SPIFFS_OBJ_ID_IX_FLAG, + 0, 0, &data_pgndx_ph); if (ret == -ENOENT) { ret = OK; @@ -752,7 +752,7 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -823,9 +823,9 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, /* see if other data page exists for given objid and span index */ - ret = spiffs_obj_lu_find_id_and_span(fs, - lu_objid & ~SPIFFS_OBJ_ID_IX_FLAG, - pghdr->spndx, cur_pgndx, &data_pgndx); + ret = spiffs_objlu_find_id_and_span(fs, + lu_objid & ~SPIFFS_OBJ_ID_IX_FLAG, + pghdr->spndx, cur_pgndx, &data_pgndx); if (ret == -ENOENT) { ret = OK; @@ -833,16 +833,16 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } /* See if other object index exists for given objid and span index */ - ret = spiffs_obj_lu_find_id_and_span(fs, - lu_objid | SPIFFS_OBJ_ID_IX_FLAG, - pghdr->spndx, cur_pgndx, - &objndx_pgndx_d); + ret = spiffs_objlu_find_id_and_span(fs, + lu_objid | SPIFFS_OBJ_ID_IX_FLAG, + pghdr->spndx, cur_pgndx, + &objndx_pgndx_d); if (ret == -ENOENT) { ret = OK; @@ -850,7 +850,7 @@ static int spiffs_check_luentry_validate(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -1225,8 +1225,8 @@ static int spiffs_check_objidconsistency_callback(FAR struct spiffs_s *fs, /* Not in temporary index, try finding it */ - ret = spiffs_obj_lu_find_id_and_span(fs, objid | SPIFFS_OBJ_ID_IX_FLAG, - 0, 0, &objhdr_pgndx); + ret = spiffs_objlu_find_id_and_span(fs, objid | SPIFFS_OBJ_ID_IX_FLAG, + 0, 0, &objhdr_pgndx); retc = SPIFFS_VIS_COUNTINUE_RELOAD; if (ret == OK) @@ -1244,7 +1244,7 @@ static int spiffs_check_objidconsistency_callback(FAR struct spiffs_s *fs, } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -1448,7 +1448,7 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) data_spndx_offset = 0; object_page_index = (FAR int16_t *)((FAR uint8_t *)fs->lu_work + - sizeof(struct spiffs_pgobj_ixheader_s)); + sizeof(struct spiffs_pgobj_ndxheader_s)); } else { @@ -1459,7 +1459,7 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) SPIFFS_OBJ_IX_LEN(fs) * (pghdr.spndx - 1); object_page_index = (FAR int16_t *)((FAR uint8_t *) fs->lu_work + - sizeof(spiffs_page_object_ix)); + sizeof(struct spiffs_page_objndx_s)); } /* For all entries in index */ @@ -1485,10 +1485,11 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) /* Check for data page elsewhere */ - ret = spiffs_obj_lu_find_id_and_span(fs, - objndx_phdr->objid & ~SPIFFS_OBJ_ID_IX_FLAG, - data_spndx_offset + i, - 0, &data_pgndx); + ret = spiffs_objlu_find_id_and_span(fs, + objndx_phdr->objid & + ~SPIFFS_OBJ_ID_IX_FLAG, + data_spndx_offset + i, + 0, &data_pgndx); if (ret == -ENOENT) { ret = OK; @@ -1496,7 +1497,7 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -1561,12 +1562,12 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) { /* Valid reference. read referenced page header */ - struct spiffs_page_header_s rp_hdr; + struct spiffs_page_header_s rphdr; ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, rpgndx), sizeof(struct spiffs_page_header_s), - (FAR uint8_t *)&rp_hdr); + (FAR uint8_t *)&rphdr); if (ret < 0) { ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); @@ -1575,9 +1576,9 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) /* Cross reference page header check */ - if (rp_hdr.objid != (pghdr.objid & ~SPIFFS_OBJ_ID_IX_FLAG) || - rp_hdr.spndx != data_spndx_offset + i || - (rp_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_INDEX | + if (rphdr.objid != (pghdr.objid & ~SPIFFS_OBJ_ID_IX_FLAG) || + rphdr.spndx != data_spndx_offset + i || + (rphdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED)) != (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_INDEX)) { @@ -1588,15 +1589,16 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) rpgndx, pghdr.objid & ~SPIFFS_OBJ_ID_IX_FLAG, data_spndx_offset + i, - rp_hdr.objid, rp_hdr.spndx, - rp_hdr.flags); + rphdr.objid, rphdr.spndx, + rphdr.flags); /* Try finding correct page */ - ret = spiffs_obj_lu_find_id_and_span(fs, - pghdr.objid & ~SPIFFS_OBJ_ID_IX_FLAG, - data_spndx_offset + i, rpgndx, - &data_pgndx); + ret = spiffs_objlu_find_id_and_span(fs, + pghdr.objid & + ~SPIFFS_OBJ_ID_IX_FLAG, + data_spndx_offset + i, rpgndx, + &data_pgndx); if (ret == -ENOENT) { ret = OK; @@ -1604,7 +1606,7 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) } else if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_find_id_and_span() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", ret); return ret; } @@ -1783,7 +1785,7 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) } else { - struct spiffs_page_header_s rp_hdr; + struct spiffs_page_header_s rphdr; /* Pointing to something else, check what */ @@ -1792,7 +1794,7 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) 0, SPIFFS_PAGE_TO_PADDR(fs, rpgndx), sizeof(struct spiffs_page_header_s), - (FAR uint8_t *)&rp_hdr); + (FAR uint8_t *)&rphdr); if (ret < 0) { ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); @@ -1800,8 +1802,8 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) } if (((pghdr.objid & ~SPIFFS_OBJ_ID_IX_FLAG) == - rp_hdr.objid) && - ((rp_hdr.flags & (SPIFFS_PH_FLAG_INDEX | + rphdr.objid) && + ((rphdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL)) == @@ -1828,13 +1830,13 @@ int spiffs_check_pgconsistency(FAR struct spiffs_s *fs) ("PA: corresponding ref is weird: " "%04x %s%s%s%s, rewrite this " "%04x\n", rpgndx, - (rp_hdr.flags & SPIFFS_PH_FLAG_INDEX) ? "" : + (rphdr.flags & SPIFFS_PH_FLAG_INDEX) ? "" : "INDEX ", - (rp_hdr.flags & SPIFFS_PH_FLAG_DELET) ? "" : + (rphdr.flags & SPIFFS_PH_FLAG_DELET) ? "" : "DELETED ", - (rp_hdr.flags & SPIFFS_PH_FLAG_USED) ? + (rphdr.flags & SPIFFS_PH_FLAG_USED) ? "NOTUSED " : "", - (rp_hdr.flags & SPIFFS_PH_FLAG_FINAL) ? + (rphdr.flags & SPIFFS_PH_FLAG_FINAL) ? "NOTFINAL " : "", cur_pgndx); rewrite_ndx_to_this = true; diff --git a/fs/spiffs/src/spiffs_core.c b/fs/spiffs/src/spiffs_core.c index 0c68e59336..c4ef27a982 100644 --- a/fs/spiffs/src/spiffs_core.c +++ b/fs/spiffs/src/spiffs_core.c @@ -82,37 +82,63 @@ static int spiffs_page_data_check(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, int16_t pgndx, int16_t spndx) { +#ifdef CONFIG_SPIFFS_PAGE_CHECK + struct spiffs_page_header_s ph; +#endif int ret = OK; - if (pgndx == (int16_t) - 1) + if (pgndx == (int16_t)-1) { - /* referring to page 0xffff...., bad object index */ + /* Referring to page 0xffff...., bad object index */ return SPIFFS_ERR_INDEX_REF_FREE; } if (pgndx % SPIFFS_PAGES_PER_BLOCK(fs) < SPIFFS_OBJ_LOOKUP_PAGES(fs)) { - /* referring to an object lookup page, bad object index */ + /* Referring to an object lookup page, bad object index */ return SPIFFS_ERR_INDEX_REF_LU; } if (pgndx > SPIFFS_MAX_PAGES(fs)) { - /* referring to a bad page */ + /* Referring to a bad page */ return SPIFFS_ERR_INDEX_REF_INVALID; } #ifdef CONFIG_SPIFFS_PAGE_CHECK - struct spiffs_page_header_s ph; ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - sizeof(struct spiffs_page_header_s), (uint8_t *) & ph); - SPIFFS_CHECK_RES(ret); - SPIFFS_VALIDATE_DATA(ph, fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, spndx); + fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), + sizeof(struct spiffs_page_header_s), + (FAR uint8_t *)&ph); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + } + else if ((ph.flags & SPIFFS_PH_FLAG_USED) != 0) + { + ret = SPIFFS_ERR_IS_FREE; + } + else if ((ph.flags & SPIFFS_PH_FLAG_DELET) == 0) + { + ret = SPIFFS_ERR_DELETED; + } + else if ((ph.flags & SPIFFS_PH_FLAG_FINAL) != 0) + { + ret = SPIFFS_ERR_NOT_FINALIZED; + } + else if ((ph.flags & SPIFFS_PH_FLAG_INDEX) == 0) + { + ret = SPIFFS_ERR_IS_INDEX; + } + else if (ph.spndx != (spndx)) + { + ret = SPIFFS_ERR_DATA_SPAN_MISMATCH; + } #endif + return ret; } @@ -127,60 +153,70 @@ static int spiffs_page_index_check(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, int16_t pgndx, int16_t spndx) { - int ret = OK; +#ifdef CONFIG_SPIFFS_PAGE_CHECK + struct spiffs_page_header_s ph; + int ret; +#endif if (pgndx == (int16_t) - 1) { - /* referring to page 0xffff...., bad object index */ + /* Referring to page 0xffff...., bad object index */ return SPIFFS_ERR_INDEX_FREE; } if (pgndx % SPIFFS_PAGES_PER_BLOCK(fs) < SPIFFS_OBJ_LOOKUP_PAGES(fs)) { - /* referring to an object lookup page, bad object index */ + /* Referring to an object lookup page, bad object index */ return SPIFFS_ERR_INDEX_LU; } if (pgndx > SPIFFS_MAX_PAGES(fs)) { - /* referring to a bad page */ + /* Referring to a bad page */ return SPIFFS_ERR_INDEX_INVALID; } #ifdef CONFIG_SPIFFS_PAGE_CHECK - struct spiffs_page_header_s ph; ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), sizeof(struct spiffs_page_header_s), (uint8_t *) & ph); - SPIFFS_CHECK_RES(ret); - SPIFFS_VALIDATE_OBJIX(ph, fobj->objid, spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + ret = spiffs_validate_objix(&ph, fobj->objid, spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; + } #endif - return ret; + return OK; } /**************************************************************************** - * Name: spiffs_obj_lu_scan_v + * Name: spiffs_objlu_scan_callback * * Description: * ****************************************************************************/ -static int spiffs_obj_lu_scan_v(FAR struct spiffs_s *fs, - int16_t objid, - int16_t blkndx, - int ix_entry, - FAR const void *user_const, - FAR void *user_var) +static int spiffs_objlu_scan_callback(FAR struct spiffs_s *fs, int16_t objid, + int16_t blkndx, int entry, + FAR const void *user_const, + FAR void *user_var) { if (objid == SPIFFS_OBJ_ID_FREE) { - if (ix_entry == 0) + if (entry == 0) { - /* todo optimize further, return SPIFFS_NEXT_BLOCK */ + /* TODO: Optimize further, return SPIFFS_NEXT_BLOCK */ fs->free_blocks++; } @@ -198,37 +234,39 @@ static int spiffs_obj_lu_scan_v(FAR struct spiffs_s *fs, } /**************************************************************************** - * Name: spiffs_obj_lu_find_id_and_span_v + * Name: spiffs_objlu_find_id_and_span_callback * * Description: * ****************************************************************************/ -static int spiffs_obj_lu_find_id_and_span_v(FAR struct spiffs_s *fs, - int16_t objid, - int16_t blkndx, - int ix_entry, - FAR const void *user_const, - FAR void *user_var) +static int spiffs_objlu_find_id_and_span_callback(FAR struct spiffs_s *fs, + int16_t objid, int16_t blkndx, + int entry, + FAR const void *user_const, + FAR void *user_var) { struct spiffs_page_header_s ph; - int16_t pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, ix_entry); + int16_t pgndx; int ret; + pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); + ret = spiffs_cache_read(fs, 0, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, SPIFFS_PAGE_TO_PADDR(fs, pgndx), sizeof(struct spiffs_page_header_s), (uint8_t *) & ph); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } - SPIFFS_CHECK_RES(ret); - - if (ph.objid == objid && - ph.spndx == *((int16_t *) user_var) && - (ph. - flags & (SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | - SPIFFS_PH_FLAG_USED)) == SPIFFS_PH_FLAG_DELET && - !((objid & SPIFFS_OBJ_ID_IX_FLAG) && + if (ph.objid == objid && ph.spndx == *((FAR int16_t *)user_var) && + (ph.flags & (SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | + SPIFFS_PH_FLAG_USED)) == SPIFFS_PH_FLAG_DELET && + !((objid & SPIFFS_OBJ_ID_IX_FLAG) != 0 && (ph.flags & SPIFFS_PH_FLAG_IXDELE) == 0 && ph.spndx == 0) && - (user_const == 0 || *((const int16_t *)user_const) != pgndx)) + (user_const == NULL || *((FAR const int16_t *)user_const) != pgndx)) { return OK; } @@ -246,12 +284,12 @@ static int spiffs_obj_lu_find_id_and_span_v(FAR struct spiffs_s *fs, ****************************************************************************/ static int spiffs_find_objhdr_pgndx_callback(FAR struct spiffs_s *fs, int16_t objid, - int16_t blkndx, int ix_entry, - FAR const void *user_const, - FAR void *user_var) + int16_t blkndx, int entry, + FAR const void *user_const, + FAR void *user_var) { - struct spiffs_pgobj_ixheader_s objhdr; - int16_t pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, ix_entry); + struct spiffs_pgobj_ndxheader_s objhdr; + int16_t pgndx; int ret; if (objid == SPIFFS_OBJ_ID_FREE || objid == SPIFFS_OBJ_ID_DELETED || @@ -260,17 +298,24 @@ static int spiffs_find_objhdr_pgndx_callback(FAR struct spiffs_s *fs, int16_t ob return SPIFFS_VIS_COUNTINUE; } + pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - sizeof(struct spiffs_pgobj_ixheader_s), (uint8_t *) & objhdr); - SPIFFS_CHECK_RES(ret); - if (objhdr.p_hdr.spndx == 0 && - (objhdr.p_hdr. - flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | - SPIFFS_PH_FLAG_IXDELE)) == + 0, SPIFFS_PAGE_TO_PADDR(fs, pgndx), + sizeof(struct spiffs_pgobj_ndxheader_s), + (FAR uint8_t *)&objhdr); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + if (objhdr.phdr.spndx == 0 && + (objhdr.phdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | + SPIFFS_PH_FLAG_IXDELE)) == (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) { - if (strcmp((const char *)user_const, (char *)objhdr.name) == 0) + if (strcmp((FAR const char *)user_const, (FAR char *)objhdr.name) == 0) { return OK; } @@ -280,59 +325,67 @@ static int spiffs_find_objhdr_pgndx_callback(FAR struct spiffs_s *fs, int16_t ob } /**************************************************************************** - * Name: spiffs_obj_lu_find_free_objid_bitmap_v + * Name: spiffs_objlu_find_free_objid_bitmap_callback * * Description: * ****************************************************************************/ -static int spiffs_obj_lu_find_free_objid_bitmap_v(FAR struct spiffs_s *fs, - int16_t objid, - int16_t blkndx, - int ix_entry, - FAR const void *user_const, - FAR void *user_var) +static int + spiffs_objlu_find_free_objid_bitmap_callback(FAR struct spiffs_s *fs, + int16_t objid, int16_t blkndx, + int entry, + FAR const void *user_const, + FAR void *user_var) { if (objid != SPIFFS_OBJ_ID_FREE && objid != SPIFFS_OBJ_ID_DELETED) { - int16_t min_objid = *((int16_t *) user_var); - const uint8_t *conflicting_name = (const uint8_t *)user_const; + int16_t min_objid = *((FAR int16_t *)user_var); + FAR const uint8_t *conflicting_name = (FAR const uint8_t *)user_const; + uint32_t bitndx; + int bytendx; - /* if conflicting name parameter is given, also check if this name is - * found in object index hdrs + /* If conflicting name parameter is given, also check if this name is + * found in object index headers */ - if (conflicting_name && (objid & SPIFFS_OBJ_ID_IX_FLAG)) + if (conflicting_name != NULL && (objid & SPIFFS_OBJ_ID_IX_FLAG) != 0) { - int16_t pgndx = - SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, ix_entry); + struct spiffs_pgobj_ndxheader_s objhdr; + int16_t pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); int ret; - struct spiffs_pgobj_ixheader_s objhdr; + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - sizeof(struct spiffs_pgobj_ixheader_s), - (uint8_t *) & objhdr); - SPIFFS_CHECK_RES(ret); - if (objhdr.p_hdr.spndx == 0 && - (objhdr.p_hdr. - flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | - SPIFFS_PH_FLAG_IXDELE)) == + 0, SPIFFS_PAGE_TO_PADDR(fs, pgndx), + sizeof(struct spiffs_pgobj_ndxheader_s), + (FAR uint8_t *)&objhdr); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + if (objhdr.phdr.spndx == 0 && + (objhdr.phdr.flags & (SPIFFS_PH_FLAG_DELET | + SPIFFS_PH_FLAG_FINAL | + SPIFFS_PH_FLAG_IXDELE)) == (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) { - if (strcmp((const char *)user_const, (char *)objhdr.name) == - 0) + if (strcmp((FAR const char *)user_const, + (FAR char *)objhdr.name) == 0) { return -EEXIST; } } } - objid &= ~SPIFFS_OBJ_ID_IX_FLAG; - uint32_t bit_ix = (objid - min_objid) & 7; - int byte_ix = (objid - min_objid) >> 3; - if (byte_ix >= 0 && (uint32_t) byte_ix < SPIFFS_CFG_LOG_PAGE_SZ(fs)) + objid &= ~SPIFFS_OBJ_ID_IX_FLAG; + bitndx = (objid - min_objid) & 7; + bytendx = (objid - min_objid) >> 3; + + if (bytendx >= 0 && (uint32_t)bytendx < SPIFFS_CFG_LOG_PAGE_SZ(fs)) { - fs->work[byte_ix] |= (1 << bit_ix); + fs->work[bytendx] |= (1 << bitndx); } } @@ -340,40 +393,42 @@ static int spiffs_obj_lu_find_free_objid_bitmap_v(FAR struct spiffs_s *fs, } /**************************************************************************** - * Name: spiffs_obj_lu_find_free_objid_compact_v + * Name: spiffs_objlu_find_free_objid_compact_callback * * Description: * ****************************************************************************/ -static int spiffs_obj_lu_find_free_objid_compact_v(FAR struct spiffs_s *fs, - int16_t objid, - int16_t blkndx, - int ix_entry, - FAR const void *user_const, - FAR void *user_var) +static int +spiffs_objlu_find_free_objid_compact_callback(FAR struct spiffs_s *fs, + int16_t objid, int16_t blkndx, + int entry, + FAR const void *user_const, + FAR void *user_var) { if (objid != SPIFFS_OBJ_ID_FREE && objid != SPIFFS_OBJ_ID_DELETED && - (objid & SPIFFS_OBJ_ID_IX_FLAG)) + (objid & SPIFFS_OBJ_ID_IX_FLAG) != 0) { - int ret; FAR const struct spiffs_free_objid_s *state = (FAR const struct spiffs_free_objid_s *)user_const; - struct spiffs_pgobj_ixheader_s objhdr; + struct spiffs_pgobj_ndxheader_s objhdr; + int ret; - ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, ix_entry), - sizeof(struct spiffs_pgobj_ixheader_s), - (uint8_t *) & objhdr); - if (ret == OK && objhdr.p_hdr.spndx == 0 && - ((objhdr.p_hdr. - flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | - SPIFFS_PH_FLAG_DELET)) == (SPIFFS_PH_FLAG_DELET))) + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, + 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 && + ((objhdr.phdr.flags & (SPIFFS_PH_FLAG_INDEX | + SPIFFS_PH_FLAG_FINAL | + SPIFFS_PH_FLAG_DELET)) == + (SPIFFS_PH_FLAG_DELET))) { - /* ok object look up entry */ + /* OK object look up entry */ if (state->conflicting_name && - strcmp((const char *)state->conflicting_name, (char *)objhdr.name) == 0) + strcmp((FAR const char *)state->conflicting_name, + (FAR char *)objhdr.name) == 0) { return -EEXIST; } @@ -381,7 +436,7 @@ static int spiffs_obj_lu_find_free_objid_compact_v(FAR struct spiffs_s *fs, objid &= ~SPIFFS_OBJ_ID_IX_FLAG; if (objid >= state->min_objid && objid <= state->max_objid) { - uint8_t *map = (uint8_t *) fs->work; + FAR uint8_t *map = (FAR uint8_t *)fs->work; int ndx = (objid - state->min_objid) / state->compaction; map[ndx]++; } @@ -395,6 +450,48 @@ static int spiffs_obj_lu_find_free_objid_compact_v(FAR struct spiffs_s *fs, * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: spiffs_validate_objix + * + * Description: + * Returns zero (OK) if everything checks out. Otherwise, a negated errno + * value is return to indicate the nature of the problem + * + ****************************************************************************/ + +int spiffs_validate_objix(FAR struct spiffs_page_header_s *ph, int16_t objid, + int16_t spndx) +{ + int ret = OK; + + if ((ph->flags & SPIFFS_PH_FLAG_USED) != 0) + { + ret = SPIFFS_ERR_IS_FREE; + } + else if ((ph->flags & SPIFFS_PH_FLAG_DELET) == 0) + { + ret = SPIFFS_ERR_DELETED; + } + else if ((ph->flags & SPIFFS_PH_FLAG_FINAL) != 0) + { + ret = SPIFFS_ERR_NOT_FINALIZED; + } + else if ((ph->flags & SPIFFS_PH_FLAG_INDEX) != 0) + { + ret = SPIFFS_ERR_NOT_INDEX; + } + else if ((objid & SPIFFS_OBJ_ID_IX_FLAG) == 0) + { + ret = SPIFFS_ERR_NOT_INDEX; + } + else if (ph->spndx != spndx) + { + ret = SPIFFS_ERR_INDEX_SPAN_MISMATCH; + } + + return ret; +} + /**************************************************************************** * Name: spiffs_phys_cpy * @@ -403,25 +500,33 @@ static int spiffs_obj_lu_find_free_objid_compact_v(FAR struct spiffs_s *fs, ****************************************************************************/ int spiffs_phys_cpy(FAR struct spiffs_s *fs, - int16_t objid, uint32_t dst, uint32_t src, uint32_t len) + int16_t objid, uint32_t dest, uint32_t src, uint32_t len) { - uint8_t b[CONFIG_SPIFFS_COPYBUF_STACK]; + uint8_t cpybuf[CONFIG_SPIFFS_COPYBUF_STACK]; int ret; while (len > 0) { uint32_t chunk_size = MIN(CONFIG_SPIFFS_COPYBUF_STACK, len); - ret = - spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_MOVS, objid, src, - chunk_size, b); - SPIFFS_CHECK_RES(ret); - ret = - spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_MOVD, objid, dst, - chunk_size, b); - SPIFFS_CHECK_RES(ret); + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_MOVS, + objid, src, chunk_size, cpybuf); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_MOVD, + objid, dest, chunk_size, cpybuf); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } + len -= chunk_size; src += chunk_size; - dst += chunk_size; + dest += chunk_size; } return OK; @@ -454,35 +559,44 @@ int spiffs_phys_cpy(FAR struct spiffs_s *fs, * flags - ORed combination of SPIFFS_VIS_CHECK_ID, * SPIFFS_VIS_CHECK_PH, SPIFFS_VIS_NO_WRAP * objid - Argument object ID - * v - Visitor callback function + * cb - Visitor callback function * user_const - Any const pointer, passed to the callback visitor function * user_var - Any pointer, passed to the callback visitor function - * block_ix - Reported block index where match was found + * blkndx - Reported block index where match was found * lu_entry - Reported look up index where match was found * ****************************************************************************/ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block, int starting_lu_entry, uint8_t flags, int16_t objid, - spiffs_visitor_f v, FAR const void *user_const, - FAR void *user_var, FAR int16_t *block_ix, + spiffs_callback_t cb, FAR const void *user_const, + FAR void *user_var, FAR int16_t *blkndx, FAR int *lu_entry) { - int32_t entry_count = fs->geo.neraseblocks * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs); - int16_t cur_block = starting_block; - uint32_t cur_block_addr = starting_block * SPIFFS_CFG_LOG_BLOCK_SZ(fs); - int16_t *obj_lu_buf = (int16_t *) fs->lu_work; - int cur_entry = starting_lu_entry; - int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(int16_t)); - int ret = OK; + FAR int16_t *objlu_buf; + uint32_t cur_block_addr; + int32_t entry_count; + int16_t cur_block; + int cur_entry; + int entries_per_page; + int ret; - /* wrap initial */ + entry_count = fs->geo.neraseblocks * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs); + cur_block = starting_block; + cur_block_addr = starting_block * SPIFFS_CFG_LOG_BLOCK_SZ(fs); + objlu_buf = (FAR int16_t *) fs->lu_work; + cur_entry = starting_lu_entry; + entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(int16_t)); + ret = OK; + + /* Wrap initial */ if (cur_entry > (int)SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs) - 1) { cur_entry = 0; cur_block++; cur_block_addr = cur_block * SPIFFS_CFG_LOG_BLOCK_SZ(fs); + if (cur_block >= fs->geo.neraseblocks) { if (flags & SPIFFS_VIS_NO_WRAP) @@ -491,50 +605,43 @@ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block, } else { - /* block wrap */ + /* Block wrap */ - cur_block = 0; + cur_block = 0; cur_block_addr = 0; } } } - /* check each block */ + /* Check each block */ while (ret == OK && entry_count > 0) { int obj_lookup_page = cur_entry / entries_per_page; - /* check each object lookup page */ + /* Check each object lookup page */ while (ret == OK && 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, cur_block_addr + SPIFFS_PAGE_TO_PADDR(fs, - obj_lookup_page), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + 0, cur_block_addr + + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); - /* check each entry */ + /* Check each entry */ - while (ret == OK && cur_entry - entry_offset < entries_per_page && /* for - * non-last - * obj - * lookup - * pages */ - cur_entry < (int)SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) /* for - * last - * obj - * lookup - * page */ + while (ret == OK && + cur_entry - entry_offset < entries_per_page && + cur_entry < (int)SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) { if ((flags & SPIFFS_VIS_CHECK_ID) == 0 || - obj_lu_buf[cur_entry - entry_offset] == objid) + objlu_buf[cur_entry - entry_offset] == objid) { - if (block_ix) + if (blkndx) { - *block_ix = cur_block; + *blkndx = cur_block; } if (lu_entry) @@ -542,27 +649,31 @@ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block, *lu_entry = cur_entry; } - if (v) + if (cb) { - ret = v(fs, + ret = cb(fs, (flags & SPIFFS_VIS_CHECK_PH) ? objid : - obj_lu_buf[cur_entry - entry_offset], cur_block, - cur_entry, user_const, user_var); + objlu_buf[cur_entry - entry_offset], + cur_block, cur_entry, user_const, user_var); + if (ret == SPIFFS_VIS_COUNTINUE || ret == SPIFFS_VIS_COUNTINUE_RELOAD) { if (ret == SPIFFS_VIS_COUNTINUE_RELOAD) { - ret = - spiffs_cache_read(fs, - SPIFFS_OP_T_OBJ_LU | - SPIFFS_OP_C_READ, 0, - cur_block_addr + - SPIFFS_PAGE_TO_PADDR(fs, - obj_lookup_page), - SPIFFS_CFG_LOG_PAGE_SZ(fs), - fs->lu_work); - SPIFFS_CHECK_RES(ret); + ret = spiffs_cache_read(fs, + SPIFFS_OP_T_OBJ_LU | + SPIFFS_OP_C_READ, 0, + cur_block_addr + + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), + SPIFFS_CFG_LOG_PAGE_SZ(fs), + fs->lu_work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", + ret); + return ret; + } } ret = OK; @@ -600,15 +711,19 @@ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block, } else { - /* block wrap */ + /* Block wrap */ - cur_block = 0; + cur_block = 0; cur_block_addr = 0; } } } - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + return ret; + } + return SPIFFS_VIS_END; } @@ -622,17 +737,17 @@ int spiffs_foreach_objlu(FAR struct spiffs_s *fs, int16_t starting_block, int spiffs_erase_block(FAR struct spiffs_s *fs, int16_t blkndx) { uint32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, blkndx); - int32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs); + int32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs); int ret; - /* here we ignore ret, just try erasing the block */ + /* Here we ignore the return value and just try erasing the block */ while (size > 0) { finfo("erase %08lx:%d\n", (unsigned long)addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); - spiffs_mtd_erase(fs, addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); + (void)spiffs_mtd_erase(fs, addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); addr += SPIFFS_CFG_PHYS_ERASE_SZ(fs); size -= SPIFFS_CFG_PHYS_ERASE_SZ(fs); @@ -640,12 +755,17 @@ int spiffs_erase_block(FAR struct spiffs_s *fs, int16_t blkndx) fs->free_blocks++; - /* register erase count for this block */ + /* Register erase count for this block */ ret = spiffs_cache_write(fs, SPIFFS_OP_C_WRTHRU | SPIFFS_OP_T_OBJ_LU2, 0, - SPIFFS_ERASE_COUNT_PADDR(fs, blkndx), - sizeof(int16_t), (uint8_t *) & fs->max_erase_count); - SPIFFS_CHECK_RES(ret); + SPIFFS_ERASE_COUNT_PADDR(fs, blkndx), + sizeof(int16_t), + (FAR uint8_t *)&fs->max_erase_count); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } fs->max_erase_count++; if (fs->max_erase_count == SPIFFS_OBJ_ID_IX_FLAG) @@ -657,7 +777,7 @@ int spiffs_erase_block(FAR struct spiffs_s *fs, int16_t blkndx) } /**************************************************************************** - * Name: spiffs_obj_lu_scan + * Name: spiffs_objlu_scan * * Description: * Scans thru all obj lu and counts free, deleted and used pages. @@ -665,27 +785,33 @@ int spiffs_erase_block(FAR struct spiffs_s *fs, int16_t blkndx) * ****************************************************************************/ -int spiffs_obj_lu_scan(FAR struct spiffs_s *fs) +int spiffs_objlu_scan(FAR struct spiffs_s *fs) { int16_t blkndx; + int16_t erase_count_final; + int16_t erase_count_min; + int16_t erase_count_max; int entry; int ret; - /* find out erase count. if enabled, check magic */ + /* Find out erase count. */ - blkndx = 0; - int16_t erase_count_final; - int16_t erase_count_min = SPIFFS_OBJ_ID_FREE; - int16_t erase_count_max = 0; + blkndx = 0; + erase_count_min = SPIFFS_OBJ_ID_FREE; + erase_count_max = 0; while (blkndx < fs->geo.neraseblocks) { int16_t erase_count; - ret = spiffs_cache_read(fs, - SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_ERASE_COUNT_PADDR(fs, blkndx), - sizeof(int16_t), (uint8_t *) & erase_count); - SPIFFS_CHECK_RES(ret); + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_ERASE_COUNT_PADDR(fs, blkndx), + sizeof(int16_t), (FAR uint8_t *)&erase_count); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + if (erase_count != SPIFFS_OBJ_ID_FREE) { erase_count_min = MIN(erase_count_min, erase_count); @@ -697,13 +823,13 @@ int spiffs_obj_lu_scan(FAR struct spiffs_s *fs) if (erase_count_min == 0 && erase_count_max == SPIFFS_OBJ_ID_FREE) { - /* clean system, set counter to zero */ + /* Clean system, set counter to zero */ erase_count_final = 0; } else if (erase_count_max - erase_count_min > (SPIFFS_OBJ_ID_FREE) / 2) { - /* wrap, take min */ + /* Wrap, take min */ erase_count_final = erase_count_min + 1; } @@ -714,31 +840,29 @@ int spiffs_obj_lu_scan(FAR struct spiffs_s *fs) fs->max_erase_count = erase_count_final; - /* count blocks */ + /* Count blocks */ - fs->free_blocks = 0; + fs->free_blocks = 0; fs->stats_p_allocated = 0; - fs->stats_p_deleted = 0; + fs->stats_p_deleted = 0; - ret = spiffs_foreach_objlu(fs, - 0, - 0, - 0, - 0, - spiffs_obj_lu_scan_v, - 0, 0, &blkndx, &entry); + ret = spiffs_foreach_objlu(fs, 0, 0, 0, 0, spiffs_objlu_scan_callback, + 0, 0, &blkndx, &entry); if (ret == SPIFFS_VIS_END) { ret = OK; } + else if (ret < 0) + { + ferr("ERROR: spiffs_foreach_objlu() failed: %d\n", ret); + } - SPIFFS_CHECK_RES(ret); return ret; } /**************************************************************************** - * Name: spiffs_obj_lu_find_free + * Name: spiffs_objlu_find_free * * Description: * Find free object lookup entry. Iterate over object lookup pages in each @@ -746,9 +870,9 @@ int spiffs_obj_lu_scan(FAR struct spiffs_s *fs) * ****************************************************************************/ -int spiffs_obj_lu_find_free(FAR struct spiffs_s *fs, int16_t starting_block, - int starting_lu_entry, FAR int16_t *block_ix, - FAR int *lu_entry) +int spiffs_objlu_find_free(FAR struct spiffs_s *fs, int16_t starting_block, + int starting_lu_entry, FAR int16_t *blkndx, + FAR int *lu_entry) { int ret; @@ -773,12 +897,13 @@ int spiffs_obj_lu_find_free(FAR struct spiffs_s *fs, int16_t starting_block, } } - ret = spiffs_obj_lu_find_id(fs, starting_block, starting_lu_entry, - SPIFFS_OBJ_ID_FREE, block_ix, lu_entry); + ret = spiffs_objlu_find_id(fs, starting_block, starting_lu_entry, + SPIFFS_OBJ_ID_FREE, blkndx, lu_entry); if (ret == OK) { - fs->free_blkndx = *block_ix; - fs->free_entry = (*lu_entry) + 1; + fs->free_blkndx = *blkndx; + fs->free_entry = (*lu_entry) + 1; + if (*lu_entry == 0) { fs->free_blocks--; @@ -787,14 +912,14 @@ int spiffs_obj_lu_find_free(FAR struct spiffs_s *fs, int16_t starting_block, if (ret == -ENOSPC) { - finfo("fs full\n"); + fwarn("WARNING: Filesystem full\n"); } return ret; } /**************************************************************************** - * Name: spiffs_obj_lu_find_id + * Name: spiffs_objlu_find_id * * Description: * Find object lookup entry containing given objid. Iterate over object @@ -802,14 +927,13 @@ int spiffs_obj_lu_find_free(FAR struct spiffs_s *fs, int16_t starting_block, * ****************************************************************************/ -int spiffs_obj_lu_find_id(FAR struct spiffs_s *fs, int16_t starting_block, - int starting_lu_entry, int16_t objid, - FAR int16_t *block_ix, FAR int *lu_entry) +int spiffs_objlu_find_id(FAR struct spiffs_s *fs, int16_t starting_block, + int starting_lu_entry, int16_t objid, + FAR int16_t *blkndx, FAR int *lu_entry) { - int ret = - spiffs_foreach_objlu(fs, starting_block, starting_lu_entry, - SPIFFS_VIS_CHECK_ID, objid, 0, 0, 0, - block_ix, lu_entry); + int ret = spiffs_foreach_objlu(fs, starting_block, starting_lu_entry, + SPIFFS_VIS_CHECK_ID, objid, 0, 0, 0, + blkndx, lu_entry); if (ret == SPIFFS_VIS_END) { ret = -ENOENT; @@ -819,7 +943,7 @@ int spiffs_obj_lu_find_id(FAR struct spiffs_s *fs, int16_t starting_block, } /**************************************************************************** - * Name: spiffs_obj_lu_find_id_and_span + * Name: spiffs_objlu_find_id_and_span * * Description: * Find object lookup entry containing given objid and span index. @@ -828,43 +952,43 @@ int spiffs_obj_lu_find_id(FAR struct spiffs_s *fs, int16_t starting_block, * ****************************************************************************/ -int spiffs_obj_lu_find_id_and_span(FAR struct spiffs_s *fs, int16_t objid, - int16_t spndx, int16_t exclusion_pgndx, - FAR int16_t *pgndx) +int spiffs_objlu_find_id_and_span(FAR struct spiffs_s *fs, int16_t objid, + int16_t spndx, int16_t exclusion_pgndx, + FAR int16_t *pgndx) { int16_t blkndx; int entry; int ret; - ret = spiffs_foreach_objlu(fs, - fs->lu_blkndx, - fs->lu_entry, - SPIFFS_VIS_CHECK_ID, - objid, - spiffs_obj_lu_find_id_and_span_v, - exclusion_pgndx ? &exclusion_pgndx : 0, - &spndx, &blkndx, &entry); + ret = spiffs_foreach_objlu(fs, fs->lu_blkndx, fs->lu_entry, + SPIFFS_VIS_CHECK_ID, objid, + spiffs_objlu_find_id_and_span_callback, + exclusion_pgndx ? &exclusion_pgndx : 0, + &spndx, &blkndx, &entry); if (ret == SPIFFS_VIS_END) { ret = -ENOENT; } + else if (ret < 0) + { + ferr("ERROR: spiffs_foreach_objlu() failed: %d\n", ret); + return ret; + } - SPIFFS_CHECK_RES(ret); - - if (pgndx) + if (pgndx != NULL) { *pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); } fs->lu_blkndx = blkndx; - fs->lu_entry = entry; + fs->lu_entry = entry; return ret; } /**************************************************************************** - * Name: spiffs_obj_lu_find_id_and_span_byphdr + * Name: spiffs_objlu_find_id_and_span_byphdr * * Description: * Find object lookup entry containing given objid and span index in page @@ -873,23 +997,20 @@ int spiffs_obj_lu_find_id_and_span(FAR struct spiffs_s *fs, int16_t objid, * ****************************************************************************/ -int spiffs_obj_lu_find_id_and_span_byphdr(FAR struct spiffs_s *fs, - int16_t objid, int16_t spndx, - int16_t exclusion_pgndx, - FAR int16_t *pgndx) +int spiffs_objlu_find_id_and_span_byphdr(FAR struct spiffs_s *fs, + int16_t objid, int16_t spndx, + int16_t exclusion_pgndx, + FAR int16_t *pgndx) { int16_t blkndx; int entry; int ret; - ret = spiffs_foreach_objlu(fs, - fs->lu_blkndx, - fs->lu_entry, - SPIFFS_VIS_CHECK_PH, - objid, - spiffs_obj_lu_find_id_and_span_v, - exclusion_pgndx ? &exclusion_pgndx : 0, - &spndx, &blkndx, &entry); + ret = spiffs_foreach_objlu(fs, fs->lu_blkndx, fs->lu_entry, + SPIFFS_VIS_CHECK_PH, objid, + spiffs_objlu_find_id_and_span_callback, + exclusion_pgndx ? &exclusion_pgndx : 0, + &spndx, &blkndx, &entry); if (ret == SPIFFS_VIS_END) { @@ -901,13 +1022,13 @@ int spiffs_obj_lu_find_id_and_span_byphdr(FAR struct spiffs_s *fs, return ret; } - if (pgndx) + if (pgndx != NULL) { *pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); } fs->lu_blkndx = blkndx; - fs->lu_entry = entry; + fs->lu_entry = entry; return ret; } @@ -931,58 +1052,77 @@ int spiffs_page_allocate_data(FAR struct spiffs_s *fs, int16_t objid, int entry; int ret = OK; - /* find free entry */ + /* Find free entry */ - ret = - spiffs_obj_lu_find_free(fs, fs->free_blkndx, - fs->free_entry, &blkndx, &entry); - SPIFFS_CHECK_RES(ret); + ret = spiffs_objlu_find_free(fs, fs->free_blkndx, fs->free_entry, + &blkndx, &entry); + if (ret < 0) + { + ferr("ERROR: spiffs_objlu_find_free() failed: %d\n", ret); + return ret; + } - /* occupy page in object lookup */ + /* Occupy page in object lookup */ ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, - 0, SPIFFS_BLOCK_TO_PADDR(fs, blkndx) + - entry * sizeof(int16_t), sizeof(int16_t), - (uint8_t *) & objid); - SPIFFS_CHECK_RES(ret); + 0, SPIFFS_BLOCK_TO_PADDR(fs, blkndx) + + entry * sizeof(int16_t), sizeof(int16_t), + (FAR uint8_t *)&objid); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } fs->stats_p_allocated++; - /* write page header */ + /* Write page header */ ph->flags &= ~SPIFFS_PH_FLAG_USED; - ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, entry), - sizeof(struct spiffs_page_header_s), (uint8_t *) ph); - SPIFFS_CHECK_RES(ret); + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, 0, + SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, entry), + sizeof(struct spiffs_page_header_s), + (FAR uint8_t *)ph); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } - /* write page data */ + /* Write page data */ if (data) { - ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, - entry) + - sizeof(struct spiffs_page_header_s) + page_offs, len, data); - SPIFFS_CHECK_RES(ret); + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, 0, + SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, entry) + + sizeof(struct spiffs_page_header_s) + page_offs, + len, data); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } } - /* finalize header if necessary */ + /* Finalize header if necessary */ - if (finalize && (ph->flags & SPIFFS_PH_FLAG_FINAL)) + if (finalize && (ph->flags & SPIFFS_PH_FLAG_FINAL) != 0) { ph->flags &= ~SPIFFS_PH_FLAG_FINAL; - ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, - entry) + - offsetof(struct spiffs_page_header_s, flags), sizeof(uint8_t), - (uint8_t *) & ph->flags); - SPIFFS_CHECK_RES(ret); + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, 0, + SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, entry) + + offsetof(struct spiffs_page_header_s, flags), + sizeof(uint8_t), (FAR uint8_t *)&ph->flags); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } } - /* return written page */ + /* Return written page */ - if (pgndx) + if (pgndx != NULL) { *pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); } @@ -1002,79 +1142,100 @@ int spiffs_page_allocate_data(FAR struct spiffs_s *fs, int16_t objid, ****************************************************************************/ int spiffs_page_move(FAR struct spiffs_s *fs, - int16_t objid, FAR uint8_t *page_data, int16_t ndx, - FAR struct spiffs_page_header_s *page_hdr, - int16_t src_pgndx, FAR int16_t *dst_pgndx) + int16_t objid, FAR uint8_t *page_data, int16_t ndx, + FAR struct spiffs_page_header_s *page_hdr, + int16_t src_pgndx, FAR int16_t *dst_pgndx) { - uint8_t was_final = 0; - struct spiffs_page_header_s *p_hdr; + struct spiffs_page_header_s *phdr; + bool was_final = false; + int16_t free_pgndx; int16_t blkndx; int entry; - int16_t free_pgndx; int ret; - /* find free entry */ + /* Find free entry */ + + ret = spiffs_objlu_find_free(fs, fs->free_blkndx, fs->free_entry, + &blkndx, &entry); + if (ret < 0) + { + ferr("ERROR: spiffs_gc_epage_stats() failed: %d\n", ret); + return ret; + } - ret = spiffs_obj_lu_find_free(fs, fs->free_blkndx, - fs->free_entry, &blkndx, &entry); - SPIFFS_CHECK_RES(ret); free_pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); - if (dst_pgndx) + if (dst_pgndx != NULL) { *dst_pgndx = free_pgndx; } - p_hdr = page_data ? (struct spiffs_page_header_s *) page_data : page_hdr; - if (page_data) + phdr = page_data ? (struct spiffs_page_header_s *) page_data : page_hdr; + if (page_data != NULL) { - /* got page data */ + /* Got page data */ - was_final = (p_hdr->flags & SPIFFS_PH_FLAG_FINAL) == 0; + was_final = (phdr->flags & SPIFFS_PH_FLAG_FINAL) == 0; - /* write unfinalized page */ + /* Write unfinalized page */ - p_hdr->flags |= SPIFFS_PH_FLAG_FINAL; - p_hdr->flags &= ~SPIFFS_PH_FLAG_USED; - ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - 0, SPIFFS_PAGE_TO_PADDR(fs, free_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), page_data); + phdr->flags |= SPIFFS_PH_FLAG_FINAL; + phdr->flags &= ~SPIFFS_PH_FLAG_USED; + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, 0, + SPIFFS_PAGE_TO_PADDR(fs, free_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), page_data); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } } else { - /* copy page data */ + /* Copy page data */ ret = spiffs_phys_cpy(fs, objid, SPIFFS_PAGE_TO_PADDR(fs, free_pgndx), SPIFFS_PAGE_TO_PADDR(fs, src_pgndx), SPIFFS_CFG_LOG_PAGE_SZ(fs)); + if (ret < 0) + { + ferr("ERROR: spiffs_phys_cpy() failed: %d\n", ret); + return ret; + } } - SPIFFS_CHECK_RES(ret); - - /* mark entry in destination object lookup */ + /* Mark entry in destination object lookup */ ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, 0, - SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, free_pgndx)) + - SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, free_pgndx) * - sizeof(int16_t), sizeof(int16_t), - (FAR uint8_t *)&ndx); - SPIFFS_CHECK_RES(ret); + SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, free_pgndx)) + + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, free_pgndx) * + sizeof(int16_t), sizeof(int16_t), + (FAR uint8_t *)&ndx); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } fs->stats_p_allocated++; if (was_final) { - /* mark finalized in destination page */ + /* Mark finalized in destination page */ - p_hdr->flags &= ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_USED); + phdr->flags &= ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_USED); ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, objid, - SPIFFS_PAGE_TO_PADDR(fs, free_pgndx) + - offsetof(struct spiffs_page_header_s, flags), sizeof(uint8_t), - (uint8_t *) & p_hdr->flags); - SPIFFS_CHECK_RES(ret); + SPIFFS_PAGE_TO_PADDR(fs, free_pgndx) + + offsetof(struct spiffs_page_header_s, flags), + sizeof(uint8_t), (FAR uint8_t *)&phdr->flags); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } } - /* mark source deleted */ + /* Mark source deleted */ ret = spiffs_page_delete(fs, src_pgndx); return ret; @@ -1090,36 +1251,54 @@ int spiffs_page_move(FAR struct spiffs_s *fs, int spiffs_page_delete(FAR struct spiffs_s *fs, int16_t pgndx) { + uint8_t flags; int ret; - /* mark deleted entry in source object lookup */ + /* Mark deleted entry in source object lookup */ int16_t d_objid = SPIFFS_OBJ_ID_DELETED; ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_DELE, 0, - SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, pgndx)) + - SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pgndx) * - sizeof(int16_t), sizeof(int16_t), - (uint8_t *) & d_objid); - SPIFFS_CHECK_RES(ret); + SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, pgndx)) + + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pgndx) * + sizeof(int16_t), sizeof(int16_t), + (FAR uint8_t *)&d_objid); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } fs->stats_p_deleted++; fs->stats_p_allocated--; - /* mark deleted in source page */ + /* Mark deleted in source page */ + + flags = 0xff; - uint8_t flags = 0xff; #ifdef CONFIG_SPIFFS_NO_BLIND_WRITES - ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ, - 0, SPIFFS_PAGE_TO_PADDR(fs, - pgndx) + offsetof(struct spiffs_page_header_s, - flags), - sizeof(flags), &flags); - SPIFFS_CHECK_RES(ret); + /* Perform read-modify-write operation */ + + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ, 0, + SPIFFS_PAGE_TO_PADDR(fs, pgndx) + + offsetof(struct spiffs_page_header_s, flags), + sizeof(flags), &flags); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } #endif + flags &= ~(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED); ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_DELE, 0, - SPIFFS_PAGE_TO_PADDR(fs, pgndx) + offsetof(struct spiffs_page_header_s, flags), - sizeof(flags), &flags); + SPIFFS_PAGE_TO_PADDR(fs, pgndx) + + offsetof(struct spiffs_page_header_s, flags), + sizeof(flags), &flags); + + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + } return ret; } @@ -1136,61 +1315,76 @@ int spiffs_object_create(FAR struct spiffs_s *fs, int16_t objid, const uint8_t name[], uint8_t type, FAR int16_t *objhdr_pgndx) { - struct spiffs_pgobj_ixheader_s objndx_hdr; + struct spiffs_pgobj_ndxheader_s objndx_hdr; int16_t blkndx; int entry; int ret = OK; ret = spiffs_gc_check(fs, SPIFFS_DATA_PAGE_SIZE(fs)); - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + ferr("ERROR: spiffs_gc_check() failed: %d\n", ret); + return ret; + } objid |= SPIFFS_OBJ_ID_IX_FLAG; - /* find free entry */ + /* Find free entry */ - ret = - spiffs_obj_lu_find_free(fs, fs->free_blkndx, - fs->free_entry, &blkndx, &entry); - SPIFFS_CHECK_RES(ret); - finfo("create: found free page @ %04x blkndx=%04x entry:" - "%04x\n", (int16_t) SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, - blkndx, - entry), - blkndx, entry); + ret = spiffs_objlu_find_free(fs, fs->free_blkndx, fs->free_entry, + &blkndx, &entry); + if (ret < 0) + { + ferr("ERROR: spiffs_objlu_find_free() failed: %d\n", ret); + return ret; + } - /* occupy page in object lookup */ + finfo("Found free page @ %04x blkndx=%04x entry=%04x\n", + (int16_t) SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry), + blkndx, entry); - ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, - 0, SPIFFS_BLOCK_TO_PADDR(fs, - blkndx) + - entry * sizeof(int16_t), sizeof(int16_t), - (uint8_t *) & objid); - SPIFFS_CHECK_RES(ret); + /* Occupy page in object lookup */ + + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, 0, + SPIFFS_BLOCK_TO_PADDR(fs, blkndx) + + entry * sizeof(int16_t), sizeof(int16_t), + (FAR uint8_t *)&objid); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } fs->stats_p_allocated++; - /* write empty object index page */ + /* Write empty object index page */ - objndx_hdr.p_hdr.objid = objid; - objndx_hdr.p_hdr.spndx = 0; - objndx_hdr.p_hdr.flags = + objndx_hdr.phdr.objid = objid; + objndx_hdr.phdr.spndx = 0; + objndx_hdr.phdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED); - objndx_hdr.type = type; - objndx_hdr.size = SPIFFS_UNDEFINED_LEN; /* keep ones so we can update later - * without wasting this page */ + objndx_hdr.type = type; + objndx_hdr.size = SPIFFS_UNDEFINED_LEN; + strncpy((char *)objndx_hdr.name, (const char *)name, CONFIG_SPIFFS_NAME_MAX); - /* update page */ + /* Update page */ - ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, entry), - sizeof(struct spiffs_pgobj_ixheader_s), (uint8_t *) & objndx_hdr); + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, 0, + SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, blkndx, entry), + sizeof(struct spiffs_pgobj_ndxheader_s), + (FAR uint8_t *)&objndx_hdr); - SPIFFS_CHECK_RES(ret); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) & objndx_hdr, - SPIFFS_EV_IX_NEW, objid, 0, - SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry), - SPIFFS_UNDEFINED_LEN); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } + + spiffs_object_event(fs, (FAR struct spiffs_page_objndx_s *)&objndx_hdr, + SPIFFS_EV_IX_NEW, objid, 0, + SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry), + SPIFFS_UNDEFINED_LEN); if (objhdr_pgndx) { @@ -1218,7 +1412,7 @@ int spiffs_object_update_index_hdr(FAR struct spiffs_s *fs, const uint8_t name[], uint32_t size, FAR int16_t *new_pgndx) { - FAR struct spiffs_pgobj_ixheader_s *objhdr; + FAR struct spiffs_pgobj_ndxheader_s *objhdr; int16_t new_objhdr_pgndx; int ret = OK; @@ -1228,56 +1422,68 @@ int spiffs_object_update_index_hdr(FAR struct spiffs_s *fs, { /* object index header page already given to us, no need to load it */ - objhdr = (struct spiffs_pgobj_ixheader_s *) new_objhdr_data; + objhdr = (FAR struct spiffs_pgobj_ndxheader_s *) new_objhdr_data; } else { - /* read object index header page */ + /* Read object index header page */ ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, objhdr_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); - objhdr = (struct spiffs_pgobj_ixheader_s *) fs->work; + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, objhdr_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + objhdr = (FAR struct spiffs_pgobj_ndxheader_s *) fs->work; } - SPIFFS_VALIDATE_OBJIX(objhdr->p_hdr, objid, 0); - - /* change name */ - - if (name) + ret = spiffs_validate_objix(&objhdr->phdr, objid, 0); + if (ret < 0) { - strncpy((char *)objhdr->name, (const char *)name, CONFIG_SPIFFS_NAME_MAX); + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; } - if (size) + /* Change name */ + + if (name != NULL) + { + strncpy((FAR char *)objhdr->name, (FAR const char *)name, + CONFIG_SPIFFS_NAME_MAX); + } + + if (size != 0) { objhdr->size = size; } - /* move and update page */ + /* Move and update page */ ret = spiffs_page_move(fs, fobj == NULL ? 0 : fobj->objid, - (FAR uint8_t *)objhdr, objid, - 0, objhdr_pgndx, &new_objhdr_pgndx); + (FAR uint8_t *)objhdr, objid, 0, objhdr_pgndx, + &new_objhdr_pgndx); - if (ret == OK) + if (ret >= 0) { - if (new_pgndx) + if (new_pgndx != NULL) { *new_pgndx = new_objhdr_pgndx; } /* callback on object index update */ - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) objhdr, - new_objhdr_data ? SPIFFS_EV_IX_UPD : - SPIFFS_EV_IX_UPD_HDR, objid, - objhdr->p_hdr.spndx, new_objhdr_pgndx, - objhdr->size); - if (fobj) + spiffs_object_event(fs, (FAR struct spiffs_page_objndx_s *)objhdr, + new_objhdr_data ? SPIFFS_EV_IX_UPD : + SPIFFS_EV_IX_UPD_HDR, objid, + objhdr->phdr.spndx, new_objhdr_pgndx, + objhdr->size); + if (fobj != NULL) { - fobj->objhdr_pgndx = new_objhdr_pgndx; /* if this is not in the + fobj->objhdr_pgndx = new_objhdr_pgndx; /* If this is not in the * registered cluster */ } } @@ -1286,28 +1492,30 @@ int spiffs_object_update_index_hdr(FAR struct spiffs_s *fs, } /**************************************************************************** - * Name: spiffs_cb_object_event + * Name: spiffs_object_event * * Description: * ****************************************************************************/ -void spiffs_cb_object_event(FAR struct spiffs_s *fs, - FAR spiffs_page_object_ix *objndx, - int ev, - int16_t objid_raw, - int16_t spndx, - int16_t new_pgndx, uint32_t new_size) +void spiffs_object_event(FAR struct spiffs_s *fs, + FAR struct spiffs_page_objndx_s *objndx, + int ev, int16_t objid_raw, int16_t spndx, + int16_t new_pgndx, uint32_t new_size) { +#ifdef CONFIG_DEBUG_FS_INFO + FAR static const char *evname[] = + { + "UPD", "NEW", "DEL", "MOV", "HUP", "???" + }; +#endif + FAR struct spiffs_file_s *fobj; FAR struct spiffs_file_s *next; int16_t objid = objid_raw & ~SPIFFS_OBJ_ID_IX_FLAG; - finfo(" CALLBACK %s objid=%04x spndx=%04x npgndx:" - "%04x nsz=%d\n", (const char *[]) - { - "UPD", "NEW", "DEL", "MOV", "HUP", "???"}[MIN(ev, 5)], - objid_raw, spndx, new_pgndx, new_size); + finfo("Event=%s objid=%04x spndx=%04x npgndx=%04x nsz=%d\n", + evname[MIN(ev, 5)], objid_raw, spndx, new_pgndx, new_size); /* Update index caches in all file descriptors */ @@ -1323,12 +1531,12 @@ void spiffs_cb_object_event(FAR struct spiffs_s *fs, if ((fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG) != objid) { - continue; /* Object not related to updated file */ + continue; /* Object not related to updated file */ } if (spndx == 0) { - /* object index header update */ + /* Object index header update */ if (ev != SPIFFS_EV_IX_DEL) { @@ -1338,17 +1546,22 @@ void spiffs_cb_object_event(FAR struct spiffs_s *fs, fobj->objhdr_pgndx = new_pgndx; if (new_size != 0) { - /* update size and offsets for fobj to this file */ + uint32_t act_new_size = 0; + + /* Update size and offsets for fobj to this file */ fobj->size = new_size; - uint32_t act_new_size = - new_size == SPIFFS_UNDEFINED_LEN ? 0 : new_size; + + if (new_size != SPIFFS_UNDEFINED_LEN) + { + act_new_size = new_size; + } + if (act_new_size > 0 && fobj->cache_page) { - act_new_size = - MAX(act_new_size, - fobj->cache_page->offset + - fobj->cache_page->size); + act_new_size = MAX(act_new_size, + fobj->cache_page->offset + + fobj->cache_page->size); } if (fobj->offset > act_new_size) @@ -1359,9 +1572,9 @@ void spiffs_cb_object_event(FAR struct spiffs_s *fs, if (fobj->cache_page && fobj->cache_page->offset > act_new_size + 1) { - spiffs_cacheinfo - ("CACHE_DROP: file truncated, dropping cache page " - "%d, no writeback\n", fobj->cache_page->cpndx); + spiffs_cacheinfo("File truncated, dropping cache page=%d, no writeback\n", + fobj->cache_page->cpndx); + spiffs_cache_page_release(fs, fobj->cache_page); } } @@ -1372,9 +1585,9 @@ void spiffs_cb_object_event(FAR struct spiffs_s *fs, if (fobj->cache_page) { - spiffs_cacheinfo - ("CACHE_DROP: file deleted, dropping cache page=%d" - ", no writeback\n", fobj->cache_page->cpndx); + spiffs_cacheinfo("File deleted, dropping cache page=%d, no writeback\n", + fobj->cache_page->cpndx); + spiffs_cache_page_release(fs, fobj->cache_page); } @@ -1416,25 +1629,29 @@ int spiffs_object_open_bypage(FAR struct spiffs_s *fs, int16_t pgndx, FAR struct spiffs_file_s *fobj, uint16_t flags, uint16_t mode) { - struct spiffs_pgobj_ixheader_s objndx_hdr; + struct spiffs_pgobj_ndxheader_s objndx_hdr; int16_t objid; int16_t blkndx; int entry; int ret = OK; ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - sizeof(struct spiffs_pgobj_ixheader_s), - (FAR uint8_t *)&objndx_hdr); - SPIFFS_CHECK_RES(ret); + fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), + sizeof(struct spiffs_pgobj_ndxheader_s), + (FAR uint8_t *)&objndx_hdr); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } blkndx = SPIFFS_BLOCK_FOR_PAGE(fs, pgndx); entry = SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pgndx); - ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, - 0, SPIFFS_BLOCK_TO_PADDR(fs, blkndx) + - entry * sizeof(int16_t), sizeof(int16_t), - (FAR uint8_t *)&objid); + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, 0, + SPIFFS_BLOCK_TO_PADDR(fs, blkndx) + + entry * sizeof(int16_t), sizeof(int16_t), + (FAR uint8_t *)&objid); fobj->objhdr_pgndx = pgndx; fobj->size = objndx_hdr.size; @@ -1444,7 +1661,12 @@ int spiffs_object_open_bypage(FAR struct spiffs_s *fs, int16_t pgndx, fobj->objid = objid; fobj->flags = flags; - SPIFFS_VALIDATE_OBJIX(objndx_hdr.p_hdr, fobj->objid, 0); + ret = spiffs_validate_objix(&objndx_hdr.phdr, fobj->objid, 0); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; + } finfo("open: objid=%d\n", fobj->objid); return ret; @@ -1463,131 +1685,169 @@ int spiffs_object_append(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, off_t offset, FAR uint8_t *data, size_t len) { + struct spiffs_page_header_s phdr; + FAR struct spiffs_pgobj_ndxheader_s *objhdr; + FAR struct spiffs_page_objndx_s *objndx; size_t written = 0; + uint32_t page_offs; + int16_t cur_objndx_spndx; + int16_t prev_objndx_spndx; + int16_t cur_objndx_pgndx; + int16_t new_objhdr_page; + int16_t data_spndx; + int16_t data_page; int ret = OK; + int ret2; - finfo("append: %d bytes @ offs=%d of size=%d" - "\n", len, offset, fobj->size); + finfo("Append %d bytes @ offs=%d of size=%d\n", len, offset, fobj->size); if (offset > fobj->size) { - finfo("append: offset reversed to size\n"); + finfo("Offset reversed to size\n"); offset = fobj->size; } - ret = spiffs_gc_check(fs, len + SPIFFS_DATA_PAGE_SIZE(fs)); /* add an extra - * page of data - * worth for meta */ - if (ret != OK) + /* Add an extra page of data worth for meta */ + + ret = spiffs_gc_check(fs, len + SPIFFS_DATA_PAGE_SIZE(fs)); + if (ret < 0) { - ferr("ERROR: spiffs_gc_check() failed: %d\n", ret); + ferr("ERROR: spiffs_gc_epage_stats() failed: %d\n", ret); + return ret; } - SPIFFS_CHECK_RES(ret); + objhdr = (FAR struct spiffs_pgobj_ndxheader_s *) fs->work; + objndx = (FAR struct spiffs_page_objndx_s *) fs->work; + cur_objndx_spndx = 0; + prev_objndx_spndx = (int16_t)-1; + cur_objndx_pgndx = fobj->objhdr_pgndx; + data_spndx = offset / SPIFFS_DATA_PAGE_SIZE(fs); + page_offs = offset % SPIFFS_DATA_PAGE_SIZE(fs); - FAR struct spiffs_pgobj_ixheader_s *objhdr = - (FAR struct spiffs_pgobj_ixheader_s *) fs->work; - spiffs_page_object_ix *objndx = (spiffs_page_object_ix *) fs->work; - struct spiffs_page_header_s p_hdr; - - int16_t cur_objndx_spndx = 0; - int16_t prev_objndx_spndx = (int16_t) - 1; - int16_t cur_objndx_pgndx = fobj->objhdr_pgndx; - int16_t new_objhdr_page; - - int16_t data_spndx = offset / SPIFFS_DATA_PAGE_SIZE(fs); - int16_t data_page; - uint32_t page_offs = offset % SPIFFS_DATA_PAGE_SIZE(fs); - - /* write all data */ + /* Write all data */ while (ret == OK && written < len) { - /* calculate object index page span index */ + size_t to_write; + + /* Calculate object index page span index */ cur_objndx_spndx = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spndx); - /* handle storing and loading of object indices */ + /* Handle storing and loading of object indices */ if (cur_objndx_spndx != prev_objndx_spndx) { - /* new object index page. Within this clause we return directly + /* New object index page. Within this clause we return directly * if something fails, object index mess-up */ if (written > 0) { - /* store previous object index page, unless first pass */ + /* Store previous object index page, unless first pass */ - finfo("append: %04x store objndx %04x:" - "%04x, written=%d\n", fobj->objid, - cur_objndx_pgndx, prev_objndx_spndx, written); + finfo("objid=%04x store objndx %04x:%04x, written=%d\n", + fobj->objid, cur_objndx_pgndx, prev_objndx_spndx, + written); if (prev_objndx_spndx == 0) { - /* this is an update to object index header page */ + /* This is an update to object index header page */ objhdr->size = offset + written; if (offset == 0) { - /* was an empty object, update same page (size was + /* Was an empty object, update same page (size was * 0xffffffff) */ ret = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, 0); - SPIFFS_CHECK_RES(ret); - ret = - spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", + ret); + return ret; + } + + ret = spiffs_cache_write(fs, + SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), + fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", + ret); + return ret; + } } else { - /* was a nonempty object, update to new page */ + /* Was a nonempty object, update to new page */ ret = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, fobj->objhdr_pgndx, fs->work, 0, offset + written, &new_objhdr_page); - SPIFFS_CHECK_RES(ret); - finfo("append: %04x store new objhdr, " - "%04x:%04x, written=%d" - "\n", fobj->objid, new_objhdr_page, 0, - written); + if (ret < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret); + return ret; + } + + finfo("objid=%04x store new objhdr, %04x:%04x, written=%d\n", + fobj->objid, new_objhdr_page, 0, written); } } else { /* this is an update to an object index page */ - ret = - spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, - prev_objndx_spndx); - SPIFFS_CHECK_RES(ret); + ret = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, + prev_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", ret); + return ret; + } - ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, - cur_objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) fs->work, - SPIFFS_EV_IX_UPD, fobj->objid, - objndx->p_hdr.spndx, cur_objndx_pgndx, - 0); + ret = spiffs_cache_write(fs, + SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), + fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } - /* update length in object index header page */ + spiffs_object_event(fs, (FAR struct spiffs_page_objndx_s *)fs->work, + SPIFFS_EV_IX_UPD, fobj->objid, + objndx->phdr.spndx, cur_objndx_pgndx, + 0); + + /* Update length in object index header page */ ret = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, fobj->objhdr_pgndx, 0, 0, offset + written, &new_objhdr_page); - SPIFFS_CHECK_RES(ret); - finfo("append: %04x store new size I %d" - " in objhdr, %04x:%04x" - ", written=%d\n", fobj->objid, - offset + written, new_objhdr_page, 0, written); + if (ret < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret); + return ret; + } + + finfo("objid=%04x store new size I %d in objhdr, " + "%04x:%04x, written=%d\n", + fobj->objid, offset + written, new_objhdr_page, 0, + written); } fobj->size = offset + written; @@ -1602,78 +1862,119 @@ int spiffs_object_append(FAR struct spiffs_s *fs, finfo("append: %04x load objndxhdr page %04x:%04x\n", fobj->objid, cur_objndx_pgndx, cur_objndx_spndx); - ret = - spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, - cur_objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); - SPIFFS_VALIDATE_OBJIX(objhdr->p_hdr, fobj->objid, - cur_objndx_spndx); + + ret = spiffs_cache_read(fs, + SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid, + cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; + } } else { - int16_t len_objndx_spndx = - SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, - (fobj->size - 1) / - SPIFFS_DATA_PAGE_SIZE(fs)); + int16_t len_objndx_spndx; - /* on subsequent passes, create a new object index page */ + /* On subsequent passes, create a new object index page */ + + len_objndx_spndx = + SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs,(fobj->size - 1) / + SPIFFS_DATA_PAGE_SIZE(fs)); if (written > 0 || cur_objndx_spndx > len_objndx_spndx) { - p_hdr.objid = fobj->objid | SPIFFS_OBJ_ID_IX_FLAG; - p_hdr.spndx = cur_objndx_spndx; - p_hdr.flags = + phdr.objid = fobj->objid | SPIFFS_OBJ_ID_IX_FLAG; + phdr.spndx = cur_objndx_spndx; + phdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX); - ret = - spiffs_page_allocate_data(fs, - fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, - &p_hdr, 0, 0, 0, 1, - &cur_objndx_pgndx); - SPIFFS_CHECK_RES(ret); - /* quick "load" of new object index page */ + ret = spiffs_page_allocate_data(fs, + fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, + &phdr, 0, 0, 0, 1, + &cur_objndx_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_page_allocate_data() failed: %d\n", + ret); + return ret; + } + + /* Quick "load" of new object index page */ memset(fs->work, 0xff, SPIFFS_CFG_LOG_PAGE_SZ(fs)); - memcpy(fs->work, &p_hdr, sizeof(struct spiffs_page_header_s)); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) fs->work, - SPIFFS_EV_IX_NEW, fobj->objid, - cur_objndx_spndx, cur_objndx_pgndx, 0); - finfo("append: %04x create objndx page, " - "%04x:%04x, written=%d\n", - fobj->objid, cur_objndx_pgndx, cur_objndx_spndx, - written); + memcpy(fs->work, &phdr, sizeof(struct spiffs_page_header_s)); + + spiffs_object_event(fs, + (FAR struct spiffs_page_objndx_s *)fs->work, + SPIFFS_EV_IX_NEW, fobj->objid, + cur_objndx_spndx, cur_objndx_pgndx, 0); + + finfo("objid=%04x create objndx page, %04x:%04x, written=%d\n", + fobj->objid, cur_objndx_pgndx, cur_objndx_spndx, + written); } else { - /* on first pass, we load existing object index page */ - int16_t pgndx; - finfo("append: %04x find objndx spndx:" - "%04x\n", fobj->objid, cur_objndx_spndx); + + /* On first pass, we load existing object index page */ + + finfo("objid=%04x find objndx spndx=%04x\n", + fobj->objid, cur_objndx_spndx); + if (fobj->objndx_spndx == cur_objndx_spndx) { pgndx = fobj->objndx_pgndx; } else { - ret = - spiffs_obj_lu_find_id_and_span(fs, - fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, - cur_objndx_spndx, 0, &pgndx); - SPIFFS_CHECK_RES(ret); + ret = spiffs_objlu_find_id_and_span(fs, + fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, + cur_objndx_spndx, 0, + &pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", + ret); + return ret; + } } - finfo("append: %04x found object index at page " - "%04x [fobj size=%d]\n", fobj->objid, - pgndx, fobj->size); - ret = - spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); - SPIFFS_VALIDATE_OBJIX(objhdr->p_hdr, fobj->objid, - cur_objndx_spndx); + + finfo("objid=%04x found object index at page=%04x [fobj size=%d]\n", + fobj->objid, pgndx, fobj->size); + + ret = spiffs_cache_read(fs, + SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), + fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid, + cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", + ret); + return ret; + } + cur_objndx_pgndx = pgndx; } @@ -1686,103 +1987,106 @@ int spiffs_object_append(FAR struct spiffs_s *fs, prev_objndx_spndx = cur_objndx_spndx; } - /* write data */ + /* Write data */ + + to_write = MIN(len - written, SPIFFS_DATA_PAGE_SIZE(fs) - page_offs); - uint32_t to_write = - MIN(len - written, SPIFFS_DATA_PAGE_SIZE(fs) - page_offs); if (page_offs == 0) { - /* at beginning of a page, allocate and write a new page of data */ + /* ATt beginning of a page, allocate and write a new page of data */ - p_hdr.objid = fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG; - p_hdr.spndx = data_spndx; - p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL); /* finalize immediately */ - ret = - spiffs_page_allocate_data(fs, fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, - &p_hdr, &data[written], to_write, - page_offs, 1, &data_page); - finfo("append: %04x store new data page, %04x:" - "%04x offset=%d, len=%d" - ", written=%d\n", fobj->objid, data_page, - data_spndx, page_offs, to_write, written); + phdr.objid = fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG; + phdr.spndx = data_spndx; + phdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL); /* Finalize immediately */ + + ret = spiffs_page_allocate_data(fs, + fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, + &phdr, &data[written], to_write, + page_offs, 1, &data_page); + + finfo("objid=%04x store new data page, %04x:%04x offset=%d, " + "len=%d written=%d\n", + fobj->objid, data_page, data_spndx, page_offs, to_write, + written); } else { - /* append to existing page, fill out free data in existing page */ + /* Append to existing page, fill out free data in existing page */ if (cur_objndx_spndx == 0) { - /* get data page from object index header page */ + /* Get data page from object index header page */ data_page = - ((int16_t *) ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s))) - [data_spndx]; + ((FAR int16_t *)((FAR uint8_t *)objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx]; } else { - /* get data page from object index page */ + /* Get data page from object index page */ data_page = - ((int16_t *) ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix))) - [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; + ((FAR int16_t *)((FAR uint8_t *) objndx + + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; } ret = spiffs_page_data_check(fs, fobj, data_page, data_spndx); - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + ferr("ERROR: spiffs_page_data_check() failed: %d\n", ret); + return ret; + } ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, - data_page) + - sizeof(struct spiffs_page_header_s) + page_offs, to_write, - &data[written]); - finfo("append: %04x store to existing data page, " - "%04x:%04x offset=%d, len " - "%d, written=%d\n", fobj->objid, data_page, - data_spndx, page_offs, to_write, written); + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, data_page) + + sizeof(struct spiffs_page_header_s) + page_offs, + to_write, &data[written]); + + finfo("objid=%04x store to existing data page, %04x:%04x offset=%d, " + "len=%d, written=%d\n", + fobj->objid, data_page, data_spndx, page_offs, to_write, + written); } - if (ret != OK) + if (ret < 0) { break; } - /* update memory representation of object index page with new data page */ + /* Update memory representation of object index page with new data page */ if (cur_objndx_spndx == 0) { - /* update object index header page */ + /* Update object index header page */ - ((int16_t *) ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s)))[data_spndx] - = data_page; + ((FAR int16_t *)((FAR uint8_t *) objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx] = data_page; - finfo("append: %04x wrote page %04x" - " to objhdr entry %04x in mem\n", fobj->objid, - data_page, data_spndx); + finfo("objid=%04x wrote page %04x to objhdr entry=%04x in mem\n", + fobj->objid, data_page, data_spndx); objhdr->size = offset + written; } else { - /* update object index page */ + /* Update object index page */ - ((int16_t *) ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix))) - [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = data_page; + ((FAR int16_t *)((FAR uint8_t *) objndx + + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = data_page; - finfo("append: %04x wrote page %04x" - " to objndx entry %04x in mem\n", fobj->objid, - data_page, (int16_t) SPIFFS_OBJ_IX_ENTRY(fs, - data_spndx)); + finfo("objid=%04x wrote page=%04x to objndx entry %04x in mem\n", + fobj->objid, data_page, + (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)); } - /* update internals */ + /* Update internals */ page_offs = 0; data_spndx++; - written += to_write; + written += to_write; } fobj->size = offset + written; @@ -1790,82 +2094,120 @@ int spiffs_object_append(FAR struct spiffs_s *fs, fobj->objndx_pgndx = cur_objndx_pgndx; fobj->objndx_spndx = cur_objndx_spndx; - /* finalize updated object indices */ + /* Finalize updated object indices */ - int res2 = OK; + ret2 = OK; if (cur_objndx_spndx != 0) { - /* wrote beyond object index header page. Write last modified object + /* Wrote beyond object index header page. Write last modified object * index page, unless object header index page */ - finfo("append: %04x store objndx page, %04x:" - "%04x, written=%d\n", fobj->objid, - cur_objndx_pgndx, cur_objndx_spndx, written); + finfo("objid=%04x store objndx page, %04x:%04x, written=%d\n", + fobj->objid, cur_objndx_pgndx, cur_objndx_spndx, written); - res2 = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, cur_objndx_spndx); - SPIFFS_CHECK_RES(res2); + ret2 = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, + cur_objndx_spndx); + if (ret2 < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", ret2); + return ret2; + } - res2 = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(res2); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) fs->work, - SPIFFS_EV_IX_UPD, fobj->objid, objndx->p_hdr.spndx, - cur_objndx_pgndx, 0); + ret2 = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + if (ret2 < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret2); + return ret2; + } - /* update size in object header index page */ + spiffs_object_event(fs, + (FAR struct spiffs_page_objndx_s *)fs->work, + SPIFFS_EV_IX_UPD, fobj->objid, + objndx->phdr.spndx, cur_objndx_pgndx, 0); - res2 = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, + /* Update size in object header index page */ + + ret2 = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, fobj->objhdr_pgndx, 0, 0, offset + written, &new_objhdr_page); - finfo("append: %04x store new size II %d" - " in objhdr, %04x:%04x, written=%d" - ", ret=%d\n", fobj->objid, offset + written, - new_objhdr_page, 0, written, res2); - SPIFFS_CHECK_RES(res2); + + finfo("objid=%04x store new size II %d in objhdr, %04x:%04x, " + "written=%d, ret=%d\n", + fobj->objid, offset + written, new_objhdr_page, 0, written, + ret2); + + if (ret2 < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret2); + return ret2; + } } else { - /* wrote within object index header page */ + /* Wrote within object index header page */ if (offset == 0) { - /* wrote to empty object - simply update size and write whole page */ + /* Wrote to empty object - simply update size and write whole page */ objhdr->size = offset + written; - finfo("append: %04x store fresh objhdr page, " - "%04x:%04x, written=%d\n", - fobj->objid, cur_objndx_pgndx, cur_objndx_spndx, written); - res2 = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, cur_objndx_spndx); - SPIFFS_CHECK_RES(res2); + finfo("objid=%04x store fresh objhdr page, %04x:%04x, written=%d\n", + fobj->objid, cur_objndx_pgndx, cur_objndx_spndx, written); - res2 = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(res2); + ret2 = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, + cur_objndx_spndx); + if (ret2 < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", ret2); + return ret2; + } - /* callback on object index update */ + ret2 = spiffs_cache_write(fs, + SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + if (ret2 < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret2); + return ret2; + } - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) fs->work, - SPIFFS_EV_IX_UPD_HDR, fobj->objid, - objhdr->p_hdr.spndx, cur_objndx_pgndx, - objhdr->size); + spiffs_object_event(fs, + (FAR struct spiffs_page_objndx_s *)fs->work, + SPIFFS_EV_IX_UPD_HDR, fobj->objid, + objhdr->phdr.spndx, cur_objndx_pgndx, + objhdr->size); } else { - /* modifying object index header page, update size and make new copy */ + /* Modifying object index header page, update size and make new + * copy. + */ - res2 = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, - fobj->objhdr_pgndx, fs->work, 0, + ret2 = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, + fobj->objhdr_pgndx, + fs->work, 0, offset + written, &new_objhdr_page); - finfo("append: %04x store modified objhdr page, " - "%04x:%04x, written=%d\n", - fobj->objid, new_objhdr_page, 0, written); - SPIFFS_CHECK_RES(res2); + + finfo("objid=%04x store modified objhdr page, %04x:%04x, " + "written=%d\n", + fobj->objid, new_objhdr_page, 0, written); + + if (ret2 < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret2); + return ret2; + } } } @@ -1885,333 +2227,423 @@ int spiffs_object_modify(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, off_t offset, FAR uint8_t *data, size_t len) { + struct spiffs_page_header_s phdr; + FAR struct spiffs_pgobj_ndxheader_s *objhdr; + FAR struct spiffs_page_objndx_s *objndx; size_t written = 0; + uint32_t page_offs; + int16_t cur_objndx_spndx; + int16_t prev_objndx_spndx; + int16_t cur_objndx_pgndx; + int16_t new_objhdr_pgndx; + int16_t data_spndx; + int16_t data_pgndx; int ret = OK; + int ret2; ret = spiffs_gc_check(fs, len + SPIFFS_DATA_PAGE_SIZE(fs)); - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + ferr("ERROR: spiffs_gc_check() failed: %d\n", ret); + return ret; + } - FAR struct spiffs_pgobj_ixheader_s *objhdr = - (FAR struct spiffs_pgobj_ixheader_s *) fs->work; - spiffs_page_object_ix *objndx = (spiffs_page_object_ix *) fs->work; - struct spiffs_page_header_s p_hdr; + objhdr = (FAR struct spiffs_pgobj_ndxheader_s *) fs->work; + objndx = (FAR struct spiffs_page_objndx_s *) fs->work; - int16_t cur_objndx_spndx = 0; - int16_t prev_objndx_spndx = (int16_t) - 1; - int16_t cur_objndx_pgndx = fobj->objhdr_pgndx; - int16_t new_objhdr_pgndx; + cur_objndx_spndx = 0; + prev_objndx_spndx = (int16_t) - 1; + cur_objndx_pgndx = fobj->objhdr_pgndx; - int16_t data_spndx = offset / SPIFFS_DATA_PAGE_SIZE(fs); - int16_t data_pgndx; - uint32_t page_offs = offset % SPIFFS_DATA_PAGE_SIZE(fs); + data_spndx = offset / SPIFFS_DATA_PAGE_SIZE(fs); + page_offs = offset % SPIFFS_DATA_PAGE_SIZE(fs); - /* write all data */ + /* Write all data */ while (ret == OK && written < len) { - /* calculate object index page span index */ + size_t to_write; + int16_t orig_data_pgndx; + + /* Calculate object index page span index */ cur_objndx_spndx = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spndx); - /* handle storing and loading of object indices */ + /* Handle storing and loading of object indices */ if (cur_objndx_spndx != prev_objndx_spndx) { - /* new object index page. Within this clause we return directly + /* New object index page. Within this clause we return directly * if something fails, object index mess-up */ if (written > 0) { - /* store previous object index (header) page, unless first pass */ + /* Store previous object index (header) page, unless first + * pass. + */ if (prev_objndx_spndx == 0) { - /* store previous object index header page */ + /* Store previous object index header page */ ret = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, fobj->objhdr_pgndx, fs->work, 0, 0, &new_objhdr_pgndx); - finfo("modify: store modified objhdr page, %04x" - ":%04x, written=%d\n", - new_objhdr_pgndx, 0, written); - SPIFFS_CHECK_RES(ret); + + finfo("Store modified objhdr page, %04x:%04x, written=%d\n", + new_objhdr_pgndx, 0, written); + + if (ret < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret); + return ret; + } } else { - /* store new version of previous object index page */ + /* Store new version of previous object index page */ int16_t new_objndx_pgndx; - ret = - spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, - prev_objndx_spndx); - SPIFFS_CHECK_RES(ret); + ret = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, + prev_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", ret); + return ret; + } ret = spiffs_page_move(fs, fobj->objid, (FAR uint8_t *)objndx, fobj->objid, 0, cur_objndx_pgndx, &new_objndx_pgndx); - finfo("modify: store previous modified objndx page, " - "%04x:%04x, written=%d\n", - new_objndx_pgndx, objndx->p_hdr.spndx, written); - SPIFFS_CHECK_RES(ret); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) objndx, - SPIFFS_EV_IX_UPD, fobj->objid, - objndx->p_hdr.spndx, new_objndx_pgndx, - 0); + + finfo("Store previous modified objndx page, %04x:%04x, written=%d\n", + new_objndx_pgndx, objndx->phdr.spndx, written); + + if (ret < 0) + { + ferr("ERROR: spiffs_page_move() failed: %d\n", ret); + return ret; + } + + spiffs_object_event(fs, + (FAR struct spiffs_page_objndx_s *)objndx, + SPIFFS_EV_IX_UPD, fobj->objid, + objndx->phdr.spndx, new_objndx_pgndx, + 0); } } - /* load next object index page */ + /* Load next object index page */ if (cur_objndx_spndx == 0) { - /* load object index header page, must exist */ + /* Load object index header page, must exist */ - finfo("modify: load objndxhdr page %04x:%04x" - "\n", cur_objndx_pgndx, cur_objndx_spndx); - ret = - spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, - cur_objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); - SPIFFS_VALIDATE_OBJIX(objhdr->p_hdr, fobj->objid, - cur_objndx_spndx); + finfo("Load objndxhdr page %04x:%04x\n", + cur_objndx_pgndx, cur_objndx_spndx); + + ret = spiffs_cache_read(fs, + SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, cur_objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid, + cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; + } } else { - /* load existing object index page on first pass */ - int16_t pgndx; - finfo("modify: find objndx spndx=%04x\n", - cur_objndx_spndx); + + /* Load existing object index page on first pass */ + + finfo("Find objndx spndx=%04x\n", cur_objndx_spndx); + if (fobj->objndx_spndx == cur_objndx_spndx) { pgndx = fobj->objndx_pgndx; } else { - ret = - spiffs_obj_lu_find_id_and_span(fs, - fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, - cur_objndx_spndx, 0, &pgndx); - SPIFFS_CHECK_RES(ret); + ret = spiffs_objlu_find_id_and_span(fs, + fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, + cur_objndx_spndx, 0, + &pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", + ret); + return ret; + } } - finfo("modify: found object index at page %04x\n", - pgndx); - ret = - spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); - SPIFFS_VALIDATE_OBJIX(objhdr->p_hdr, fobj->objid, - cur_objndx_spndx); + + finfo("Found object index at page=%04x\n", pgndx); + + ret = spiffs_cache_read(fs, + SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid, + cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; + } + cur_objndx_pgndx = pgndx; } fobj->objndx_pgndx = cur_objndx_pgndx; fobj->objndx_spndx = cur_objndx_spndx; - fobj->offset = offset + written; - prev_objndx_spndx = cur_objndx_spndx; + fobj->offset = offset + written; + prev_objndx_spndx = cur_objndx_spndx; } - /* write partial data */ + /* Write partial data */ - uint32_t to_write = - MIN(len - written, SPIFFS_DATA_PAGE_SIZE(fs) - page_offs); - int16_t orig_data_pgndx; + to_write = MIN(len - written, SPIFFS_DATA_PAGE_SIZE(fs) - page_offs); if (cur_objndx_spndx == 0) { - /* get data page from object index header page */ + /* Get data page from object index header page */ orig_data_pgndx = - ((int16_t *) ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s))) - [data_spndx]; + ((FAR int16_t *)((FAR uint8_t *)objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx]; } else { - /* get data page from object index page */ + /* Get data page from object index page */ orig_data_pgndx = - ((int16_t *) ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix))) - [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; + ((FAR int16_t *)((FAR uint8_t *)objndx + + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; } - p_hdr.objid = fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG; - p_hdr.spndx = data_spndx; - p_hdr.flags = 0xff; + phdr.objid = fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG; + phdr.spndx = data_spndx; + phdr.flags = 0xff; if (page_offs == 0 && to_write == SPIFFS_DATA_PAGE_SIZE(fs)) { - /* a full page, allocate and write a new page of data */ + /* A full page, allocate and write a new page of data */ - ret = - spiffs_page_allocate_data(fs, fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, - &p_hdr, &data[written], to_write, - page_offs, 1, &data_pgndx); - finfo("modify: store new data page, %04x:%04x" - " offset=%d, len=%d, written=%d" - "\n", data_pgndx, data_spndx, page_offs, to_write, written); + ret = spiffs_page_allocate_data(fs, + fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, + &phdr, &data[written], to_write, + page_offs, 1, &data_pgndx); + finfo("Store new data page, %04x:%04x offset=%d, len=%d, written=%d\n", + data_pgndx, data_spndx, page_offs, to_write, written); } else { - /* write to existing page, allocate new and copy unmodified data */ + /* Write to existing page, allocate new and copy unmodified data */ ret = spiffs_page_data_check(fs, fobj, orig_data_pgndx, data_spndx); - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + ferr("ERROR: spiffs_page_data_check() failed: %d\n", ret); + return ret; + } - ret = - spiffs_page_allocate_data(fs, fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, - &p_hdr, 0, 0, 0, 0, &data_pgndx); - if (ret != OK) - break; + ret = spiffs_page_allocate_data(fs, + fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, + &phdr, 0, 0, 0, 0, &data_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_page_allocate_data() failed: %d\n", ret); + break; + } - /* copy unmodified data */ + /* Copy unmodified data */ if (page_offs > 0) { - /* before modification */ + /* Before modification */ ret = spiffs_phys_cpy(fs, fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + sizeof(struct spiffs_page_header_s), SPIFFS_PAGE_TO_PADDR(fs, orig_data_pgndx) + sizeof(struct spiffs_page_header_s), page_offs); - if (ret != OK) - break; + if (ret < 0) + { + ferr("ERROR: spiffs_phys_cpy() failed: %d\n", ret); + break; + } } + if (page_offs + to_write < SPIFFS_DATA_PAGE_SIZE(fs)) { - /* after modification */ + /* After modification */ ret = spiffs_phys_cpy(fs, fobj->objid, - SPIFFS_PAGE_TO_PADDR(fs, - data_pgndx) + + SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + sizeof(struct spiffs_page_header_s) + page_offs + - to_write, SPIFFS_PAGE_TO_PADDR(fs, - orig_data_pgndx) + to_write, + SPIFFS_PAGE_TO_PADDR(fs, orig_data_pgndx) + sizeof(struct spiffs_page_header_s) + page_offs + to_write, - SPIFFS_DATA_PAGE_SIZE(fs) - (page_offs + - to_write)); - if (ret != OK) + SPIFFS_DATA_PAGE_SIZE(fs) - + (page_offs + to_write)); + if (ret < 0) { + ferr("ERROR: spiffs_phys_cpy() failed: %d\n", ret); break; } } ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + - sizeof(struct spiffs_page_header_s) + page_offs, to_write, - &data[written]); - if (ret != OK) + fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + + sizeof(struct spiffs_page_header_s) + page_offs, + to_write, &data[written]); + if (ret < 0) { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); break; } - p_hdr.flags &= ~SPIFFS_PH_FLAG_FINAL; + phdr.flags &= ~SPIFFS_PH_FLAG_FINAL; ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + - offsetof(struct spiffs_page_header_s, flags), sizeof(uint8_t), - (uint8_t *) & p_hdr.flags); - if (ret != OK) + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + + offsetof(struct spiffs_page_header_s, flags), + sizeof(uint8_t), (FAR uint8_t *)&phdr.flags); + if (ret < 0) { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); break; } - finfo("modify: store to existing data page, src=%04x" - ", dst=%04x:%04x offset:%d" - ", len=%d, written=%d\n", - orig_data_pgndx, data_pgndx, data_spndx, page_offs, to_write, - written); + finfo("Store to existing data page, src=%04x, dest=%04x:%04x " + "offset=%d, len=%d, written=%d\n", + orig_data_pgndx, data_pgndx, data_spndx, page_offs, + to_write, written); } - /* delete original data page */ + /* Delete original data page */ ret = spiffs_page_delete(fs, orig_data_pgndx); if (ret != OK) { + ferr("ERROR: spiffs_page_delete() failed: %d\n", ret); break; } - /* update memory representation of object index page with new data page */ + /* Update memory representation of object index page with new data page */ if (cur_objndx_spndx == 0) { - /* update object index header page */ + /* Update object index header page */ - ((int16_t *) ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s)))[data_spndx] - = data_pgndx; - finfo("modify: wrote page %04x to objhdr entry " - "%04x in mem\n", data_pgndx, data_spndx); + ((FAR int16_t *)((FAR uint8_t *)objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx] = data_pgndx; + + finfo("Wrote page %04x to objhdr entry=%04x in mem\n", + data_pgndx, data_spndx); } else { - /* update object index page */ + /* Update object index page */ - ((int16_t *) ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix))) - [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = data_pgndx; - finfo("modify: wrote page %04x to objndx entry " - "%04x in mem\n", data_pgndx, - (int16_t) SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)); + ((FAR int16_t *)((FAR uint8_t *)objndx + + sizeof(struct spiffs_page_objndx_s)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = + data_pgndx; + + finfo("Wrote page %04x to objndx entry %04x in mem\n", + data_pgndx, (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)); } - /* update internals */ + /* Update internals */ page_offs = 0; data_spndx++; - written += to_write; + written += to_write; } - fobj->offset = offset + written; + fobj->offset = offset + written; fobj->objndx_pgndx = cur_objndx_pgndx; fobj->objndx_spndx = cur_objndx_spndx; - /* finalize updated object indices */ + /* Finalize updated object indices */ - int res2 = OK; + ret2 = OK; if (cur_objndx_spndx != 0) { - /* wrote beyond object index header page. Write last modified object + int16_t new_objndx_pgndx; + + /* Wrote beyond object index header page. Write last modified object * index page. Move and update page */ - int16_t new_objndx_pgndx; + ret2 = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, + cur_objndx_spndx); + if (ret2 < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", ret2); + return ret2; + } - res2 = spiffs_page_index_check(fs, fobj, cur_objndx_pgndx, cur_objndx_spndx); - SPIFFS_CHECK_RES(res2); + ret2 = spiffs_page_move(fs, fobj->objid, (uint8_t *) objndx, + fobj->objid, 0, cur_objndx_pgndx, + &new_objndx_pgndx); + + finfo("Store modified objndx page, %04x:%04x, written=%d\n", + new_objndx_pgndx, cur_objndx_spndx, written); - res2 = spiffs_page_move(fs, fobj->objid, (uint8_t *) objndx, fobj->objid, 0, - cur_objndx_pgndx, &new_objndx_pgndx); - finfo("modify: store modified objndx page, %04x:%04x" - ", written=%d\n", new_objndx_pgndx, cur_objndx_spndx, - written); fobj->objndx_pgndx = new_objndx_pgndx; fobj->objndx_spndx = cur_objndx_spndx; - SPIFFS_CHECK_RES(res2); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) objndx, - SPIFFS_EV_IX_UPD, fobj->objid, objndx->p_hdr.spndx, - new_objndx_pgndx, 0); + if (ret2 < 0) + { + ferr("ERROR: spiffs_page_move() failed: %d\n", ret2); + return ret2; + } + + spiffs_object_event(fs, (FAR struct spiffs_page_objndx_s *)objndx, + SPIFFS_EV_IX_UPD, fobj->objid, objndx->phdr.spndx, + new_objndx_pgndx, 0); } else { - /* wrote within object index header page */ + /* Wrote within object index header page */ - res2 = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, + ret2 = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, fobj->objhdr_pgndx, fs->work, 0, 0, &new_objhdr_pgndx); - finfo("modify: store modified objhdr page, %04x:" - "%04x, written=%d\n", new_objhdr_pgndx, 0, - written); - SPIFFS_CHECK_RES(res2); + + finfo("Store modified objhdr page, %04x:%04x, written=%d\n", + new_objhdr_pgndx, 0, written); + + if (ret2 < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret2); + return ret2; + } } return ret; @@ -2241,16 +2673,19 @@ int spiffs_find_objhdr_pgndx(FAR struct spiffs_s *fs, { ret = -ENOENT; } + else if (ret < 0) + { + ferr("ERROR: spiffs_foreach_objlu() failed: %d\n", ret); + return ret; + } - SPIFFS_CHECK_RES(ret); - - if (pgndx) + if (pgndx != NULL) { *pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); } fs->lu_blkndx = blkndx; - fs->lu_entry = entry; + fs->lu_entry = entry; return ret; } @@ -2268,6 +2703,15 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, off_t new_size, bool remove_full) { + FAR struct spiffs_pgobj_ndxheader_s *objhdr; + FAR struct spiffs_page_objndx_s *objndx; + uint32_t cur_size; + int16_t objndx_pgndx; + int16_t data_spndx; + int16_t cur_objndx_spndx; + int16_t prev_objndx_spndx; + int16_t data_pgndx; + int16_t new_objhdr_pgndx; int ret = OK; /* If the file has zero (or undefined) length and we were not asked to @@ -2281,42 +2725,55 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, return ret; } - /* need 2 pages if not removing: object index page + possibly chopped data + /* Need 2 pages if not removing: object index page + possibly chopped data * page */ if (!remove_full) { ret = spiffs_gc_check(fs, SPIFFS_DATA_PAGE_SIZE(fs) * 2); - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + ferr("ERROR: spiffs_gc_check() failed: %d\n", ret); + return ret; + } } - int16_t objndx_pgndx = fobj->objhdr_pgndx; - int16_t data_spndx = - (fobj->size > 0 ? fobj->size - 1 : 0) / SPIFFS_DATA_PAGE_SIZE(fs); - uint32_t cur_size = fobj->size == (uint32_t) SPIFFS_UNDEFINED_LEN ? 0 : fobj->size; - int16_t cur_objndx_spndx = 0; - int16_t prev_objndx_spndx = (int16_t) - 1; - FAR struct spiffs_pgobj_ixheader_s *objhdr = - (FAR struct spiffs_pgobj_ixheader_s *) fs->work; - spiffs_page_object_ix *objndx = (spiffs_page_object_ix *) fs->work; - int16_t data_pgndx; - int16_t new_objhdr_pgndx; + objhdr = (FAR struct spiffs_pgobj_ndxheader_s *)fs->work; + objndx = (FAR struct spiffs_page_objndx_s *)fs->work; + objndx_pgndx = fobj->objhdr_pgndx; + cur_objndx_spndx = 0; + prev_objndx_spndx = (int16_t)-1; - /* before truncating, check if object is to be fully removed and mark this */ + data_spndx = 0; + if (fobj->size > 0) + { + data_spndx = (fobj->size - 1) / SPIFFS_DATA_PAGE_SIZE(fs); + } + + cur_size = 0; + if (fobj->size != (uint32_t)SPIFFS_UNDEFINED_LEN) + { + cur_size = fobj->size; + } + + /* Before truncating, check if object is to be fully removed and mark this */ if (remove_full && new_size == 0) { - uint8_t flags = - ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | - SPIFFS_PH_FLAG_IXDELE); - ret = - spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, fobj->objid, - SPIFFS_PAGE_TO_PADDR(fs, - fobj->objhdr_pgndx) + - offsetof(struct spiffs_page_header_s, flags), sizeof(uint8_t), - (uint8_t *) & flags); - SPIFFS_CHECK_RES(ret); + uint8_t flags = ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_INDEX | + SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE); + + ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, fobj->objhdr_pgndx) + + offsetof(struct spiffs_page_header_s, flags), + sizeof(uint8_t), (FAR uint8_t *)&flags); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); + return ret; + } } /* Delete from end of object until desired len is reached */ @@ -2331,50 +2788,67 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, { if (prev_objndx_spndx != (int16_t)- 1) { - /* remove previous object index page */ + /* Remove previous object index page */ - finfo("truncate: delete objndx page %04x:%04x\n", + finfo("Delete objndx page %04x:%04x\n", objndx_pgndx, prev_objndx_spndx); - ret = spiffs_page_index_check(fs, fobj, objndx_pgndx, prev_objndx_spndx); - SPIFFS_CHECK_RES(ret); + ret = spiffs_page_index_check(fs, fobj, objndx_pgndx, + prev_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", + ret); + return ret; + } ret = spiffs_page_delete(fs, objndx_pgndx); - SPIFFS_CHECK_RES(ret); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) 0, - SPIFFS_EV_IX_DEL, fobj->objid, - objndx->p_hdr.spndx, objndx_pgndx, 0); + if (ret < 0) + { + ferr("ERROR: spiffs_page_delete() failed: %d\n", ret); + return ret; + } + + spiffs_object_event(fs, NULL, SPIFFS_EV_IX_DEL, fobj->objid, + objndx->phdr.spndx, objndx_pgndx, 0); if (prev_objndx_spndx > 0) { - /* Update object index header page, unless we totally want to - * remove the file. - * If fully removing, we're not keeping consistency as good - * as when storing the header between chunks, + /* Update object index header page, unless we totally want + * to remove the file. + * + * If fully removing, we're not keeping consistency as + * good as when storing the header between chunks, * would we be aborted. But when removing full files, a - * crammed system may otherwise - * report ERR_FULL a la windows. We cannot have that. - * Hence, take the risk - if aborted, a file check would free - * the lost pages and mend things - * as the file is marked as fully deleted in the beginning. + * crammed system may otherwise report ERR_FULL a la + * windows. We cannot have that. Hence, take the risk - + * if aborted, a file check would free the lost pages and + * mend things as the file is marked as fully deleted in + * the beginning. */ if (!remove_full) { - finfo("truncate: update objndx hdr page %04x" - ":%04x to size=%d\n", - fobj->objhdr_pgndx, prev_objndx_spndx, cur_size); - ret = - spiffs_object_update_index_hdr(fs, fobj, fobj->objid, - fobj->objhdr_pgndx, 0, 0, - cur_size, &new_objhdr_pgndx); - SPIFFS_CHECK_RES(ret); + finfo("Update objndx hdr page %04x:%04x to size=%d\n", + fobj->objhdr_pgndx, prev_objndx_spndx, cur_size); + + ret = spiffs_object_update_index_hdr(fs, fobj, + fobj->objid, + fobj->objhdr_pgndx, + 0, 0, cur_size, + &new_objhdr_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret); + return ret; + } } fobj->size = cur_size; } } - /* load current object index (header) page */ + /* Load current object index (header) page */ if (cur_objndx_spndx == 0) { @@ -2382,77 +2856,93 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, } else { - ret = - spiffs_obj_lu_find_id_and_span(fs, - fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, - cur_objndx_spndx, 0, &objndx_pgndx); - SPIFFS_CHECK_RES(ret); + ret = spiffs_objlu_find_id_and_span(fs, + fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, + cur_objndx_spndx, 0, + &objndx_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", + ret); + return ret; + } + } + + finfo("Load objndx page %04x:%04x for data spndx=%04x\n", + objndx_pgndx, cur_objndx_spndx, data_spndx); + + ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + if (ret < 0) + { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); + return ret; + } + + ret = spiffs_validate_objix(&objhdr->phdr, fobj->objid, + cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; } - finfo("truncate: load objndx page %04x:%04x" - " for data spndx=%04x\n", objndx_pgndx, - cur_objndx_spndx, data_spndx); - ret = - spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, fobj->objid, - SPIFFS_PAGE_TO_PADDR(fs, objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); - SPIFFS_CHECK_RES(ret); - SPIFFS_VALIDATE_OBJIX(objhdr->p_hdr, fobj->objid, cur_objndx_spndx); fobj->objndx_pgndx = objndx_pgndx; fobj->objndx_spndx = cur_objndx_spndx; - fobj->offset = cur_size; + fobj->offset = cur_size; - prev_objndx_spndx = cur_objndx_spndx; + prev_objndx_spndx = cur_objndx_spndx; } if (cur_objndx_spndx == 0) { - /* get data page from object index header page */ + /* Get data page from object index header page */ data_pgndx = - ((int16_t *) ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s))) - [data_spndx]; - ((int16_t *) ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s)))[data_spndx] - = SPIFFS_OBJ_ID_FREE; + ((FAR int16_t *)((FAR uint8_t *) objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx]; + + ((FAR int16_t *)((FAR uint8_t *)objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx] = + SPIFFS_OBJ_ID_FREE; } else { - /* get data page from object index page */ + /* Get data page from object index page */ data_pgndx = - ((int16_t *) ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix))) - [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; - ((int16_t *) ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix))) - [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = SPIFFS_OBJ_ID_FREE; + ((FAR int16_t *)((FAR uint8_t *)objndx + + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; + + ((FAR int16_t *)((FAR uint8_t *)objndx + + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = SPIFFS_OBJ_ID_FREE; } - finfo("truncate: got data pgndx %04x\n", data_pgndx); + finfo("Got data pgndx %04x\n", data_pgndx); if (new_size == 0 || remove_full || cur_size - new_size >= SPIFFS_DATA_PAGE_SIZE(fs)) { - /* delete full data page */ + /* Delete full data page */ ret = spiffs_page_data_check(fs, fobj, data_pgndx, data_spndx); if (ret != SPIFFS_ERR_DELETED && ret != OK && ret != SPIFFS_ERR_INDEX_REF_FREE) { - finfo("truncate: err validating data pgndx=%d\n", - ret); + ferr("ERROR: Failed to validate data pgndx=%d\n", ret); break; } - if (ret == OK) + if (ret >= 0) { ret = spiffs_page_delete(fs, data_pgndx); - if (ret != OK) + if (ret < 0) { - finfo("truncate: err deleting data pgndx=%d\n", - ret); + ferr("ERROR: Failed to delete data pgndx=%d\n", ret); break; } } @@ -2462,7 +2952,7 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, ret = OK; } - /* update current size */ + /* Update current size */ if (cur_size % SPIFFS_DATA_PAGE_SIZE(fs) == 0) { @@ -2476,100 +2966,106 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, fobj->size = cur_size; fobj->offset = cur_size; - finfo("truncate: delete data page %04x for data spndx:" - "%04x, cur_size=%d\n", data_pgndx, data_spndx, - cur_size); + finfo("Delete data page %04x for data spndx=%04x, cur_size=%d\n", + data_pgndx, data_spndx, cur_size); } else { - /* delete last page, partially */ - - struct spiffs_page_header_s p_hdr; + struct spiffs_page_header_s phdr; int16_t new_data_pgndx; - uint32_t bytes_to_remove = + uint32_t bytes_to_remove; + + /* Delete last page, partially */ + + bytes_to_remove = SPIFFS_DATA_PAGE_SIZE(fs) - (new_size % SPIFFS_DATA_PAGE_SIZE(fs)); - finfo("truncate: delete %d bytes from data page " - "%04x for data spndx=%04x, cur_size:" - "%d\n", bytes_to_remove, data_pgndx, data_spndx, - cur_size); + + finfo("Delete %d bytes from data page=%04x for data spndx=%04x, cur_size=%d\n", + bytes_to_remove, data_pgndx, data_spndx, cur_size); ret = spiffs_page_data_check(fs, fobj, data_pgndx, data_spndx); - if (ret != OK) + if (ret < 0) { + ferr("ERROR: spiffs_page_data_check() failed: %d\n", ret); break; } - p_hdr.objid = fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG; - p_hdr.spndx = data_spndx; - p_hdr.flags = 0xff; + phdr.objid = fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG; + phdr.spndx = data_spndx; + phdr.flags = 0xff; - /* allocate new page and copy unmodified data */ + /* Allocate new page and copy unmodified data */ - ret = - spiffs_page_allocate_data(fs, fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, - &p_hdr, 0, 0, 0, 0, &new_data_pgndx); - if (ret != OK) + ret = spiffs_page_allocate_data(fs, + fobj->objid & ~SPIFFS_OBJ_ID_IX_FLAG, + &phdr, 0, 0, 0, 0, + &new_data_pgndx); + if (ret < 0) { + ferr("ERROR: spiffs_page_allocate_data() failed: %d\n", ret); break; } ret = spiffs_phys_cpy(fs, 0, - SPIFFS_PAGE_TO_PADDR(fs, - new_data_pgndx) + + SPIFFS_PAGE_TO_PADDR(fs, new_data_pgndx) + sizeof(struct spiffs_page_header_s), - SPIFFS_PAGE_TO_PADDR(fs, - data_pgndx) + + SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + sizeof(struct spiffs_page_header_s), SPIFFS_DATA_PAGE_SIZE(fs) - bytes_to_remove); - if (ret != OK) + if (ret < 0) { + ferr("ERROR: spiffs_phys_cpy() failed: %d\n", ret); break; } - /* delete original data page */ + /* Delete original data page */ ret = spiffs_page_delete(fs, data_pgndx); - if (ret != OK) + if (ret < 0) { + ferr("ERROR: spiffs_page_delete() failed: %d\n", ret); break; } - p_hdr.flags &= ~SPIFFS_PH_FLAG_FINAL; + phdr.flags &= ~SPIFFS_PH_FLAG_FINAL; ret = spiffs_cache_write(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, new_data_pgndx) + - offsetof(struct spiffs_page_header_s, flags), sizeof(uint8_t), - (uint8_t *) & p_hdr.flags); - if (ret != OK) + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, new_data_pgndx) + + offsetof(struct spiffs_page_header_s, flags), + sizeof(uint8_t), (FAR uint8_t *)&phdr.flags); + if (ret < 0) { + ferr("ERROR: spiffs_cache_write() failed: %d\n", ret); break; } - /* update memory representation of object index page with new data + /* Update memory representation of object index page with new data * page */ if (cur_objndx_spndx == 0) { - /* update object index header page */ + /* Update object index header page */ - ((int16_t *) ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s))) - [data_spndx] = new_data_pgndx; - finfo("truncate: wrote page %04x" - " to objhdr entry %04x in mem\n", - new_data_pgndx, (int16_t) SPIFFS_OBJ_IX_ENTRY(fs, - data_spndx)); + ((FAR int16_t *)((FAR uint8_t *) objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx] = + new_data_pgndx; + + finfo("Wrote page=%04x to objhdr entry %04x in mem\n", + new_data_pgndx, + (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)); } else { - /* update object index page */ + /* Update object index page */ - ((int16_t *) ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix))) - [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = new_data_pgndx; - finfo("truncate: wrote page %04x to objndx entry " - "%04x in mem\n", new_data_pgndx, - (int16_t) SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)); + ((FAR int16_t *)((FAR uint8_t *)objndx + + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)] = new_data_pgndx; + + finfo("Wrote page %04x to objndx entry=%04x in mem\n", + new_data_pgndx, + (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)); } cur_size = new_size; @@ -2581,87 +3077,124 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, data_spndx--; } - /* update object indices */ + /* Update object indices */ if (cur_objndx_spndx == 0) { - /* update object index header page */ + /* Update object index header page */ if (cur_size == 0) { if (remove_full) { - /* remove object altogether */ + /* Femove object altogether */ - finfo("truncate: remove object index header page %04x" - "\n", objndx_pgndx); + finfo("Femove object index header page=%04x\n", objndx_pgndx); ret = spiffs_page_index_check(fs, fobj, objndx_pgndx, 0); - SPIFFS_CHECK_RES(ret); + if (ret < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", + ret); + return ret; + } ret = spiffs_page_delete(fs, objndx_pgndx); - SPIFFS_CHECK_RES(ret); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) 0, - SPIFFS_EV_IX_DEL, fobj->objid, 0, objndx_pgndx, - 0); + if (ret < 0) + { + ferr("ERROR: spiffs_page_delete() failed: %d\n", ret); + return ret; + } + + spiffs_object_event(fs, NULL, SPIFFS_EV_IX_DEL, fobj->objid, + 0, objndx_pgndx, 0); } else { - /* make uninitialized object */ + /* Make uninitialized object */ - finfo("truncate: reset objhdr page %04x\n", - objndx_pgndx); - memset(fs->work + sizeof(struct spiffs_pgobj_ixheader_s), 0xff, + finfo("Reset objhdr page=%04x\n", objndx_pgndx); + + memset(fs->work + sizeof(struct spiffs_pgobj_ndxheader_s), + 0xff, SPIFFS_CFG_LOG_PAGE_SZ(fs) - - sizeof(struct spiffs_pgobj_ixheader_s)); - ret = - spiffs_object_update_index_hdr(fs, fobj, fobj->objid, objndx_pgndx, - fs->work, 0, SPIFFS_UNDEFINED_LEN, - &new_objhdr_pgndx); - SPIFFS_CHECK_RES(ret); + sizeof(struct spiffs_pgobj_ndxheader_s)); + + ret = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, + objndx_pgndx, fs->work, + 0, SPIFFS_UNDEFINED_LEN, + &new_objhdr_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret); + return ret; + } } } else { - /* update object index header page */ + /* Update object index header page */ - finfo("truncate: update object index header page with indices and size\n"); - ret = - spiffs_object_update_index_hdr(fs, fobj, fobj->objid, objndx_pgndx, - fs->work, 0, cur_size, - &new_objhdr_pgndx); - SPIFFS_CHECK_RES(ret); + finfo("Update object index header page with indices and size\n"); + + ret = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, + objndx_pgndx, fs->work, 0, + cur_size, &new_objhdr_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", + ret); + return ret; + } } } else { - /* update both current object index page and object index header page */ - int16_t new_objndx_pgndx; - ret = spiffs_page_index_check(fs, fobj, objndx_pgndx, cur_objndx_spndx); - SPIFFS_CHECK_RES(ret); + /* Update both current object index page and object index header page */ - /* move and update object index page */ + ret = spiffs_page_index_check(fs, fobj, objndx_pgndx, + cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_page_index_check() failed: %d\n", ret); + return ret; + } + + /* Move and update object index page */ + + ret = spiffs_page_move(fs, fobj->objid, (FAR uint8_t *)objhdr, + fobj->objid, 0, objndx_pgndx, + &new_objndx_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_page_move() failed: %d\n", ret); + return ret; + } + + spiffs_object_event(fs, (FAR struct spiffs_page_objndx_s *)objhdr, + SPIFFS_EV_IX_UPD, fobj->objid, objndx->phdr.spndx, + new_objndx_pgndx, 0); + + finfo("Store modified objndx page, %04x:%04x\n", + new_objndx_pgndx, cur_objndx_spndx); - ret = spiffs_page_move(fs, fobj->objid, (uint8_t *) objhdr, fobj->objid, 0, - objndx_pgndx, &new_objndx_pgndx); - SPIFFS_CHECK_RES(ret); - spiffs_cb_object_event(fs, (spiffs_page_object_ix *) objhdr, - SPIFFS_EV_IX_UPD, fobj->objid, objndx->p_hdr.spndx, - new_objndx_pgndx, 0); - finfo("truncate: store modified objndx page, %04x:%04x" - "\n", new_objndx_pgndx, cur_objndx_spndx); fobj->objndx_pgndx = new_objndx_pgndx; fobj->objndx_spndx = cur_objndx_spndx; - fobj->offset = cur_size; + fobj->offset = cur_size; - /* update object index header page with new size */ + /* Update object index header page with new size */ ret = spiffs_object_update_index_hdr(fs, fobj, fobj->objid, - fobj->objhdr_pgndx, 0, 0, cur_size, - &new_objhdr_pgndx); - SPIFFS_CHECK_RES(ret); + fobj->objhdr_pgndx, 0, 0, + cur_size, &new_objhdr_pgndx); + if (ret < 0) + { + ferr("ERROR: spiffs_object_update_index_hdr() failed: %d\n", ret); + return ret; + } } fobj->size = cur_size; @@ -2677,25 +3210,33 @@ int spiffs_object_truncate(FAR struct spiffs_s *fs, ssize_t spiffs_object_read(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, off_t offset, - size_t len, FAR uint8_t *dst) + size_t len, FAR uint8_t *dest) { + FAR struct spiffs_pgobj_ndxheader_s *objhdr; + FAR struct spiffs_page_objndx_s *objndx ; + uint32_t cur_offset; int16_t objndx_pgndx; int16_t data_pgndx; - int16_t data_spndx = offset / SPIFFS_DATA_PAGE_SIZE(fs); - uint32_t cur_offset = offset; + int16_t data_spndx; int16_t cur_objndx_spndx; - int16_t prev_objndx_spndx = (int16_t) - 1; - FAR struct spiffs_pgobj_ixheader_s *objhdr = - (FAR struct spiffs_pgobj_ixheader_s *) fs->work; - spiffs_page_object_ix *objndx = (spiffs_page_object_ix *) fs->work; + int16_t prev_objndx_spndx; int ret = OK; + objhdr = (FAR struct spiffs_pgobj_ndxheader_s *)fs->work; + objndx = (FAR struct spiffs_page_objndx_s *)fs->work; + + data_spndx = offset / SPIFFS_DATA_PAGE_SIZE(fs); + cur_offset = offset; + prev_objndx_spndx = (int16_t)-1; + while (cur_offset < offset + len) { + uint32_t len_to_read; + cur_objndx_spndx = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spndx); if (prev_objndx_spndx != cur_objndx_spndx) { - /* load current object index (header) page */ + /* Load current object index (header) page */ if (cur_objndx_spndx == 0) { @@ -2703,37 +3244,48 @@ ssize_t spiffs_object_read(FAR struct spiffs_s *fs, } else { - finfo("read: find objndx %04x:%04x\n", + finfo("Find objndx %04x:%04x\n", fobj->objid, cur_objndx_spndx); + if (fobj->objndx_spndx == cur_objndx_spndx) { objndx_pgndx = fobj->objndx_pgndx; } else { - ret = spiffs_obj_lu_find_id_and_span(fs, - fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, - cur_objndx_spndx, 0, - &objndx_pgndx); + ret = spiffs_objlu_find_id_and_span(fs, + fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, + cur_objndx_spndx, 0, + &objndx_pgndx); if (ret < 0) { + ferr("ERROR: spiffs_objlu_find_id_and_span() failed: %d\n", + ret); return ret; } } } - finfo("read: load objndx page %d:%d for data spndx=%d\n", + finfo("Load objndx page %d:%d for data spndx=%d\n", objndx_pgndx, cur_objndx_spndx, data_spndx); ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, objndx_pgndx), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, objndx_pgndx), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); if (ret < 0) { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); return ret; } - SPIFFS_VALIDATE_OBJIX(objndx->p_hdr, fobj->objid, cur_objndx_spndx); + ret = spiffs_validate_objix(&objndx->phdr, fobj->objid, + cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; + } fobj->offset = cur_offset; fobj->objndx_pgndx = objndx_pgndx; @@ -2745,22 +3297,23 @@ ssize_t spiffs_object_read(FAR struct spiffs_s *fs, { /* Get data page from object index header page */ - data_pgndx = ((int16_t *) - ((uint8_t *) objhdr + - sizeof(struct spiffs_pgobj_ixheader_s)))[data_spndx]; + data_pgndx = + ((FAR int16_t *)((FAR uint8_t *)objhdr + + sizeof(struct spiffs_pgobj_ndxheader_s)))[data_spndx]; } else { /* Get data page from object index page */ - data_pgndx = ((int16_t *) - ((uint8_t *) objndx + - sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; + data_pgndx = + ((FAR int16_t *)((FAR uint8_t *) objndx + + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, data_spndx)]; } /* All remaining data */ - uint32_t len_to_read = offset + len - cur_offset; + len_to_read = offset + len - cur_offset; /* Remaining data in page */ @@ -2772,7 +3325,7 @@ ssize_t spiffs_object_read(FAR struct spiffs_s *fs, len_to_read = MIN(len_to_read, fobj->size); - finfo("read: offset=%d rd=%d data spndx=%d is data_pgndx=%d addr=%p\n", + finfo("Read offset=%d rd=%d data spndx=%d is data_pgndx=%d addr=%p\n", cur_offset, len_to_read, data_spndx, data_pgndx, (SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + sizeof(struct spiffs_page_header_s) + @@ -2787,21 +3340,24 @@ ssize_t spiffs_object_read(FAR struct spiffs_s *fs, ret = spiffs_page_data_check(fs, fobj, data_pgndx, data_spndx); if (ret < 0) { + ferr("ERROR: spiffs_page_data_check() failed: %d\n", ret); return ret; } ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ, - fobj->objid, SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + - sizeof(struct spiffs_page_header_s) + - (cur_offset % SPIFFS_DATA_PAGE_SIZE(fs)), len_to_read, - dst); + fobj->objid, + SPIFFS_PAGE_TO_PADDR(fs, data_pgndx) + + sizeof(struct spiffs_page_header_s) + + (cur_offset % SPIFFS_DATA_PAGE_SIZE(fs)), + len_to_read, dest); if (ret < 0) { + ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); return ret; } - dst += len_to_read; - cur_offset += len_to_read; + dest += len_to_read; + cur_offset += len_to_read; fobj->offset = cur_offset; data_spndx++; } @@ -2810,7 +3366,7 @@ ssize_t spiffs_object_read(FAR struct spiffs_s *fs, } /**************************************************************************** - * Name: spiffs_obj_lu_find_free_objid + * Name: spiffs_objlu_find_free_objid * * Description: * Scans thru all object lookup for object index header pages. If total @@ -2821,52 +3377,62 @@ ssize_t spiffs_object_read(FAR struct spiffs_s *fs, * ****************************************************************************/ -int spiffs_obj_lu_find_free_objid(FAR struct spiffs_s *fs, int16_t *objid, +int spiffs_objlu_find_free_objid(FAR struct spiffs_s *fs, int16_t *objid, FAR const uint8_t *conflicting_name) { - uint32_t max_objects = (fs->geo.neraseblocks * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) / 2; + uint32_t max_objects; struct spiffs_free_objid_s state; - int16_t free_objid = SPIFFS_OBJ_ID_FREE; + int16_t free_objid; int ret = OK; + max_objects = (fs->geo.neraseblocks * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) / 2; + free_objid = SPIFFS_OBJ_ID_FREE; + state.min_objid = 1; state.max_objid = max_objects + 1; - if (state.max_objid & SPIFFS_OBJ_ID_IX_FLAG) + + if ((state.max_objid & SPIFFS_OBJ_ID_IX_FLAG) != 0) { state.max_objid = ((int16_t) - 1) & ~SPIFFS_OBJ_ID_IX_FLAG; } state.compaction = 0; state.conflicting_name = conflicting_name; - while (ret == OK && free_objid == SPIFFS_OBJ_ID_FREE) + + while (ret >= 0 && free_objid == SPIFFS_OBJ_ID_FREE) { if (state.max_objid - state.min_objid <= - (int16_t) SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8) + (int16_t)SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8) { - /* possible to represent in bitmap */ + uint32_t i; + uint32_t j; - uint32_t i, j; - finfo("free_objid: BITM min=%04x max=%04x\n", - state.min_objid, state.max_objid); + /* Possible to represent in bitmap */ + + finfo("BITM min=%04x max=%04x\n", + state.min_objid, state.max_objid); memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs)); - ret = - spiffs_foreach_objlu(fs, 0, 0, 0, 0, - spiffs_obj_lu_find_free_objid_bitmap_v, - conflicting_name, - &state.min_objid, 0, 0); + ret = spiffs_foreach_objlu(fs, 0, 0, 0, 0, + spiffs_objlu_find_free_objid_bitmap_callback, + conflicting_name, &state.min_objid, + 0, 0); if (ret == SPIFFS_VIS_END) { ret = OK; } + else if (ret < 0) + { + ferr("ERROR: spiffs_foreach_objlu() failed: %d\n", ret); + return ret; + } - SPIFFS_CHECK_RES(ret); - - /* traverse bitmask until found free objid */ + /* Traverse bitmask until found free objid */ for (i = 0; i < SPIFFS_CFG_LOG_PAGE_SZ(fs); i++) { uint8_t mask = fs->work[i]; + if (mask == 0xff) { continue; @@ -2886,22 +3452,28 @@ int spiffs_obj_lu_find_free_objid(FAR struct spiffs_s *fs, int16_t *objid, } else { - /* not possible to represent all ids in range in a bitmap, compact + /* Not possible to represent all ids in range in a bitmap, compact * and count */ if (state.compaction != 0) { - /* select element in compacted table, decrease range and + uint32_t i; + uint32_t min_i; + uint8_t *map; + uint8_t min_count; + + /* Select element in compacted table, decrease range and * recompact */ - uint32_t i; - uint32_t min_i = 0; - uint8_t *map = (uint8_t *) fs->work; - uint8_t min_count = 0xff; + min_i = 0; + map = (uint8_t *) fs->work; + min_count = 0xff; - for (i = 0; i < SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(uint8_t); i++) + for (i = 0; + i < SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(uint8_t); + i++) { if (map[i] < min_count) { @@ -2916,71 +3488,74 @@ int spiffs_obj_lu_find_free_objid(FAR struct spiffs_s *fs, int16_t *objid, if (min_count == state.compaction) { - /* there are no free objids! */ + /* There are no free objids! */ - finfo("free_objid: compacted table is full\n"); + fwarn("WARNING: Compacted table is full\n"); return -ENOSPC; } - finfo("free_objid: COMP select index:%d" - " min_count=%d min=%04x max:" - "%04x compact:%d\n", min_i, min_count, - state.min_objid, state.max_objid, state.compaction); + finfo("COMP select index=%d min_count=%d min=%04x max=%04x compact:%d\n", + min_i, min_count, state.min_objid, state.max_objid, + state.compaction); if (min_count == 0) { - /* no objid in this range, skip compacting and use directly */ + /* No objid in this range, skip compacting and use directly */ *objid = min_i * state.compaction + state.min_objid; return OK; } else { - finfo("free_objid: COMP SEL chunk=%d min:" - "%04x -> %04x\n", state.compaction, - state.min_objid, - state.min_objid + min_i * state.compaction); - state.min_objid += min_i * state.compaction; - state.max_objid = state.min_objid + state.compaction; + finfo("COMP SEL chunk=%d min=%04x -> %04x\n", + state.compaction, state.min_objid, + state.min_objid + min_i * state.compaction); - /* decrease compaction */ + state.min_objid += min_i * state.compaction; + state.max_objid = state.min_objid + state.compaction; + + /* Decrease compaction */ } if ((state.max_objid - state.min_objid <= - (int16_t) SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8)) + (int16_t)SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8)) { - /* no need for compacting, use bitmap */ + /* No need for compacting, use bitmap */ continue; } } - /* in a work memory of bytes, we may fit in - * ids. NOTE: Currently page size is equivalent to block size. + /* In a work memory of bytes, we may fit in + * IDs. NOTE: Currently page size is equivalent to + * block size. * - * todo what if compaction is > 255 - then we cannot fit it in a byte + * TODO: What if compaction is > 255 - then we cannot fit it in a + * byte */ state.compaction = (state.max_objid - state.min_objid) / ((SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(uint8_t))); - finfo("free_objid: COMP min=%04x max=%04x" - " compact=%d\n", state.min_objid, - state.max_objid, state.compaction); + finfo("COMP min=%04x max=%04x compact=%d\n", + state.min_objid, state.max_objid, state.compaction); memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs)); - ret = - spiffs_foreach_objlu(fs, 0, 0, 0, 0, - spiffs_obj_lu_find_free_objid_compact_v, - &state, 0, 0, 0); + ret = spiffs_foreach_objlu(fs, 0, 0, 0, 0, + spiffs_objlu_find_free_objid_compact_callback, + &state, 0, 0, 0); if (ret == SPIFFS_VIS_END) { ret = OK; } + else if (ret < 0) + { + ferr("ERROR: spiffs_foreach_objlu() failed: %d\n", ret); + return ret; + } - SPIFFS_CHECK_RES(ret); - state.conflicting_name = 0; /* searched for conflicting name once, + state.conflicting_name = 0; /* Searched for conflicting name once, * no need to do it again */ } } diff --git a/fs/spiffs/src/spiffs_core.h b/fs/spiffs/src/spiffs_core.h index 9159a30985..98a5e63cca 100644 --- a/fs/spiffs/src/spiffs_core.h +++ b/fs/spiffs/src/spiffs_core.h @@ -160,6 +160,8 @@ * obj.objid:0123 span.ndx:0005 flags:DATA */ +#define SPIFFS_ERR_INTERNAL (-256) + /* visitor result, continue searching */ #define SPIFFS_VIS_COUNTINUE (SPIFFS_ERR_INTERNAL - 20) @@ -286,12 +288,12 @@ /* entries in an object header page index */ #define SPIFFS_OBJ_HDR_IX_LEN(fs) \ - ((SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(struct spiffs_pgobj_ixheader_s))/sizeof(int16_t)) + ((SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(struct spiffs_pgobj_ndxheader_s))/sizeof(int16_t)) /* entries in an object page index */ #define SPIFFS_OBJ_IX_LEN(fs) \ - ((SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_object_ix))/sizeof(int16_t)) + ((SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(struct spiffs_page_objndx_s))/sizeof(int16_t)) /* object index entry for given data span index */ @@ -343,31 +345,7 @@ #define SPIFFS_PH_FLAG_IXDELE (1<<6) -#define SPIFFS_CHECK_RES(res) \ - do { \ - if ((res) < OK) return (res); \ - } while (0); - -#define SPIFFS_VALIDATE_OBJIX(_ph, _objid, _spndx) \ - if (((_ph).flags & SPIFFS_PH_FLAG_USED) != 0) return SPIFFS_ERR_IS_FREE; \ - if (((_ph).flags & SPIFFS_PH_FLAG_DELET) == 0) return SPIFFS_ERR_DELETED; \ - if (((_ph).flags & SPIFFS_PH_FLAG_FINAL) != 0) return SPIFFS_ERR_NOT_FINALIZED; \ - if (((_ph).flags & SPIFFS_PH_FLAG_INDEX) != 0) return SPIFFS_ERR_NOT_INDEX; \ - if (((_objid) & SPIFFS_OBJ_ID_IX_FLAG) == 0) return SPIFFS_ERR_NOT_INDEX; \ - if ((_ph).spndx != (_spndx)) return SPIFFS_ERR_INDEX_SPAN_MISMATCH; - /* if ((_spndx) == 0 && ((_ph).flags & SPIFFS_PH_FLAG_IXDELE) == 0) return - * SPIFFS_ERR_DELETED; - */ - -#define SPIFFS_VALIDATE_DATA(_ph, _objid, _spndx) \ - if (((_ph).flags & SPIFFS_PH_FLAG_USED) != 0) return SPIFFS_ERR_IS_FREE; \ - if (((_ph).flags & SPIFFS_PH_FLAG_DELET) == 0) return SPIFFS_ERR_DELETED; \ - if (((_ph).flags & SPIFFS_PH_FLAG_FINAL) != 0) return SPIFFS_ERR_NOT_FINALIZED; \ - if (((_ph).flags & SPIFFS_PH_FLAG_INDEX) == 0) return SPIFFS_ERR_IS_INDEX; \ - if ((_objid) & SPIFFS_OBJ_ID_IX_FLAG) return SPIFFS_ERR_IS_INDEX; \ - if ((_ph).spndx != (_spndx)) return SPIFFS_ERR_DATA_SPAN_MISMATCH; - -/* check objid, only visit matching objec ids */ +/* Check objid, only visit matching objec ids */ #define SPIFFS_VIS_CHECK_ID (1<<0) @@ -394,66 +372,68 @@ /* page header, part of each page except object lookup pages * NB: this is always aligned when the data page is an object index, - * as in this case struct spiffs_page_object_ix is used + * as in this case struct spiffs_page_objndx_s is used */ begin_packed_struct struct spiffs_page_header_s { - int16_t objid; /* object objid */ - int16_t spndx; /* object span index */ - uint8_t flags; /* flags */ + int16_t objid; /* object objid */ + int16_t spndx; /* object span index */ + uint8_t flags; /* flags */ } end_packed_struct; /* object index header page header */ -begin_packed_struct struct spiffs_pgobj_ixheader_s +begin_packed_struct struct spiffs_pgobj_ndxheader_s { - struct spiffs_page_header_s p_hdr; /* common page header */ - uint32_t size; /* size of object */ - uint8_t type; /* type of object */ - uint8_t name[CONFIG_SPIFFS_NAME_MAX]; /* name of object */ + struct spiffs_page_header_s phdr; /* common page header */ + uint32_t size; /* size of object */ + uint8_t type; /* type of object */ + uint8_t name[CONFIG_SPIFFS_NAME_MAX]; /* name of object */ } end_packed_struct; /* object index page header */ -typedef begin_packed_struct struct +begin_packed_struct struct spiffs_page_objndx_s { - struct spiffs_page_header_s p_hdr; + struct spiffs_page_header_s phdr; uint8_t _align[4 - ((sizeof(struct spiffs_page_header_s) & 3) == 0 ? 4 : (sizeof(struct spiffs_page_header_s) & 3))]; -} begin_packed_struct spiffs_page_object_ix; +} begin_packed_struct; /* callback func for object lookup visitor */ -typedef int (*spiffs_visitor_f)(FAR struct spiffs_s *fs, int16_t objid, - int16_t blkndx, int ix_entry, - FAR const void *user_const, - FAR void *user_var); +typedef int (*spiffs_callback_t)(FAR struct spiffs_s *fs, int16_t objid, + int16_t blkndx, int entry, + FAR const void *user_const, + FAR void *user_var); /**************************************************************************** * Public Function Prototypes ****************************************************************************/ +int spiffs_validate_objix(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 dst, uint32_t src, uint32_t len); + 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, int starting_lu_entry, uint8_t flags, int16_t objid, - spiffs_visitor_f v, FAR const void *user_const, - FAR void *user_var, FAR int16_t *block_ix, int *lu_entry); + spiffs_callback_t v, FAR const void *user_const, + FAR void *user_var, FAR int16_t *blkndx, int *lu_entry); int spiffs_erase_block(FAR struct spiffs_s *fs, int16_t blkndx); -int spiffs_obj_lu_scan(FAR struct spiffs_s *fs); -int spiffs_obj_lu_find_free_obj_id(FAR struct spiffs_s *fs, +int spiffs_objlu_scan(FAR struct spiffs_s *fs); +int spiffs_objlu_find_free_obj_id(FAR struct spiffs_s *fs, int16_t *objid, FAR const uint8_t *conflicting_name); -int spiffs_obj_lu_find_free(FAR struct spiffs_s *fs, +int spiffs_objlu_find_free(FAR struct spiffs_s *fs, int16_t starting_block, int starting_lu_entry, - FAR int16_t *block_ix, FAR int *lu_entry); -int spiffs_obj_lu_find_id(FAR struct spiffs_s *fs, + FAR int16_t *blkndx, FAR int *lu_entry); +int spiffs_objlu_find_id(FAR struct spiffs_s *fs, int16_t starting_block, int starting_lu_entry, int16_t objid, - FAR int16_t *block_ix, FAR int *lu_entry); -int spiffs_obj_lu_find_id_and_span(FAR struct spiffs_s *fs, + FAR int16_t *blkndx, FAR int *lu_entry); +int spiffs_objlu_find_id_and_span(FAR struct spiffs_s *fs, int16_t objid, int16_t spndx, int16_t exclusion_pgndx, FAR int16_t *pgndx); -int spiffs_obj_lu_find_id_and_span_byphdr(FAR struct spiffs_s *fs, +int spiffs_objlu_find_id_and_span_byphdr(FAR struct spiffs_s *fs, int16_t objid, int16_t spndx, int16_t exclusion_pgndx, FAR int16_t *pgndx); int spiffs_page_allocate_data(FAR struct spiffs_s *fs, @@ -472,8 +452,8 @@ int spiffs_object_update_index_hdr(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, int16_t objid, int16_t objhdr_pgndx, FAR uint8_t *new_objhdr_data, const uint8_t name[], uint32_t size, FAR int16_t *new_pgndx); -void spiffs_cb_object_event(FAR struct spiffs_s *fs, - FAR spiffs_page_object_ix * objndx, int ev, int16_t objid, +void spiffs_object_event(FAR struct spiffs_s *fs, + FAR struct spiffs_page_objndx_s * objndx, int ev, int16_t objid, int16_t spndx, int16_t new_pgndx, uint32_t new_size); int spiffs_object_open_bypage(FAR struct spiffs_s *fs, int16_t pgndx, FAR struct spiffs_file_s *f, uint16_t flags, @@ -483,7 +463,7 @@ int spiffs_object_append(FAR struct spiffs_s *fs, size_t len); ssize_t spiffs_object_read(FAR struct spiffs_s *fs, FAR FAR struct spiffs_file_s *fobj, off_t offset, size_t len, - FAR uint8_t *dst); + FAR uint8_t *dest); int spiffs_object_truncate(FAR struct spiffs_s *fs, FAR struct spiffs_file_s *fobj, off_t new_size, bool remove_full); int spiffs_object_modify(FAR struct spiffs_s *fs, diff --git a/fs/spiffs/src/spiffs_gc.c b/fs/spiffs/src/spiffs_gc.c index 6f00f84c6f..6461c7df89 100644 --- a/fs/spiffs/src/spiffs_gc.c +++ b/fs/spiffs/src/spiffs_gc.c @@ -158,13 +158,13 @@ static int spiffs_gc_erase_block(FAR struct spiffs_s *fs, int16_t blkndx) static int spiffs_gc_epage_stats(FAR struct spiffs_s *fs, int16_t blkndx) { - FAR int16_t *obj_lu_buf = (int16_t *) fs->lu_work; - uint32_t dele = 0; - uint32_t allo = 0; - int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(int16_t)); - int cur_entry = 0; - int obj_lookup_page = 0; - int ret = OK; + FAR int16_t *objlu_buf = (int16_t *) fs->lu_work; + uint32_t dele = 0; + uint32_t allo = 0; + int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(int16_t)); + int cur_entry = 0; + int obj_lookup_page = 0; + int ret = OK; /* Check each object lookup page */ @@ -183,7 +183,7 @@ static int spiffs_gc_epage_stats(FAR struct spiffs_s *fs, int16_t blkndx) cur_entry < (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs))) { - int16_t id = obj_lu_buf[cur_entry - entry_offset]; + int16_t id = objlu_buf[cur_entry - entry_offset]; if (id == SPIFFS_OBJ_ID_FREE) { @@ -233,15 +233,15 @@ static int spiffs_gc_find_candidate(FAR struct spiffs_s *fs, FAR int *candidate_count, bool fs_crammed) { FAR int32_t *cand_scores; - FAR int16_t *obj_lu_buf = (FAR int16_t *)fs->lu_work; + FAR int16_t *objlu_buf = (FAR int16_t *)fs->lu_work; FAR int16_t *cand_blocks; - uint32_t blocks = fs->geo.neraseblocks; - int16_t cur_block = 0; - uint32_t cur_block_addr = 0; + uint32_t blocks = fs->geo.neraseblocks; + int16_t cur_block = 0; + uint32_t cur_block_addr = 0; int entries_per_page; int max_candidates; - int cur_entry = 0; - int ret = OK; + int cur_entry = 0; + int ret = OK; /* Using fs->work area as sorted candidate memory, * (int16_t)cand_blkndx/(int32_t)score @@ -297,7 +297,7 @@ static int spiffs_gc_find_candidate(FAR struct spiffs_s *fs, (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs))) { - int16_t id = obj_lu_buf[cur_entry - entry_offset]; + int16_t id = objlu_buf[cur_entry - entry_offset]; if (id == SPIFFS_OBJ_ID_FREE) { @@ -449,19 +449,22 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) /* This is the global localizer being pushed and popped */ - int cur_entry = 0; - FAR int16_t *obj_lu_buf = (FAR int16_t *)fs->lu_work; struct spiffs_gc_s gc; /* Our stack frame/state */ - int16_t cur_pgndx = 0; - FAR struct spiffs_pgobj_ixheader_s *objhdr = - (FAR struct spiffs_pgobj_ixheader_s *) fs->work; - spiffs_page_object_ix *objndx = (spiffs_page_object_ix *)fs->work; + FAR int16_t *objlu_buf; + FAR struct spiffs_pgobj_ndxheader_s *objhdr; + FAR struct spiffs_page_objndx_s *objndx; + int16_t cur_pgndx = 0; + int cur_entry = 0; spiffs_gcinfo("Cleaning block %04x\n", blkndx); memset(&gc, 0, sizeof(struct spiffs_gc_s)); gc.state = FIND_OBJ_DATA; + objlu_buf = (FAR int16_t *)fs->lu_work; + objhdr = (FAR struct spiffs_pgobj_ndxheader_s *) fs->work; + objndx = (struct spiffs_page_objndx_s *)fs->work; + if (fs->free_blkndx == blkndx) { /* Move free cursor to next block, cannot use free pages from the block @@ -507,7 +510,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs))) { - int16_t id = obj_lu_buf[cur_entry - entry_offset]; + int16_t id = objlu_buf[cur_entry - entry_offset]; cur_pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, cur_entry); @@ -543,13 +546,13 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) if (id == gc.cur_objid) { - struct spiffs_page_header_s p_hdr; + struct spiffs_page_header_s phdr; ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pgndx), sizeof(struct spiffs_page_header_s), - (FAR uint8_t *)&p_hdr); + (FAR uint8_t *)&phdr); if (ret < 0) { ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); @@ -557,9 +560,9 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) } spiffs_gcinfo("Found data page %04x:%04x @%04x\n", - gc.cur_objid, p_hdr.spndx, cur_pgndx); + gc.cur_objid, phdr.spndx, cur_pgndx); - if (SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, p_hdr.spndx) != + if (SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, phdr.spndx) != gc.cur_objndx_spndx) { spiffs_gcinfo("No objndx spndx match, take in another run\n"); @@ -567,15 +570,15 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) else { int16_t new_data_pgndx; - if (p_hdr.flags & SPIFFS_PH_FLAG_DELET) + if (phdr.flags & SPIFFS_PH_FLAG_DELET) { /* Move page */ - ret = spiffs_page_move(fs, 0, 0, id, &p_hdr, + ret = spiffs_page_move(fs, 0, 0, id, &phdr, cur_pgndx, &new_data_pgndx); spiffs_gcinfo("Move objndx=%04x:%04x page=%04x to %04x\n", - gc.cur_objid, p_hdr.spndx, + gc.cur_objid, phdr.spndx, cur_pgndx, new_data_pgndx); if (ret < 0) @@ -607,7 +610,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) */ spiffs_gcinfo("Wipe objndx=%04x:%04x page=%04x\n", - id, p_hdr.spndx, cur_pgndx); + id, phdr.spndx, cur_pgndx); ret = spiffs_page_delete(fs, cur_pgndx); if (ret < 0) @@ -628,24 +631,25 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) /* Update object index header page */ ((FAR int16_t *)((FAR uint8_t *)objhdr + - sizeof(struct spiffs_pgobj_ixheader_s)))[p_hdr.spndx] = + sizeof(struct spiffs_pgobj_ndxheader_s)))[phdr.spndx] = new_data_pgndx; spiffs_gcinfo("Wrote page=%04x to objhdr entry=%04x in mem\n", new_data_pgndx, - (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.spndx)); + (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, phdr.spndx)); } else { /* Update object index page */ ((FAR int16_t *)((FAR uint8_t *)objndx + - sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.spndx)] = - new_data_pgndx; + sizeof(struct spiffs_page_objndx_s))) + [SPIFFS_OBJ_IX_ENTRY(fs, phdr.spndx)] = + new_data_pgndx; spiffs_gcinfo("Wrote page=%04x to objndx entry=%04x in mem\n", new_data_pgndx, - (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.spndx)); + (int16_t)SPIFFS_OBJ_IX_ENTRY(fs, phdr.spndx)); } } } @@ -660,7 +664,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) { /* Found an index object id */ - struct spiffs_page_header_s p_hdr; + struct spiffs_page_header_s phdr; int16_t new_pgndx; /* Load header */ @@ -670,22 +674,22 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pgndx), sizeof(struct spiffs_page_header_s), - (FAR uint8_t *)&p_hdr); + (FAR uint8_t *)&phdr); if (ret < 0) { ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); return ret; } - if (p_hdr.flags & SPIFFS_PH_FLAG_DELET) + if (phdr.flags & SPIFFS_PH_FLAG_DELET) { /* Move page */ - ret = spiffs_page_move(fs, 0, 0, id, &p_hdr, + ret = spiffs_page_move(fs, 0, 0, id, &phdr, cur_pgndx, &new_pgndx); spiffs_gcinfo("Move objndx=%04x:%04x page=%04x to %04x\n", - id, p_hdr.spndx, cur_pgndx, + id, phdr.spndx, cur_pgndx, new_pgndx); if (ret < 0) @@ -694,19 +698,19 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) return ret; } - spiffs_cb_object_event(fs, - (spiffs_page_object_ix *)&p_hdr, - SPIFFS_EV_IX_MOV, id, - p_hdr.spndx, new_pgndx, 0); + spiffs_object_event(fs, + (FAR struct spiffs_page_objndx_s *)&phdr, + SPIFFS_EV_IX_MOV, id, + phdr.spndx, new_pgndx, 0); /* Move wipes obj_lu, reload it */ ret = spiffs_cache_read(fs, - SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, - 0, - blkndx * SPIFFS_CFG_LOG_BLOCK_SZ(fs) + - SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, + 0, + blkndx * SPIFFS_CFG_LOG_BLOCK_SZ(fs) + + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); if (ret < 0) { ferr("ERROR: spiffs_cache_read() failed: %d\n", ret); @@ -721,19 +725,18 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) */ spiffs_gcinfo("Wipe objndx=%04x:%04x page=%04x\n", - id, p_hdr.spndx, cur_pgndx); + id, phdr.spndx, cur_pgndx); ret = spiffs_page_delete(fs, cur_pgndx); if (ret < 0) { - ferr("ERROR: spiffs_cb_object_event() failed: %d\n", ret); + ferr("ERROR: spiffs_object_event() failed: %d\n", ret); return ret; } - spiffs_cb_object_event(fs, NULL, - SPIFFS_EV_IX_DEL, id, - p_hdr.spndx, - cur_pgndx, 0); + spiffs_object_event(fs, NULL, + SPIFFS_EV_IX_DEL, id, + phdr.spndx, cur_pgndx, 0); } } break; @@ -764,7 +767,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) case FIND_OBJ_DATA: if (gc.objid_found) { - struct spiffs_page_header_s p_hdr; + struct spiffs_page_header_s phdr; int16_t objndx_pgndx; /* Handle found data page. Find out corresponding objndx page @@ -778,19 +781,19 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pgndx), sizeof(struct spiffs_page_header_s), - (FAR uint8_t *)&p_hdr); + (FAR uint8_t *)&phdr); if (ret < 0) { - ferr("ERROR: spiffs_cb_object_event() failed: %d\n", ret); + ferr("ERROR: spiffs_object_event() failed: %d\n", ret); return ret; } gc.cur_objndx_spndx = - SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, p_hdr.spndx); + SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, phdr.spndx); spiffs_gcinfo("Find objndx spndx=%04x\n", gc.cur_objndx_spndx); - ret = spiffs_obj_lu_find_id_and_span(fs, + ret = spiffs_objlu_find_id_and_span(fs, gc.cur_objid | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objndx_spndx, 0, &objndx_pgndx); @@ -842,9 +845,15 @@ 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 */ - SPIFFS_VALIDATE_OBJIX(objndx->p_hdr, - gc.cur_objid | SPIFFS_OBJ_ID_IX_FLAG, - gc.cur_objndx_spndx); + ret = spiffs_validate_objix(&objndx->phdr, + gc.cur_objid | SPIFFS_OBJ_ID_IX_FLAG, + gc.cur_objndx_spndx); + if (ret < 0) + { + ferr("ERROR: spiffs_validate_objix() failed: %d\n", ret); + return ret; + } + gc.cur_objndx_pgndx = objndx_pgndx; } else @@ -898,7 +907,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) &new_objndx_pgndx); spiffs_gcinfo("Store modified objndx page=%04x:%04x\n", - new_objndx_pgndx, objndx->p_hdr.spndx); + new_objndx_pgndx, objndx->phdr.spndx); if (ret < 0) { @@ -906,11 +915,11 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) return ret; } - spiffs_cb_object_event(fs, - (FAR spiffs_page_object_ix *)fs->work, - SPIFFS_EV_IX_UPD, gc.cur_objid, - objndx->p_hdr.spndx, - new_objndx_pgndx, 0); + spiffs_object_event(fs, + (FAR struct spiffs_page_objndx_s *)fs->work, + SPIFFS_EV_IX_UPD, gc.cur_objid, + objndx->phdr.spndx, + new_objndx_pgndx, 0); } } break; @@ -957,7 +966,7 @@ static int spiffs_gc_clean(FAR struct spiffs_s *fs, int16_t blkndx) int spiffs_gc_quick(FAR struct spiffs_s *fs, uint16_t max_free_pages) { - FAR int16_t *obj_lu_buf = (int16_t *) fs->lu_work; + FAR int16_t *objlu_buf = (int16_t *) fs->lu_work; uint32_t cur_block_addr = 0; uint32_t blocks = fs->geo.neraseblocks; int16_t cur_block = 0; @@ -998,7 +1007,7 @@ int spiffs_gc_quick(FAR struct spiffs_s *fs, uint16_t max_free_pages) (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs))) { - int16_t id = obj_lu_buf[cur_entry - entry_offset]; + int16_t id = objlu_buf[cur_entry - entry_offset]; if (id == SPIFFS_OBJ_ID_DELETED) { @@ -1179,7 +1188,6 @@ int spiffs_gc_check(FAR struct spiffs_s *fs, off_t len) ferr("ERROR: spiffs_gc_epage_stats() failed: %d\n", ret); return ret; } - SPIFFS_CHECK_RES(ret); ret = spiffs_gc_erase_block(fs, cand); if (ret < 0) diff --git a/fs/spiffs/src/spiffs_vfs.c b/fs/spiffs/src/spiffs_vfs.c index 950a0dded9..af2ed7376f 100644 --- a/fs/spiffs/src/spiffs_vfs.c +++ b/fs/spiffs/src/spiffs_vfs.c @@ -271,10 +271,10 @@ static int spiffs_consistency_check(FAR struct spiffs_s *fs) } } - status = spiffs_obj_lu_scan(fs); + status = spiffs_objlu_scan(fs); if (status < 0) { - fwarn("WARNING spiffs_obj_lu_scan failed: %d\n", status); + fwarn("WARNING spiffs_objlu_scan failed: %d\n", status); if (ret == OK) { ret = status; @@ -289,11 +289,11 @@ static int spiffs_consistency_check(FAR struct spiffs_s *fs) ****************************************************************************/ static int spiffs_readdir_callback(FAR struct spiffs_s *fs, - int16_t objid, int16_t blkndx, int ix_entry, + int16_t objid, int16_t blkndx, int entry, FAR const void *user_const, FAR void *user_var) { - struct spiffs_pgobj_ixheader_s objhdr; + struct spiffs_pgobj_ndxheader_s objhdr; int16_t pgndx; int ret; @@ -303,10 +303,10 @@ static int spiffs_readdir_callback(FAR struct spiffs_s *fs, return SPIFFS_VIS_COUNTINUE; } - pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, ix_entry); + pgndx = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, blkndx, entry); ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - sizeof(struct spiffs_pgobj_ixheader_s), + sizeof(struct spiffs_pgobj_ndxheader_s), (FAR uint8_t *) & objhdr); if (ret < 0) { @@ -315,8 +315,8 @@ static int spiffs_readdir_callback(FAR struct spiffs_s *fs, } if ((objid & SPIFFS_OBJ_ID_IX_FLAG) && - objhdr.p_hdr.spndx == 0 && - (objhdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | + objhdr.phdr.spndx == 0 && + (objhdr.phdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) == (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) { @@ -411,7 +411,7 @@ static int spiffs_open(FAR struct file *filep, FAR const char *relpath, /* The file does not exist. We need to create the it. */ - ret = spiffs_obj_lu_find_free_obj_id(fs, &objid, 0); + ret = spiffs_objlu_find_free_obj_id(fs, &objid, 0); if (ret < 0) { goto errout_with_fileobject; @@ -881,8 +881,8 @@ static off_t spiffs_seek(FAR struct file *filep, off_t offset, int whence) { int16_t pgndx; - ret = spiffs_obj_lu_find_id_and_span(fs, fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, - objndx_spndx, 0, &pgndx); + ret = spiffs_objlu_find_id_and_span(fs, fobj->objid | SPIFFS_OBJ_ID_IX_FLAG, + objndx_spndx, 0, &pgndx); if (ret < 0) { goto errout_with_lock; @@ -1158,7 +1158,7 @@ static int spiffs_truncate(FAR struct file *filep, off_t length) ret = spiffs_object_truncate(fs, fobj, length, false); if (ret < 0) { - ferr("ERROR: spiffs_object_truncate failed: %d/n", ret); + ferr("ERROR: spiffs_object_truncate failed: %d/n", ret); } /* Check if we need to reset the file pointer. Probably could use @@ -1301,7 +1301,7 @@ static int spiffs_bind(FAR struct inode *mtdinode, FAR const void *data, fs = (FAR struct spiffs_s *)kmm_zalloc(sizeof(struct spiffs_s)); if (fs == NULL) { - ferr("ERROR: Failed to allocate volume structure\n"); + ferr("ERROR: Failed to allocate volume structure\n"); return -ENOMEM; } @@ -1312,7 +1312,7 @@ static int spiffs_bind(FAR struct inode *mtdinode, FAR const void *data, ret = MTD_IOCTL(mtd, MTDIOC_GEOMETRY, (unsigned long)((uintptr_t)&fs->geo)); if (ret < 0) { - ferr("ERROR: MTD_IOCTL(MTDIOC_GEOMETRY) failed: %d\n", ret); + ferr("ERROR: MTD_IOCTL(MTDIOC_GEOMETRY) failed: %d\n", ret); goto errout_with_volume; } @@ -1338,7 +1338,7 @@ static int spiffs_bind(FAR struct inode *mtdinode, FAR const void *data, if (fs->cache == NULL) { - ferr("ERROR: Failed to allocate volume structure\n"); + ferr("ERROR: Failed to allocate volume structure\n"); ret = -ENOMEM; goto errout_with_volume; } @@ -1356,7 +1356,7 @@ static int spiffs_bind(FAR struct inode *mtdinode, FAR const void *data, if (work == NULL) { - ferr("ERROR: Failed to allocate work buffer\n"); + ferr("ERROR: Failed to allocate work buffer\n"); ret = -ENOMEM; goto errout_with_cache; } @@ -1367,10 +1367,10 @@ static int spiffs_bind(FAR struct inode *mtdinode, FAR const void *data, /* Check the file system */ - ret = spiffs_obj_lu_scan(fs); + ret = spiffs_objlu_scan(fs); if (ret < 0) { - ferr("ERROR: spiffs_obj_lu_scan() failed: %d\n", ret); + ferr("ERROR: spiffs_objlu_scan() failed: %d\n", ret); goto errout_with_work; } diff --git a/fs/spiffs/src/spiffs_volume.c b/fs/spiffs/src/spiffs_volume.c index a2c16e1f30..701c585bde 100644 --- a/fs/spiffs/src/spiffs_volume.c +++ b/fs/spiffs/src/spiffs_volume.c @@ -79,7 +79,7 @@ int spiffs_stat_pgndx(FAR struct spiffs_s *fs, int16_t pgndx, int16_t objid, FAR struct stat *buf) { - struct spiffs_pgobj_ixheader_s objhdr; + struct spiffs_pgobj_ndxheader_s objhdr; uint32_t obj_id_addr; int16_t ndx; mode_t mode; @@ -87,7 +87,7 @@ int spiffs_stat_pgndx(FAR struct spiffs_s *fs, int16_t pgndx, int16_t objid, ret = spiffs_cache_read(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, objid, SPIFFS_PAGE_TO_PADDR(fs, pgndx), - sizeof(struct spiffs_pgobj_ixheader_s), + sizeof(struct spiffs_pgobj_ndxheader_s), (FAR uint8_t *) & objhdr); if (ret < 0) {