From ced3b6186457149739418848c565e65c74249d1e Mon Sep 17 00:00:00 2001 From: Peter Andersson Date: Fri, 26 Jul 2013 14:46:22 +0200 Subject: [PATCH] changed ways of gc, optimized --- build/linux_spiffs_test | Bin 158924 -> 209387 bytes build/spiffs_cache.o | Bin 16272 -> 17200 bytes build/spiffs_hydrogen.o | Bin 27440 -> 32704 bytes build/spiffs_nucleus.o | Bin 55504 -> 62408 bytes build/test_hydrogen.o | Bin 103232 -> 113920 bytes build/test_spiffs.o | Bin 22120 -> 27048 bytes build/testsuites.o | Bin 3120 -> 3424 bytes makefile | 2 + src/default/spiffs_config.h | 15 +- src/spiffs.h | 58 ++- src/spiffs_cache.c | 38 +- src/spiffs_check.c | 972 +++++++++++++++++++++++++++++++----- src/spiffs_gc.c | 275 +++++++--- src/spiffs_hydrogen.c | 169 +++++-- src/spiffs_nucleus.c | 298 ++++++++--- src/spiffs_nucleus.h | 93 +++- src/test_spiffs.h | 2 +- src/testsuites.c | 3 +- 18 files changed, 1566 insertions(+), 359 deletions(-) diff --git a/build/linux_spiffs_test b/build/linux_spiffs_test index 4797ac2b773eb9d13b6389f116bd974be4840bd1..3f56f4a89abb86bf466c2439c6ed68c755e7ed52 100755 GIT binary patch literal 209387 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

Z$HJ^2i|76xP8dBdpf{(I8Ff{ajLTqJj!x$ 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 literal 16272 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 diff --git a/build/spiffs_hydrogen.o b/build/spiffs_hydrogen.o index ef2077cb3080e9b39809a29e98449331c1a146ce..169ff00800369937e460df5b5bc3b9d7299445f8 100644 GIT binary patch literal 32704 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 E3ow--ga7~l diff --git a/build/spiffs_nucleus.o b/build/spiffs_nucleus.o index 65194e0c43e6aeb8b133bfc30e2ee61e385563c2..7aeb9f177b28b96a71480895a319f6bc74e8ad5c 100644 GIT binary patch literal 62408 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 VJrRFR_>}S6JA5q)x{{yF?{DuGk literal 55504 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 Ua9&S-Z{WP16dg#oPP#m) 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 j*97H{QAVIouySSuiwu&I= zL5c{1>BEBu*@IUPl?4$mQapK7y!6(i2SKj|q0VH|x)dMG%gq1(n>Uj;YxT{8FOI?Q z^!SARf$;bt(!be_&uQ9fA2m;L74Gn)5(NYTrA&H~Nt%?b^!;2NY8f$88Q*|^sN=_jPO6nDm#K|-$P79~58Bu&20W+5fVHJTUgEl5!=J?oJx3p-qj+p9w{K;3PjMl{R0-e{ zepLcWEZnF1>{r$kQC-yNsV<$gaFrV#mD^v-;;IYZv8n~IjV+DuF5s%>(-{lDX+E1S zNOqX9Cv}%iGO4WLyza40L$0m~fB07KiGOp9LvR8Q8#V+yUwrhR?(BAKPiqOu3-T8t zWQ>nL+cNgcgEGA`qBlnL>WHr9x-?S%al>fxn=`ZN*uv)F i%g-)(A6upkv)DBS`O0jvC?^tpXV}%1Jv_lLX6G+>2&8HN delta 460 zcmX|5y-UMD9KGK)NpoqmsTLa@Y8{k{LqUfWhZGeAKL(3VqTry^qNLFJwdta0K`_3_ zN$@Wa>fol};%G;=x;a*GaS_ud_TcW`z2AH9USr_iyh_uNJ31U%f7x-jHc5AzD>7q> z$*@KfLs8~0&JK)!Y;?FomEl9`#S6vppvA8xiKfvc+g!ZmoDuDooI+~fsT2#&)@G{c z?4iOh@ykcL+Zj{c#u=aKQWk3Cp(J?;1~#O$*w*|HOt_MTrYzw*6h}i!cW_E>W3MM; zCFJF-8d#R#%9eNv3NE8AThs%gzhb>yg zML5S#Ile-DXoS=JoI_J>Zt9r#u4j&_YKuqJ4?00zwL~^(F;cpage_use_map & cache->cpage_use_mask) == 0) return 0; int i; for (i = 0; i < cache->cpage_count; i++) { - spiffs_cache_page *cp = get_cache_page_hdr(fs, cache, i); + spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, i); if ((cache->cpage_use_map & (1<flags & SPIFFS_CACHE_FLAG_TYPE_WR) == 0 && cp->pix == pix ) { @@ -30,13 +30,13 @@ static spiffs_cache_page *spiffs_cache_page_get(spiffs *fs, spiffs_page_ix pix) static s32_t spiffs_cache_page_free(spiffs *fs, int ix, u8_t write_back) { s32_t res = SPIFFS_OK; - spiffs_cache *cache = get_cache(fs); - spiffs_cache_page *cp = get_cache_page_hdr(fs, cache, ix); + spiffs_cache *cache = spiffs_get_cache(fs); + spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, ix); if (cache->cpage_use_map & (1<flags & SPIFFS_CACHE_FLAG_TYPE_WR) == 0 && (cp->flags & SPIFFS_CACHE_FLAG_DIRTY)) { - u8_t *mem = get_cache_page(fs, cache, ix); + u8_t *mem = spiffs_get_cache_page(fs, cache, ix); res = fs->cfg.hal_write_f(SPIFFS_PAGE_TO_PADDR(fs, cp->pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), mem); } @@ -55,7 +55,7 @@ static s32_t spiffs_cache_page_free(spiffs *fs, int ix, u8_t write_back) { static s32_t spiffs_cache_page_remove_oldest(spiffs *fs, u8_t flag_mask, u8_t flags) { s32_t res = SPIFFS_OK; - spiffs_cache *cache = get_cache(fs); + spiffs_cache *cache = spiffs_get_cache(fs); if ((cache->cpage_use_map & cache->cpage_use_mask) != cache->cpage_use_mask) { // at least one free cpage @@ -67,7 +67,7 @@ static s32_t spiffs_cache_page_remove_oldest(spiffs *fs, u8_t flag_mask, u8_t fl int cand_ix = -1; u32_t oldest_val = 0; for (i = 0; i < cache->cpage_count; i++) { - spiffs_cache_page *cp = get_cache_page_hdr(fs, cache, i); + spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, i); if ((cache->last_access - cp->last_access) > oldest_val && (cp->flags & flag_mask) == flags) { oldest_val = cache->last_access - cp->last_access; @@ -83,7 +83,7 @@ static s32_t spiffs_cache_page_remove_oldest(spiffs *fs, u8_t flag_mask, u8_t fl } static spiffs_cache_page *spiffs_cache_page_allocate(spiffs *fs) { - spiffs_cache *cache = get_cache(fs); + spiffs_cache *cache = spiffs_get_cache(fs); if (cache->cpage_use_map == 0xffffffff) { // out of cache memory return 0; @@ -91,7 +91,7 @@ static spiffs_cache_page *spiffs_cache_page_allocate(spiffs *fs) { int i; for (i = 0; i < cache->cpage_count; i++) { if ((cache->cpage_use_map & (1<cpage_use_map |= (1<last_access = cache->last_access; SPIFFS_CACHE_DBG("CACHE_ALLO: allocated cache page %i\n", i); @@ -119,7 +119,7 @@ s32_t spiffs_phys_rd( u32_t len, u8_t *dst) { s32_t res = SPIFFS_OK; - spiffs_cache *cache = get_cache(fs); + spiffs_cache *cache = spiffs_get_cache(fs); spiffs_cache_page *cp = spiffs_cache_page_get(fs, SPIFFS_PADDR_TO_PAGE(fs, addr)); cache->last_access++; if (cp) { @@ -148,12 +148,12 @@ s32_t spiffs_phys_rd( s32_t res2 = fs->cfg.hal_read_f( addr - SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr), SPIFFS_CFG_LOG_PAGE_SZ(fs), - get_cache_page(fs, cache, cp->ix)); + spiffs_get_cache_page(fs, cache, cp->ix)); if (res2 != SPIFFS_OK) { res = res2; } } - u8_t *mem = get_cache_page(fs, cache, cp->ix); + u8_t *mem = spiffs_get_cache_page(fs, cache, cp->ix); memcpy(dst, &mem[SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr)], len); return res; } @@ -166,10 +166,10 @@ s32_t spiffs_phys_wr( u32_t len, u8_t *src) { spiffs_page_ix pix = SPIFFS_PADDR_TO_PAGE(fs, addr); - spiffs_cache *cache = get_cache(fs); + spiffs_cache *cache = spiffs_get_cache(fs); spiffs_cache_page *cp = spiffs_cache_page_get(fs, pix); - if (cp) { + if (cp && (op & SPIFFS_OP_COM_MASK) != SPIFFS_OP_C_WRTHRU) { // have a cache page // copy in data to cache page @@ -180,7 +180,7 @@ s32_t spiffs_phys_wr( return fs->cfg.hal_write_f(addr, len, src); } - u8_t *mem = get_cache_page(fs, cache, cp->ix); + u8_t *mem = spiffs_get_cache_page(fs, cache, cp->ix); memcpy(&mem[SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr)], src, len); cache->last_access++; @@ -200,7 +200,7 @@ s32_t spiffs_phys_wr( #if SPIFFS_CACHE_WR spiffs_cache_page *spiffs_cache_page_get_by_fd(spiffs *fs, spiffs_fd *fd) { - spiffs_cache *cache = get_cache(fs); + spiffs_cache *cache = spiffs_get_cache(fs); if ((cache->cpage_use_map & cache->cpage_use_mask) == 0) { // all cpages free, no cpage cannot be assigned to obj_id @@ -209,7 +209,7 @@ spiffs_cache_page *spiffs_cache_page_get_by_fd(spiffs *fs, spiffs_fd *fd) { int i; for (i = 0; i < cache->cpage_count; i++) { - spiffs_cache_page *cp = get_cache_page_hdr(fs, cache, i); + spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, i); if ((cache->cpage_use_map & (1<flags & SPIFFS_CACHE_FLAG_TYPE_WR) && cp->obj_id == fd->obj_id) { @@ -276,13 +276,13 @@ void spiffs_cache_init(spiffs *fs) { cache.cpage_use_mask = cache_mask; memcpy(fs->cache, &cache, sizeof(spiffs_cache)); - spiffs_cache *c = get_cache(fs); + spiffs_cache *c = spiffs_get_cache(fs); memset(c->cpages, 0, c->cpage_count * SPIFFS_CACHE_PAGE_SIZE(fs)); c->cpage_use_map &= ~(c->cpage_use_mask); for (i = 0; i < cache.cpage_count; i++) { - get_cache_page_hdr(fs, c, i)->ix = i; + spiffs_get_cache_page_hdr(fs, c, i)->ix = i; } } diff --git a/src/spiffs_check.c b/src/spiffs_check.c index d90af96..fa66058 100644 --- a/src/spiffs_check.c +++ b/src/spiffs_check.c @@ -1,6 +1,20 @@ /* * spiffs_check.c * + * Contains functionality for checking file system consistency + * and mending problems. + * Three levels of consistency checks are implemented: + * + * Look up consistency + * Checks if indices in lookup pages are coherent with page headers + * Object index consistency + * Checks if there are any orphaned object indices (missing object index headers). + * If an object index is found but not its header, the object index is deleted. + * This is critical for the following page consistency check. + * Page consistency + * Checks for pages that ought to be indexed, ought not to be indexed, are multiple indexed + * + * * Created on: Jul 7, 2013 * Author: petera */ @@ -8,138 +22,383 @@ #include "spiffs.h" #include "spiffs_nucleus.h" +//--------------------------------------- +// Look up consistency -static s32_t spiffs_object_check_data_page( + +// destroys fs->lu_work +static s32_t spiffs_object_get_data_page_index_reference( spiffs *fs, spiffs_obj_id obj_id, spiffs_span_ix data_spix, - spiffs_page_ix *pix) { + spiffs_page_ix *pix, + spiffs_page_ix *objix_pix) { s32_t res; - spiffs_page_ix objix_pix; - spiffs_page_ix ref_pix; // calculate object index span index for given data page span index spiffs_span_ix objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix); // find obj index for obj id and span index - res = spiffs_obj_lu_find_id_and_index(fs, obj_id | SPIFFS_OBJ_ID_IX_FLAG, objix_spix, &objix_pix); - SPIFFS_CHECK_RES(res); - - // load obj index - res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), - (u8_t*)fs->work); + res = spiffs_obj_lu_find_id_and_span(fs, obj_id | SPIFFS_OBJ_ID_IX_FLAG, objix_spix, 0, objix_pix); SPIFFS_CHECK_RES(res); + // load obj index entry + u32_t addr = SPIFFS_PAGE_TO_PADDR(fs, *objix_pix); if (objix_spix == 0) { // get referenced page from object index header - spiffs_page_object_ix_header *objix_hdr = (spiffs_page_object_ix_header *)fs->work; - ref_pix = ((spiffs_page_ix*)((void*)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix]; + addr += sizeof(spiffs_page_object_ix_header) + data_spix * sizeof(spiffs_page_ix); } else { // get referenced page from object index - spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work; - ref_pix = ((spiffs_page_ix*)((void*)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)]; + addr += sizeof(spiffs_page_object_ix) + SPIFFS_OBJ_IX_ENTRY(fs, data_spix) * sizeof(spiffs_page_ix); } - *pix = ref_pix; + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, addr, sizeof(spiffs_page_ix), (u8_t *)pix); return res; } -static s32_t spiffs_area_check_validate(spiffs *fs, spiffs_obj_id lu_obj_id, spiffs_page_header *p_hdr, +static s32_t spiffs_rewrite_page(spiffs *fs, spiffs_page_ix cur_pix, spiffs_page_header *p_hdr, spiffs_page_ix *new_pix) { + s32_t res; + res = spiffs_page_allocate_data(fs, p_hdr->obj_id, p_hdr, 0,0,0,0, new_pix); + SPIFFS_CHECK_RES(res); + res = spiffs_phys_cpy(fs, 0, + SPIFFS_PAGE_TO_PADDR(fs, *new_pix) + sizeof(spiffs_page_header), + SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + sizeof(spiffs_page_header), + SPIFFS_DATA_PAGE_SIZE(fs)); + SPIFFS_CHECK_RES(res); + return res; +} + +static s32_t spiffs_rewrite_index(spiffs *fs, spiffs_obj_id obj_id, spiffs_span_ix data_spix, spiffs_page_ix new_data_pix, spiffs_page_ix objix_pix) { + s32_t res; + spiffs_block_ix bix; + int entry; + spiffs_page_ix free_pix; + obj_id |= SPIFFS_OBJ_ID_IX_FLAG; + + // find free entry + res = spiffs_obj_lu_find_free(fs, fs->free_cursor_block_ix, fs->free_cursor_obj_lu_entry, &bix, &entry); + SPIFFS_CHECK_RES(res); + free_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry); + + // calculate object index span index for given data page span index + spiffs_span_ix objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix); + if (objix_spix == 0) { + // calc index in index header + entry = data_spix; + } else { + // calc entry in index + entry = SPIFFS_OBJ_IX_ENTRY(fs, data_spix); + } + // load index + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + SPIFFS_CHECK_RES(res); + spiffs_page_header *objix_p_hdr = (spiffs_page_header *)fs->lu_work; + + // be ultra safe, double check header against provided data + if (objix_p_hdr->obj_id != obj_id) { + spiffs_page_delete(fs, free_pix); + return SPIFFS_ERR_CHECK_OBJ_ID_MISM; + } + if (objix_p_hdr->span_ix != objix_spix) { + spiffs_page_delete(fs, free_pix); + return SPIFFS_ERR_CHECK_SPIX_MISM; + } + if ((objix_p_hdr->flags & (SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_IXDELE | SPIFFS_PH_FLAG_INDEX | + SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET)) != + (SPIFFS_PH_FLAG_IXDELE | SPIFFS_PH_FLAG_DELET)) { + spiffs_page_delete(fs, free_pix); + return SPIFFS_ERR_CHECK_FLAGS_BAD; + } + + // rewrite in mem + if (objix_spix == 0) { + ((spiffs_page_ix*)((void*)fs->lu_work + sizeof(spiffs_page_object_ix_header)))[data_spix] = new_data_pix; + } else { + ((spiffs_page_ix*)((void*)fs->lu_work + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)] = new_data_pix; + } + + res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, + 0, SPIFFS_PAGE_TO_PADDR(fs, free_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + SPIFFS_CHECK_RES(res); + res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, + 0, SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, free_pix)) + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, free_pix) * sizeof(spiffs_page_ix), + sizeof(spiffs_obj_id), + (u8_t *)&obj_id); + SPIFFS_CHECK_RES(res); + res = spiffs_page_delete(fs, objix_pix); + + return res; +} + +static s32_t spiffs_delete_obj_lazy(spiffs *fs, spiffs_obj_id obj_id) { + spiffs_page_ix objix_hdr_pix; + s32_t res; + res = spiffs_obj_lu_find_id_and_span(fs, obj_id, 0, 0, &objix_hdr_pix); + if (res == SPIFFS_ERR_NOT_FOUND) { + return SPIFFS_OK; + } + SPIFFS_CHECK_RES(res); + u8_t flags = 0xff & ~SPIFFS_PH_FLAG_IXDELE; + res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, + 0, SPIFFS_PAGE_TO_PADDR(fs, objix_hdr_pix) + offsetof(spiffs_page_header, flags), + sizeof(u8_t), + (u8_t *)&flags); + return res; +} + +static s32_t spiffs_lookup_check_validate(spiffs *fs, spiffs_obj_id lu_obj_id, spiffs_page_header *p_hdr, spiffs_page_ix cur_pix, spiffs_block_ix cur_block, int cur_entry, int *reload_lu) { u8_t delete_page = 0; s32_t res = SPIFFS_OK; + spiffs_page_ix objix_pix; + spiffs_page_ix ref_pix; // check validity, take actions - if (lu_obj_id == SPIFFS_OBJ_ID_ERASED) { - // TODO - if (p_hdr->flags & SPIFFS_PH_FLAG_DELET) { - print("WARNING: pix %04x deleted in lu but not on page\n", cur_pix); - // page can be removed if not referenced by object index - spiffs_page_ix ref_pix; - res = spiffs_object_check_data_page(fs, p_hdr->obj_id, p_hdr->span_ix, &ref_pix); + if (((lu_obj_id == SPIFFS_OBJ_ID_DELETED) && (p_hdr->flags & SPIFFS_PH_FLAG_DELET)) || + ((lu_obj_id == SPIFFS_OBJ_ID_FREE) && (p_hdr->flags & SPIFFS_PH_FLAG_USED) == 0)) { + // look up entry deleted / free but used in page header + SPIFFS_CHECK_DBG("LU: pix %04x deleted/free in lu but not on page\n", cur_pix); + *reload_lu = 1; + delete_page = 1; + if (p_hdr->flags & SPIFFS_PH_FLAG_INDEX) { + // header says data page + // data page can be removed if not referenced by some object index + res = spiffs_object_get_data_page_index_reference(fs, p_hdr->obj_id, p_hdr->span_ix, &ref_pix, &objix_pix); if (res == SPIFFS_ERR_NOT_FOUND) { // no object with this id, so remove page safely res = SPIFFS_OK; - delete_page = 1; - ref_pix = cur_pix+1; - } - SPIFFS_CHECK_RES(res); - *reload_lu = 1; - if (ref_pix != cur_pix) { - delete_page = 1; } else { - // TODO - page referenced by object index but deleted in lu - } - } - } else if (lu_obj_id == SPIFFS_OBJ_ID_FREE) { - // TODO - if (p_hdr->flags != 0xff) { - print("WARNING: pix %04x free in lu but not on page\n", cur_pix); - // page can be removed if not referenced by object index - spiffs_page_ix ref_pix; - res = spiffs_object_check_data_page(fs, p_hdr->obj_id, p_hdr->span_ix, &ref_pix); - if (res == SPIFFS_ERR_NOT_FOUND) { - // no object with this id, so remove page safely - res = SPIFFS_OK; - delete_page = 1; - ref_pix = cur_pix+1; - } - SPIFFS_CHECK_RES(res); - *reload_lu = 1; - if (ref_pix != cur_pix) { - delete_page = 1; - } else { - // TODO - page referenced by object index but free in lu - } - } - } else { - // TODO - if ((p_hdr->flags & SPIFFS_PH_FLAG_DELET) == 0) { - print("WARNING: pix %04x busy in lu but free on page\n", cur_pix); - delete_page = 1; - } - if ((p_hdr->flags & SPIFFS_PH_FLAG_FINAL)) { - print("WARNING: pix %04x busy but not final\n", cur_pix); - // page can be removed if not referenced by object index - spiffs_page_ix ref_pix; - res = spiffs_object_check_data_page(fs, p_hdr->obj_id, p_hdr->span_ix, &ref_pix); - if (res == SPIFFS_ERR_NOT_FOUND) { - // no object with this id, so remove page safely - res = SPIFFS_OK; - delete_page = 1; - ref_pix = cur_pix+1; - } - SPIFFS_CHECK_RES(res); - *reload_lu = 1; - if (ref_pix != cur_pix) { - delete_page = 1; - } else { - // TODO - page referenced by object index but not final - } - } - if (p_hdr->obj_id != lu_obj_id) { - print("WARNING: pix %04x has id %04x in lu but %04x on page\n", cur_pix, lu_obj_id, p_hdr->obj_id); - if (p_hdr->obj_id == SPIFFS_OBJ_ID_FREE || p_hdr->obj_id == SPIFFS_OBJ_ID_ERASED) { - delete_page = 1; - } - } - - if (lu_obj_id & SPIFFS_OBJ_ID_IX_FLAG) { - // index page - if (p_hdr->flags & SPIFFS_PH_FLAG_INDEX) { - print("WARNING: pix %04x marked as index in lu but as data on page\n", cur_pix); + SPIFFS_CHECK_RES(res); + if (ref_pix == cur_pix) { + // data page referenced by object index but deleted in lu + // copy page to new place and re-write the object index to new place + spiffs_page_ix new_pix; + res = spiffs_rewrite_page(fs, cur_pix, p_hdr, &new_pix); + SPIFFS_CHECK_DBG("LU: FIXUP: data page not found elsewhere, rewriting %04x to new page %04x\n", cur_pix, new_pix); + SPIFFS_CHECK_RES(res); + *reload_lu = 1; + SPIFFS_CHECK_DBG("LU: FIXUP: %04x rewritten to %04x, affected objix_pix %04x\n", cur_pix, new_pix, objix_pix); + res = spiffs_rewrite_index(fs, p_hdr->obj_id, p_hdr->span_ix, new_pix, objix_pix); + if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST) { + // index bad also, cannot mend this file + SPIFFS_CHECK_DBG("LU: FIXUP: index bad %i, cannot mend!\n", res); + res = spiffs_page_delete(fs, new_pix); + SPIFFS_CHECK_RES(res); + res = spiffs_delete_obj_lazy(fs, p_hdr->obj_id); + } + SPIFFS_CHECK_RES(res); + } } } else { - // data page - if ((p_hdr->flags & SPIFFS_PH_FLAG_INDEX) == 0) { - print("WARNING: pix %04x as data in lu but as index on page\n", cur_pix); + // header says index page + // index page can be removed if other index with same obj_id and spanix is found + res = spiffs_obj_lu_find_id_and_span(fs, p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, cur_pix, 0); + if (res == SPIFFS_ERR_NOT_FOUND) { + // no such index page found, check for a data page + res = spiffs_obj_lu_find_id_and_span_by_phdr(fs, p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, 0, 0); + if (res == SPIFFS_OK) { // ignore other errors + // got a data page also, assume lu corruption only, rewrite to new page + spiffs_page_ix new_pix; + res = spiffs_rewrite_page(fs, cur_pix, p_hdr, &new_pix); + SPIFFS_CHECK_DBG("LU: FIXUP: ix page with data not found elsewhere, rewriting %04x to new page %04x\n", cur_pix, new_pix); + SPIFFS_CHECK_RES(res); + *reload_lu = 1; + } + } else { + SPIFFS_CHECK_RES(res); + } + } + } + if (lu_obj_id != SPIFFS_OBJ_ID_FREE && lu_obj_id != SPIFFS_OBJ_ID_DELETED) { + // look up entry used + if ((p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG) != (lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG)) { + SPIFFS_CHECK_DBG("LU: pix %04x differ in obj_id lu:%04x ph:%04x\n", cur_pix, lu_obj_id, p_hdr->obj_id); + delete_page = 1; + if ((p_hdr->flags & SPIFFS_PH_FLAG_DELET) == 0 || + (p_hdr->flags & SPIFFS_PH_FLAG_FINAL) || + (p_hdr->flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_IXDELE)) == 0) { + // page deleted or not finalized, just remove it + } else { + if (p_hdr->flags & SPIFFS_PH_FLAG_INDEX) { + // if data page, check for reference to this page + res = spiffs_object_get_data_page_index_reference(fs, p_hdr->obj_id, p_hdr->span_ix, &ref_pix, &objix_pix); + if (res == SPIFFS_ERR_NOT_FOUND) { + // no object with this id, so remove page safely + res = SPIFFS_OK; + } else { + SPIFFS_CHECK_RES(res); + // if found, rewrite page with object id, update index, and delete current + if (ref_pix == cur_pix) { + spiffs_page_ix new_pix; + res = spiffs_rewrite_page(fs, cur_pix, p_hdr, &new_pix); + SPIFFS_CHECK_RES(res); + res = spiffs_rewrite_index(fs, p_hdr->obj_id, p_hdr->span_ix, new_pix, objix_pix); + if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST) { + // index bad also, cannot mend this file + SPIFFS_CHECK_DBG("LU: FIXUP: index bad %i, cannot mend!\n", res); + res = spiffs_page_delete(fs, new_pix); + SPIFFS_CHECK_RES(res); + res = spiffs_delete_obj_lazy(fs, p_hdr->obj_id); + *reload_lu = 1; + } + SPIFFS_CHECK_RES(res); + } + } + } else { + // else if index, check for other pages with both obj_id's and spanix + spiffs_page_ix objix_pix_lu, objix_pix_ph; + // see if other object index page exists for lookup obj id and span index + res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, 0, &objix_pix_lu); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + objix_pix_lu = 0; + } + SPIFFS_CHECK_RES(res); + // see if other object index exists for page header obj id and span index + res = spiffs_obj_lu_find_id_and_span(fs, p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, 0, &objix_pix_ph); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + objix_pix_ph = 0; + } + SPIFFS_CHECK_RES(res); + // if both obj_id's found, just delete current + if (objix_pix_ph == 0 || objix_pix_ph == 0) { + // otherwise try finding first corresponding data pages + spiffs_page_ix data_pix_lu, data_pix_ph; + // see if other data page exists for look up obj id and span index + res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &data_pix_lu); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + objix_pix_lu = 0; + } + SPIFFS_CHECK_RES(res); + // see if other data page exists for page header obj id and span index + res = spiffs_obj_lu_find_id_and_span(fs, p_hdr->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &data_pix_ph); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + objix_pix_ph = 0; + } + SPIFFS_CHECK_RES(res); + + spiffs_page_header new_ph; + new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL); + new_ph.span_ix = p_hdr->span_ix; + spiffs_page_ix new_pix; + if ((objix_pix_lu && data_pix_lu && data_pix_ph && objix_pix_ph == 0) || + (objix_pix_lu == 0 && data_pix_ph && objix_pix_ph == 0)) { + // got a data page for page header obj id + // rewrite as obj_id_ph + new_ph.obj_id = p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG; + res = spiffs_rewrite_page(fs, cur_pix, &new_ph, &new_pix); + SPIFFS_CHECK_DBG("LU: FIXUP: rewrite page %04x as %04x to pix %04x\n", cur_pix, new_ph.obj_id, new_pix); + SPIFFS_CHECK_RES(res); + *reload_lu = 1; + } else if ((objix_pix_ph && data_pix_ph && data_pix_lu && objix_pix_lu == 0) || + (objix_pix_ph == 0 && data_pix_lu && objix_pix_lu == 0)) { + // got a data page for look up obj id + // rewrite as obj_id_lu + new_ph.obj_id = lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG; + SPIFFS_CHECK_DBG("LU: FIXUP: rewrite page %04x as %04x\n", cur_pix, new_ph.obj_id); + res = spiffs_rewrite_page(fs, cur_pix, &new_ph, &new_pix); + SPIFFS_CHECK_RES(res); + *reload_lu = 1; + } else { + // cannot safely do anything + SPIFFS_CHECK_DBG("LU: FIXUP: nothing to do, just delete\n"); + } + } + } + } + } else if (((lu_obj_id & SPIFFS_OBJ_ID_IX_FLAG) && (p_hdr->flags & SPIFFS_PH_FLAG_INDEX)) || + ((lu_obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0 && (p_hdr->flags & SPIFFS_PH_FLAG_INDEX) == 0)) { + SPIFFS_CHECK_DBG("LU: %04x lu/page index marking differ\n", cur_pix); + spiffs_page_ix data_pix, objix_pix; + // see if other data page exists for given obj id and span index + res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, cur_pix, &data_pix); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + data_pix = 0; + } + SPIFFS_CHECK_RES(res); + // see if other object index exists for given obj id and span index + res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, cur_pix, &objix_pix); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + objix_pix = 0; + } + SPIFFS_CHECK_RES(res); + + delete_page = 1; + // if other data page exists and object index exists, just delete page + if (data_pix && objix_pix) { + SPIFFS_CHECK_DBG("LU: FIXUP: other index and data page exists, simply remove\n"); + } else + // if only data page exists, make this page index + if (data_pix && objix_pix == 0) { + SPIFFS_CHECK_DBG("LU: FIXUP: other data page exists, make this index\n"); + spiffs_page_header new_ph; + spiffs_page_ix new_pix; + new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX); + new_ph.obj_id = lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG; + new_ph.span_ix = p_hdr->span_ix; + res = spiffs_page_allocate_data(fs, new_ph.obj_id, &new_ph, 0, 0, 0, 1, &new_pix); + SPIFFS_CHECK_RES(res); + res = spiffs_phys_cpy(fs, 0, SPIFFS_PAGE_TO_PADDR(fs, new_pix) + sizeof(spiffs_page_header), + SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + sizeof(spiffs_page_header), + SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_header)); + SPIFFS_CHECK_RES(res); + } else + // if only index exists, make data page + if (data_pix == 0 && objix_pix) { + SPIFFS_CHECK_DBG("LU: FIXUP: other index page exists, make this data\n"); + spiffs_page_header new_ph; + spiffs_page_ix new_pix; + new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL); + new_ph.obj_id = lu_obj_id & ~SPIFFS_OBJ_ID_IX_FLAG; + new_ph.span_ix = p_hdr->span_ix; + res = spiffs_page_allocate_data(fs, new_ph.obj_id, &new_ph, 0, 0, 0, 1, &new_pix); + SPIFFS_CHECK_RES(res); + res = spiffs_phys_cpy(fs, 0, SPIFFS_PAGE_TO_PADDR(fs, new_pix) + sizeof(spiffs_page_header), + SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + sizeof(spiffs_page_header), + SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_header)); + SPIFFS_CHECK_RES(res); + } else { + // if nothing exists, we cannot safely make a decision - delete + } + } + else if ((p_hdr->flags & SPIFFS_PH_FLAG_DELET) == 0) { + SPIFFS_CHECK_DBG("LU: pix %04x busy in lu but deleted on page\n", cur_pix); + delete_page = 1; + } else if ((p_hdr->flags & SPIFFS_PH_FLAG_FINAL)) { + SPIFFS_CHECK_DBG("LU: pix %04x busy but not final\n", cur_pix); + // page can be removed if not referenced by object index + *reload_lu = 1; + res = spiffs_object_get_data_page_index_reference(fs, lu_obj_id, p_hdr->span_ix, &ref_pix, &objix_pix); + if (res == SPIFFS_ERR_NOT_FOUND) { + // no object with this id, so remove page safely + res = SPIFFS_OK; + delete_page = 1; + } else { + SPIFFS_CHECK_RES(res); + if (ref_pix != cur_pix) { + SPIFFS_CHECK_DBG("LU: FIXUP: other finalized page is referred, just delete\n"); + delete_page = 1; + } else { + // page referenced by object index but not final + // just finalize + SPIFFS_CHECK_DBG("LU: FIXUP: unfinalized page is referred, finalizing\n"); + u8_t flags = 0xff & ~SPIFFS_PH_FLAG_FINAL; + res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, + 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + offsetof(spiffs_page_header, flags), + sizeof(u8_t), (u8_t*)&flags); + } } } } if (delete_page) { - print("FIX: deleting page %04x\n", cur_pix); + SPIFFS_CHECK_DBG("LU: FIXUP: deleting page %04x\n", cur_pix); res = spiffs_page_delete(fs, cur_pix); SPIFFS_CHECK_RES(res); } @@ -147,12 +406,15 @@ static s32_t spiffs_area_check_validate(spiffs *fs, spiffs_obj_id lu_obj_id, spi return res; } -static s32_t spiffs_area_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block, int cur_entry, +static s32_t spiffs_lookup_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block, int cur_entry, u32_t user_data, void *user_p) { s32_t res = SPIFFS_OK; spiffs_page_header p_hdr; spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, cur_block, cur_entry); + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_PROGRESS, + (cur_block * 256)/fs->block_count, 0); + // load header res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); @@ -160,20 +422,11 @@ static s32_t spiffs_area_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ int reload_lu = 0; - res = spiffs_area_check_validate(fs, obj_id, &p_hdr, cur_pix, cur_block, cur_entry, &reload_lu); - - if (reload_lu) { - // reload lu - u32_t entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id)); - int obj_lookup_page = cur_entry / entries_per_page; - res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_BLOCK_TO_PADDR(fs, cur_block) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); - SPIFFS_CHECK_RES(res); - } + res = spiffs_lookup_check_validate(fs, obj_id, &p_hdr, cur_pix, cur_block, cur_entry, &reload_lu); + SPIFFS_CHECK_RES(res); if (res == SPIFFS_OK) { - return SPIFFS_VIS_COUNTINUE; + return reload_lu ? SPIFFS_VIS_COUNTINUE_RELOAD : SPIFFS_VIS_COUNTINUE; } return res; } @@ -181,40 +434,501 @@ static s32_t spiffs_area_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ // Scans all object look up. For each entry, corresponding page header is checked for validity. // If an object index header page is found, this is checked -s32_t spiffs_area_check(spiffs *fs, u8_t check_all_objects) { +s32_t spiffs_lookup_consistency_check(spiffs *fs, u8_t check_all_objects) { s32_t res = SPIFFS_OK; - s32_t entry_count = fs->block_count * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs); - spiffs_block_ix cur_block = 0; - u32_t cur_block_addr = SPIFFS_BLOCK_TO_PADDR(fs, 0); - res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_area_check_v, 0, 0, 0, 0); + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_PROGRESS, 0, 0); + + res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_lookup_check_v, 0, 0, 0, 0); if (res == SPIFFS_VIS_END) { res = SPIFFS_OK; } + if (res != SPIFFS_OK) { + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_ERROR, res, 0); + } + + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_PROGRESS, 256, 0); + return res; } -// Scans all object look up for consistency within given object id. When an index is found, it is loaded -// and checked for validity against each referenced page. When an object index header is found, size is -// checked. -// When an index points to a bad page (deleted, other id, bad span index, etc), the whole area is searched -// for correct page, followed by an index update. If no such page is found, a free page is allocated and -// referenced instead meaning there will be a page hole filled with 0xff in the file. -s32_t spiffs_object_check(spiffs *fs, spiffs_obj_id obj_id, u8_t mend) { +//--------------------------------------- +// Page consistency + +// Scans all pages (except lu pages), reserves 4 bits in working memory for each page +// bit 0: 0 == FREE|DELETED, 1 == USED +// bit 1: 0 == UNREFERENCED, 1 == REFERENCED +// bit 2: 0 == NOT_INDEX, 1 == INDEX +// bit 3: unused +// A consistent file system will have only pages being +// * x000 free, unreferenced, not index +// * x011 used, referenced only once, not index +// * x101 used, unreferenced, index +// The working memory might not fit all pages so several scans might be needed +static s32_t spiffs_page_consistency_check_i(spiffs *fs) { + const u32_t bits = 4; + const spiffs_page_ix pages_per_scan = SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8 / bits; + s32_t res = SPIFFS_OK; - spiffs_page_ix pix; - spiffs_page_object_ix_header objix_hdr; + spiffs_page_ix pix_offset = 0; - // find obj index header for obj id - res = spiffs_obj_lu_find_id_and_index(fs, obj_id, 0, &pix); - SPIFFS_CHECK_RES(res); + // for each range of pages fitting into work memory + while (pix_offset < SPIFFS_PAGES_PER_BLOCK(fs) * fs->block_count) { + // set this flag to abort all checks and rescan the page range + u8_t restart = 0; + memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs)); - // load header, get size - res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t*)&objix_hdr); - SPIFFS_CHECK_RES(res); + spiffs_block_ix cur_block = 0; + // build consistency bitmap for id range traversing all blocks + while (!restart && cur_block < fs->block_count) { + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_PAGE, SPIFFS_CHECK_PROGRESS, + (pix_offset*256)/(SPIFFS_PAGES_PER_BLOCK(fs) * fs->block_count) + + ((((cur_block * pages_per_scan * 256)/ (SPIFFS_PAGES_PER_BLOCK(fs) * fs->block_count))) / fs->block_count), + 0); + // traverse each page except for lookup pages + spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_PAGES(fs) + SPIFFS_PAGES_PER_BLOCK(fs) * cur_block; + while (!restart && cur_pix < SPIFFS_PAGES_PER_BLOCK(fs) * (cur_block+1)) { + // read header + spiffs_page_header p_hdr; + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); + SPIFFS_CHECK_RES(res); + + u8_t within_range = (cur_pix >= pix_offset && cur_pix < pix_offset + pages_per_scan); + const u32_t pix_byte_ix = (cur_pix - pix_offset) / (8/bits); + const u8_t pix_bit_ix = (cur_pix & ((8/bits)-1)) * bits; + + if (within_range && + (p_hdr.flags & SPIFFS_PH_FLAG_DELET) && (p_hdr.flags & SPIFFS_PH_FLAG_USED) == 0) { + // used + fs->work[pix_byte_ix] |= (1<<(pix_bit_ix + 0)); + } + if ((p_hdr.flags & SPIFFS_PH_FLAG_DELET) && + (p_hdr.flags & SPIFFS_PH_FLAG_IXDELE) && + (p_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED)) == 0) { + // found non-deleted index + if (within_range) { + fs->work[pix_byte_ix] |= (1<<(pix_bit_ix + 2)); + } + + // load non-deleted index + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + SPIFFS_CHECK_RES(res); + + // traverse index for referenced pages + spiffs_page_ix *object_page_index; + spiffs_page_header *objix_p_hdr = (spiffs_page_header *)fs->lu_work; + + int entries; + int i; + spiffs_span_ix data_spix_offset; + if (p_hdr.span_ix == 0) { + // object header page index + entries = SPIFFS_OBJ_HDR_IX_LEN(fs); + data_spix_offset = 0; + object_page_index = (spiffs_page_ix *)((void*)fs->lu_work + sizeof(spiffs_page_object_ix_header)); + } else { + // object page index + entries = SPIFFS_OBJ_IX_LEN(fs); + data_spix_offset = SPIFFS_OBJ_HDR_IX_LEN(fs) + SPIFFS_OBJ_IX_LEN(fs) * (p_hdr.span_ix - 1); + object_page_index = (spiffs_page_ix *)((void*)fs->lu_work + sizeof(spiffs_page_object_ix)); + } + + // for all entries in index + for (i = 0; !restart && i < entries; i++) { + spiffs_page_ix rpix = object_page_index[i]; + u8_t rpix_within_range = rpix >= pix_offset && rpix < pix_offset + pages_per_scan; + + if ((rpix != (spiffs_page_ix)-1 && rpix > SPIFFS_MAX_PAGES(fs)) + || (rpix_within_range && SPIFFS_IS_LOOKUP_PAGE(fs, rpix))) { + + // bad reference + SPIFFS_CHECK_DBG("PA: pix %04x bad pix / LU referenced from page %04x\n", + rpix, cur_pix); + // check for data page elsewhere + spiffs_page_ix data_pix; + res = spiffs_obj_lu_find_id_and_span(fs, objix_p_hdr->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, + data_spix_offset + i, 0, &data_pix); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + data_pix = 0; + } + SPIFFS_CHECK_RES(res); + if (data_pix == 0) { + // if not, allocate free page + spiffs_page_header new_ph; + new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL); + new_ph.obj_id = objix_p_hdr->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG; + new_ph.span_ix = data_spix_offset + i; + res = spiffs_page_allocate_data(fs, new_ph.obj_id, &new_ph, 0, 0, 0, 1, &data_pix); + SPIFFS_CHECK_RES(res); + SPIFFS_CHECK_DBG("PA: FIXUP: found no existing data page, created new @ %04x\n", data_pix); + } + // remap index + SPIFFS_CHECK_DBG("PA: FIXUP: rewriting index pix %04x\n", cur_pix); + res = spiffs_rewrite_index(fs, objix_p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG, + data_spix_offset + i, data_pix, cur_pix); + if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST) { + // index bad also, cannot mend this file + SPIFFS_CHECK_DBG("PA: FIXUP: index bad %i, cannot mend - delete object\n", res); + // delete file + res = spiffs_delete_obj_lazy(fs, objix_p_hdr->obj_id); + } + SPIFFS_CHECK_RES(res); + restart = 1; + + } else if (rpix_within_range) { + + // valid reference + // read referenced page header + spiffs_page_header rp_hdr; + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, rpix), sizeof(spiffs_page_header), (u8_t*)&rp_hdr); + SPIFFS_CHECK_RES(res); + + // cross reference page header check + if (rp_hdr.obj_id != (p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) || + rp_hdr.span_ix != data_spix_offset + i || + (rp_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED)) != + (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_INDEX)) { + SPIFFS_CHECK_DBG("PA: pix %04x has inconsistent page header ix id/span:%04x/%04x, ref id/span:%04x/%04x flags:%02x\n", + rpix, p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, data_spix_offset + i, + rp_hdr.obj_id, rp_hdr.span_ix, rp_hdr.flags); + // try finding correct page + spiffs_page_ix data_pix; + res = spiffs_obj_lu_find_id_and_span(fs, p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, + data_spix_offset + i, rpix, &data_pix); + if (res == SPIFFS_ERR_NOT_FOUND) { + res = SPIFFS_OK; + data_pix = 0; + } + SPIFFS_CHECK_RES(res); + if (data_pix == 0) { + // not found, this index is badly borked + SPIFFS_CHECK_DBG("PA: FIXUP: index bad, delete object id %04x\n", p_hdr.obj_id); + res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id); + SPIFFS_CHECK_RES(res); + break; + } else { + // found it, so rewrite index + SPIFFS_CHECK_DBG("PA: FIXUP: found correct data pix %04x, rewrite ix pix %04x id %04x\n", + data_pix, cur_pix, p_hdr.obj_id); + res = spiffs_rewrite_index(fs, p_hdr.obj_id, data_spix_offset + i, data_pix, cur_pix); + if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST) { + // index bad also, cannot mend this file + SPIFFS_CHECK_DBG("PA: FIXUP: index bad %i, cannot mend!\n", res); + res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id); + } + SPIFFS_CHECK_RES(res); + restart = 1; + } + } + else { + // mark rpix as referenced + const u32_t rpix_byte_ix = (rpix - pix_offset) / (8/bits); + const u8_t rpix_bit_ix = (rpix & ((8/bits)-1)) * bits; + if (fs->work[rpix_byte_ix] & (1<<(rpix_bit_ix + 1))) { + SPIFFS_CHECK_DBG("PA: pix %04x multiple referenced from page %04x\n", + rpix, cur_pix); + // Here, we should have fixed all broken references - getting this means there + // must be multiple files with same object id. Only solution is to delete + // the object which is referring to this page + SPIFFS_CHECK_DBG("PA: FIXUP: removing object %04x and page %04x\n", + p_hdr.obj_id, cur_pix); + res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id); + SPIFFS_CHECK_RES(res); + // extra precaution, delete this page also + res = spiffs_page_delete(fs, cur_pix); + SPIFFS_CHECK_RES(res); + restart = 1; + } + fs->work[rpix_byte_ix] |= (1<<(rpix_bit_ix + 1)); + } + } + } // for all index entries + } // found index + + // next page + cur_pix++; + } + // next block + cur_block++; + } + // check consistency bitmap + if (!restart) { + spiffs_page_ix objix_pix; + spiffs_page_ix rpix; + + int byte_ix; + int bit_ix; + for (byte_ix = 0; !restart && byte_ix < SPIFFS_CFG_LOG_PAGE_SZ(fs); byte_ix++) { + for (bit_ix = 0; !restart && bit_ix < 8/bits; bit_ix ++) { + u8_t bitmask = (fs->work[byte_ix] >> (bit_ix * bits)) & 0x7; + spiffs_page_ix cur_pix = pix_offset + byte_ix * (8/bits) + bit_ix; + + // 000 ok - free, unreferenced, not index + + if (bitmask == 0x1) { + + // 001 + SPIFFS_CHECK_DBG("PA: pix %04x USED, UNREFERENCED, not index\n", cur_pix); + + u8_t rewrite_ix_to_this = 0; + u8_t delete_page = 0; + // check corresponding object index entry + spiffs_page_header p_hdr; + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); + SPIFFS_CHECK_RES(res); + + res = spiffs_object_get_data_page_index_reference(fs, p_hdr.obj_id, p_hdr.span_ix, + &rpix, &objix_pix); + if (res == SPIFFS_OK) { + if (((rpix == (spiffs_page_ix)-1 || rpix > SPIFFS_MAX_PAGES(fs)) || (SPIFFS_IS_LOOKUP_PAGE(fs, rpix)))) { + // pointing to a bad page altogether, rewrite index to this + rewrite_ix_to_this = 1; + SPIFFS_CHECK_DBG("PA: corresponding ref is bad: %04x, rewrite to this %04x\n", rpix, cur_pix); + } else { + // pointing to something else, check what + spiffs_page_header rp_hdr; + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, rpix), sizeof(spiffs_page_header), (u8_t*)&rp_hdr); + SPIFFS_CHECK_RES(res); + if (((p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) == rp_hdr.obj_id) && + ((rp_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL)) == + (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_DELET))) { + // pointing to something else valid, just delete this page then + SPIFFS_CHECK_DBG("PA: corresponding ref is good but different: %04x, delete this %04x\n", rpix, cur_pix); + delete_page = 1; + } else { + // pointing to something weird, update index to point to this page instead + if (rpix != cur_pix) { + SPIFFS_CHECK_DBG("PA: corresponding ref is weird: %04x %s%s%s%s, rewrite this %04x\n", rpix, + (rp_hdr.flags & SPIFFS_PH_FLAG_INDEX) ? "" : "INDEX ", + (rp_hdr.flags & SPIFFS_PH_FLAG_DELET) ? "" : "DELETED ", + (rp_hdr.flags & SPIFFS_PH_FLAG_USED) ? "NOTUSED " : "", + (rp_hdr.flags & SPIFFS_PH_FLAG_FINAL) ? "NOTFINAL " : "", + cur_pix); + rewrite_ix_to_this = 1; + } else { + // should not happen, destined for fubar + } + } + } + } else if (res == SPIFFS_ERR_NOT_FOUND) { + SPIFFS_CHECK_DBG("PA: corresponding ref not found, delete %04x\n", cur_pix); + delete_page = 1; + res = SPIFFS_OK; + } + + if (rewrite_ix_to_this) { + // if pointing to invalid page, redirect index to this page + SPIFFS_CHECK_DBG("PA: FIXUP: rewrite index id %04x data spix %04x to point to this pix: %04x\n", + p_hdr.obj_id, p_hdr.span_ix, cur_pix); + res = spiffs_rewrite_index(fs, p_hdr.obj_id, p_hdr.span_ix, cur_pix, objix_pix); + if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST) { + // index bad also, cannot mend this file + SPIFFS_CHECK_DBG("PA: FIXUP: index bad %i, cannot mend!\n", res); + res = spiffs_page_delete(fs, cur_pix); + SPIFFS_CHECK_RES(res); + res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id); + } + SPIFFS_CHECK_RES(res); + restart = 1; + continue; + } else if (delete_page) { + SPIFFS_CHECK_DBG("PA: FIXUP: deleting page %04x\n", cur_pix); + res = spiffs_page_delete(fs, cur_pix); + } + SPIFFS_CHECK_RES(res); + } + if (bitmask == 0x2) { + + // 010 + SPIFFS_CHECK_DBG("PA: pix %04x FREE, REFERENCED, not index\n", cur_pix); + + // no op, this should be taken care of when checking valid references + } + + // 011 ok - busy, referenced, not index + + if (bitmask == 0x4) { + + // 100 + SPIFFS_CHECK_DBG("PA: pix %04x FREE, unreferenced, INDEX\n", cur_pix); + + // this should never happen, major fubar + } + + // 101 ok - busy, unreferenced, index + + if (bitmask == 0x6) { + + // 110 + SPIFFS_CHECK_DBG("PA: pix %04x FREE, REFERENCED, INDEX\n", cur_pix); + + // no op, this should be taken care of when checking valid references + } + if (bitmask == 0x7) { + + // 111 + SPIFFS_CHECK_DBG("PA: pix %04x USED, REFERENCED, INDEX\n", cur_pix); + + // no op, this should be taken care of when checking valid references + } + } + } + } + // next page range + if (!restart) { + pix_offset += pages_per_scan; + } + } // while page range not reached end return res; } + +s32_t spiffs_page_consistency_check(spiffs *fs) { + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_PAGE, SPIFFS_CHECK_PROGRESS, 0, 0); + s32_t res = spiffs_page_consistency_check_i(fs); + if (res != SPIFFS_OK) { + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_PAGE, SPIFFS_CHECK_ERROR, res, 0); + } + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_PAGE, SPIFFS_CHECK_PROGRESS, 256, 0); + return res; +} + +//--------------------------------------- +// Object index consistency + +static int spiffs_object_index_search(spiffs *fs, spiffs_obj_id obj_id) { + int i; + spiffs_obj_id *obj_table = (spiffs_obj_id *)fs->work; + obj_id &= ~SPIFFS_OBJ_ID_IX_FLAG; + for (i = 0; i < SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id); i++) { + if ((obj_table[i] & ~SPIFFS_OBJ_ID_IX_FLAG) == obj_id) { + return i; + } + } + return -1; +} + +s32_t spiffs_object_index_consistency_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block, + int cur_entry, u32_t user_data, void *user_p) { + s32_t res_c = SPIFFS_VIS_COUNTINUE; + s32_t res = SPIFFS_OK; + u32_t *log_ix = (u32_t *)user_p; + spiffs_obj_id *obj_table = (spiffs_obj_id *)fs->work; + + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS, + (cur_block * 256)/fs->block_count, 0); + + if (obj_id != SPIFFS_OBJ_ID_FREE && obj_id != SPIFFS_OBJ_ID_DELETED && (obj_id & SPIFFS_OBJ_ID_IX_FLAG)) { + spiffs_page_header p_hdr; + spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, cur_block, cur_entry); + + // load header + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); + SPIFFS_CHECK_RES(res); + + if (p_hdr.span_ix == 0 && + (p_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) == + (SPIFFS_PH_FLAG_DELET)) { + SPIFFS_CHECK_DBG("IX: pix %04x, obj id:%04x spix:%04x header not fully deleted - deleting\n", + cur_pix, obj_id, p_hdr.span_ix); + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_INDEX, SPIFFS_CHECK_DELETE_PAGE, cur_pix, obj_id); + res = spiffs_page_delete(fs, cur_pix); + SPIFFS_CHECK_RES(res); + return res_c; + } + + if ((p_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) == + (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) { + return res_c; + } + + if (p_hdr.span_ix == 0) { + // objix header page, register objid as reachable + int r = spiffs_object_index_search(fs, obj_id); + if (r == -1) { + // not registered, do it + obj_table[*log_ix] = obj_id & ~SPIFFS_OBJ_ID_IX_FLAG; + (*log_ix)++; + if (*log_ix >= SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id)) { + *log_ix = 0; + } + } + } else { // span index + // objix page, see if header can be found + int r = spiffs_object_index_search(fs, obj_id); + u8_t delete = 0; + if (r == -1) { + // not in temporary index, try finding it + spiffs_page_ix objix_hdr_pix; + res = spiffs_obj_lu_find_id_and_span(fs, obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &objix_hdr_pix); + res_c = SPIFFS_VIS_COUNTINUE_RELOAD; + if (res == SPIFFS_OK) { + // found, register as reachable + obj_table[*log_ix] = obj_id & ~SPIFFS_OBJ_ID_IX_FLAG; + } else if (res == SPIFFS_ERR_NOT_FOUND) { + // not found, register as unreachable + delete = 1; + obj_table[*log_ix] = obj_id | SPIFFS_OBJ_ID_IX_FLAG; + } else { + SPIFFS_CHECK_RES(res); + } + (*log_ix)++; + if (*log_ix >= SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id)) { + *log_ix = 0; + } + } else { + // in temporary index, check reachable flag + if ((obj_table[r] & SPIFFS_OBJ_ID_IX_FLAG)) { + // registered as unreachable + delete = 1; + } + } + + if (delete) { + SPIFFS_CHECK_DBG("IX: FIXUP: pix %04x, obj id:%04x spix:%04x is orphan index - deleting\n", + cur_pix, obj_id, p_hdr.span_ix); + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_INDEX, SPIFFS_CHECK_DELETE_ORPHANED_INDEX, cur_pix, obj_id); + res = spiffs_page_delete(fs, cur_pix); + SPIFFS_CHECK_RES(res); + } + } // span index + } // valid object index id + + return res_c; +} + +// Removes orphaned and partially deleted index pages. +// Scans for index pages. When an index page is found, corresponding index header is searched for. +// If no such page exists, the index page cannot be reached as no index header exists and must be +// deleted. +s32_t spiffs_object_index_consistency_check(spiffs *fs) { + s32_t res = SPIFFS_OK; + // impl note: + // fs->work is used for a temporary object index memory, listing found object ids and + // indicating whether they can be reached or not. Acting as a fifo if object ids cannot fit. + // In the temporary object index memory, SPIFFS_OBJ_ID_IX_FLAG bit is used to indicate + // a reachable/unreachable object id. + memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs)); + u32_t obj_id_log_ix = 0; + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS, 0, 0); + res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_object_index_consistency_check_v, 0, &obj_id_log_ix, + 0, 0); + if (res == SPIFFS_VIS_END) { + res = SPIFFS_OK; + } + if (res != SPIFFS_OK) { + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_INDEX, SPIFFS_CHECK_ERROR, res, 0); + } + if (fs->check_cb_f) fs->check_cb_f(SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS, 256, 0); + return res; +} + diff --git a/src/spiffs_gc.c b/src/spiffs_gc.c index e7e9153..1e949bb 100644 --- a/src/spiffs_gc.c +++ b/src/spiffs_gc.c @@ -1,6 +1,90 @@ #include "spiffs.h" #include "spiffs_nucleus.h" +s32_t spiffs_gc_quick( + spiffs *fs) { + s32_t res = SPIFFS_OK; + u32_t blocks = fs->block_count; + spiffs_block_ix cur_block = 0; + u32_t cur_block_addr = SPIFFS_CFG_PHYS_ADDR(fs); + int cur_entry = 0; + spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work; + + u32_t entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id)); + + // find fully deleted blocks + // check each block + while (res == SPIFFS_OK && blocks--) { + u16_t deleted_pages_in_block = 0; + + int obj_lookup_page = 0; + // check each object lookup page + while (res == SPIFFS_OK && obj_lookup_page < SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + int entry_offset = obj_lookup_page * entries_per_page; + res = _spiffs_rd(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); + // check each entry + while (res == SPIFFS_OK && + cur_entry - entry_offset < entries_per_page && cur_entry < SPIFFS_PAGES_PER_BLOCK(fs)-SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + spiffs_obj_id obj_id = obj_lu_buf[cur_entry-entry_offset]; + if (obj_id == SPIFFS_OBJ_ID_FREE) { + obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs); + break; + } else if (obj_id == SPIFFS_OBJ_ID_DELETED) { + deleted_pages_in_block++; + } else { + obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs); + break; + } + cur_entry++; + } // per entry + obj_lookup_page++; + } // per object lookup page + + if (res == SPIFFS_OK && deleted_pages_in_block == SPIFFS_PAGES_PER_BLOCK(fs)-SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + // found a fully deleted block + fs->stats_p_deleted -= deleted_pages_in_block; + + u32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, cur_block); + s32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs); + + SPIFFS_GC_DBG("gc_check: erase block %i\n", cur_block); + + while (size > 0) { + SPIFFS_GC_DBG("gc_check: erase %08x:%08x\n", addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); + res = fs->cfg.hal_erase_f(addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); + addr += SPIFFS_CFG_PHYS_ERASE_SZ(fs); + size -= SPIFFS_CFG_PHYS_ERASE_SZ(fs); + } + fs->free_blocks++; + + // register erase count for this block + res = _spiffs_wr(fs, SPIFFS_OP_C_UPDT | SPIFFS_OP_T_OBJ_LU2, 0, + SPIFFS_ERASE_COUNT_PADDR(fs, cur_block), + sizeof(spiffs_obj_id), (u8_t *)&fs->max_erase_count); + SPIFFS_CHECK_RES(res); + + fs->max_erase_count++; + +#if SPIFFS_CACHE + { + int i; + for (i = 0; i < SPIFFS_PAGES_PER_BLOCK(fs); i++) { + spiffs_cache_drop_page(fs, SPIFFS_PAGE_FOR_BLOCK(fs, cur_block) + i); + } + } +#endif + return res; + } + + cur_entry = 0; + cur_block++; + cur_block_addr += SPIFFS_CFG_LOG_BLOCK_SZ(fs); + } // per block + + return res; +} + s32_t spiffs_gc_check( spiffs *fs, u32_t len) { @@ -10,13 +94,15 @@ s32_t spiffs_gc_check( - fs->stats_p_allocated - fs->stats_p_deleted; int tries = 0; - if (fs->free_blocks > 2 && + if (fs->free_blocks > 3 && len < free_pages * SPIFFS_DATA_PAGE_SIZE(fs)) { return SPIFFS_OK; } + //printf("gcing started %i dirty, blocks %i free, want %i bytes\n", fs->stats_p_allocated + fs->stats_p_deleted, fs->free_blocks, len); + do { - SPIFFS_GC_DBG("\ngc_check #i: run gc free_blocks:%i pfree:%i pallo:%i pdele:%i [%i] len:%i of %i\n", + SPIFFS_GC_DBG("\ngc_check #%i: run gc free_blocks:%i pfree:%i pallo:%i pdele:%i [%i] len:%i of %i\n", tries, fs->free_blocks, free_pages, fs->stats_p_allocated, fs->stats_p_deleted, (free_pages+fs->stats_p_allocated+fs->stats_p_deleted), len, free_pages*SPIFFS_DATA_PAGE_SIZE(fs)); @@ -34,8 +120,15 @@ s32_t spiffs_gc_check( fs->stats_gc_runs++; #endif cand = cands[0]; + fs->cleaning = 1; + //printf("gcing: cleaning block %i\n", cand); res = spiffs_gc_clean(fs, cand); - SPIFFS_GC_DBG("gc_check: cleaning block %i, result %i\n", cand, res); + fs->cleaning = 0; + if (res < 0) { + SPIFFS_GC_DBG("gc_check: cleaning block %i, result %i\n", cand, res); + } else { + SPIFFS_GC_DBG("gc_check: cleaning block %i, result %i\n", cand, res); + } SPIFFS_CHECK_RES(res); res = spiffs_gc_erase_page_stats(fs, cand); @@ -46,8 +139,9 @@ s32_t spiffs_gc_check( // here we ignore res, just try erasing the block SPIFFS_GC_DBG("gc_check: erase block %i\n", cand); + //printf("gcing: erase block %i\n", cand); while (size > 0) { - SPIFFS_DBG("gc_check: erase %08x:%08x\n", addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); + SPIFFS_GC_DBG("gc_check: erase %08x:%08x\n", addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); res = fs->cfg.hal_erase_f(addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); addr += SPIFFS_CFG_PHYS_ERASE_SZ(fs); size -= SPIFFS_CFG_PHYS_ERASE_SZ(fs); @@ -56,6 +150,15 @@ s32_t spiffs_gc_check( free_pages = (SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)) * fs->block_count - fs->stats_p_allocated - fs->stats_p_deleted; + + // register erase count for this block + res = _spiffs_wr(fs, SPIFFS_OP_C_UPDT | SPIFFS_OP_T_OBJ_LU2, 0, + SPIFFS_ERASE_COUNT_PADDR(fs, cand), + sizeof(spiffs_obj_id), (u8_t *)&fs->max_erase_count); + SPIFFS_CHECK_RES(res); + + fs->max_erase_count++; + #if SPIFFS_CACHE { int i; @@ -64,10 +167,17 @@ s32_t spiffs_gc_check( } } #endif - } while (tries++ < SPIFFS_GC_MAX_RUNS && (fs->free_blocks <= 2 || + //printf("gcing #%i free blocks %i, free data %i of %i\n", + // tries, fs->free_blocks, + // free_pages*SPIFFS_DATA_PAGE_SIZE(fs), len); + } while (++tries < SPIFFS_GC_MAX_RUNS && (fs->free_blocks <= 2 || len > free_pages*SPIFFS_DATA_PAGE_SIZE(fs))); SPIFFS_GC_DBG("gc_check: finished\n"); + //printf("gcing finished %i dirty, blocks %i free, %i pages free, %i tries, res %i\n", + // fs->stats_p_allocated + fs->stats_p_deleted, + // fs->free_blocks, free_pages, tries, res); + return res; } @@ -92,7 +202,7 @@ s32_t spiffs_gc_erase_page_stats( cur_entry - entry_offset < entries_per_page && cur_entry < SPIFFS_PAGES_PER_BLOCK(fs)-SPIFFS_OBJ_LOOKUP_PAGES(fs)) { spiffs_obj_id obj_id = obj_lu_buf[cur_entry-entry_offset]; if (obj_id == SPIFFS_OBJ_ID_FREE) { - } else if (obj_id == SPIFFS_OBJ_ID_ERASED) { + } else if (obj_id == SPIFFS_OBJ_ID_DELETED) { dele++; } else { allo++; @@ -118,15 +228,15 @@ s32_t spiffs_gc_find_candidate( spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work; int cur_entry = 0; - // using fs->work area as sorted candidate memory, (spiffs_block_ix)cand_bix/(int)score - int max_candidates = MIN(fs->block_count, (SPIFFS_CFG_LOG_PAGE_SZ(fs)-8)/(sizeof(spiffs_block_ix) + sizeof(int))); + // using fs->work area as sorted candidate memory, (spiffs_block_ix)cand_bix/(s32_t)score + int max_candidates = MIN(fs->block_count, (SPIFFS_CFG_LOG_PAGE_SZ(fs)-8)/(sizeof(spiffs_block_ix) + sizeof(s32_t))); *candidate_count = 0; memset(fs->work, 0xff, SPIFFS_CFG_LOG_PAGE_SZ(fs)); // divide up work area into block indices and scores // todo alignment? spiffs_block_ix *cand_blocks = (spiffs_block_ix *)fs->work; - int *cand_scores = (int *)(fs->work + max_candidates * sizeof(spiffs_block_ix)); + s32_t *cand_scores = (s32_t *)(fs->work + max_candidates * sizeof(spiffs_block_ix)); *block_candidates = cand_blocks; @@ -150,7 +260,7 @@ s32_t spiffs_gc_find_candidate( if (obj_id == SPIFFS_OBJ_ID_FREE) { // when a free entry is encountered, scan logic ensures that all following entries are free also break; - } else if (obj_id == SPIFFS_OBJ_ID_ERASED) { + } else if (obj_id == SPIFFS_OBJ_ID_DELETED) { deleted_pages_in_block++; } else { used_pages_in_block++; @@ -163,9 +273,26 @@ s32_t spiffs_gc_find_candidate( // calculate score and insert into candidate table // stoneage sort, but probably not so many blocks if (res == SPIFFS_OK && deleted_pages_in_block > 0) { - int score = deleted_pages_in_block * SPIFFS_GC_HEUR_W_DELET + used_pages_in_block * SPIFFS_GC_HEUR_W_USED; + // read erase count + spiffs_obj_id erase_count; + res = _spiffs_rd(fs, SPIFFS_OP_C_READ | SPIFFS_OP_T_OBJ_LU2, 0, + SPIFFS_ERASE_COUNT_PADDR(fs, cur_block), + sizeof(spiffs_obj_id), (u8_t *)&erase_count); + SPIFFS_CHECK_RES(res); + + spiffs_obj_id erase_age; + if (fs->max_erase_count > erase_count) { + erase_age = fs->max_erase_count - erase_count; + } else { + erase_age = SPIFFS_OBJ_ID_FREE - (erase_count - fs->max_erase_count); + } + + s32_t score = + deleted_pages_in_block * SPIFFS_GC_HEUR_W_DELET + + used_pages_in_block * SPIFFS_GC_HEUR_W_USED + + erase_age * SPIFFS_GC_HEUR_W_ERASE_AGE; int cand_ix = 0; - SPIFFS_DBG("gc_check: bix:%i del:%i use:%i score:%i\n", cur_block, deleted_pages_in_block, used_pages_in_block, score); + SPIFFS_GC_DBG("gc_check: bix:%i del:%i use:%i score:%i\n", cur_block, deleted_pages_in_block, used_pages_in_block, score); while (cand_ix < max_candidates) { if (cand_blocks[cand_ix] == (spiffs_block_ix)-1) { cand_blocks[cand_ix] = cur_block; @@ -196,9 +323,9 @@ s32_t spiffs_gc_find_candidate( } typedef enum { - MOVE_OBJ_IX, FIND_OBJ_DATA, MOVE_OBJ_DATA, + MOVE_OBJ_IX, FINISHED } spiffs_gc_clean_state; @@ -213,7 +340,6 @@ typedef struct { // Empties given block by moving all data into free pages of another block // Strategy: -// scan object lookup for object index pages, move to new page in other block // loop: // scan object lookup for object data pages // for first found id, check spix and load corresponding object index page to memory @@ -223,6 +349,7 @@ typedef struct { // when reached end of lookup, store updated object index // pop object scan lookup entry index // repeat loop until end of object lookup +// scan object lookup again for remaining object index pages, move to new page in other block // s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { s32_t res = SPIFFS_OK; @@ -234,18 +361,20 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { spiffs_page_object_ix_header *objix_hdr = (spiffs_page_object_ix_header *)fs->work; spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work; + SPIFFS_GC_DBG("gc_clean: cleaning block %i\n", bix); + memset(&gc, 0, sizeof(spiffs_gc)); - gc.state = MOVE_OBJ_IX; + gc.state = FIND_OBJ_DATA; if (fs->free_cursor_block_ix == bix) { - // move free cursor to next block + // move free cursor to next block, cannot use free pages from the block we want to clean fs->free_cursor_block_ix = (bix+1)%fs->block_count; fs->free_cursor_obj_lu_entry = 0; - SPIFFS_DBG("gc_clean: move free cursor to block %i\n", fs->free_cursor_block_ix); + SPIFFS_GC_DBG("gc_clean: move free cursor to block %i\n", fs->free_cursor_block_ix); } while (res == SPIFFS_OK && gc.state != FINISHED) { - SPIFFS_DBG("gc_clean: state = %i entry:%i\n", gc.state, cur_entry); + SPIFFS_GC_DBG("gc_clean: state = %i entry:%i\n", gc.state, cur_entry); gc.obj_id_found = 0; // scan through lookup pages @@ -265,40 +394,10 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { // act upon object id depending on gc state switch (gc.state) { - case MOVE_OBJ_IX: - if (obj_id != SPIFFS_OBJ_ID_ERASED && obj_id != SPIFFS_OBJ_ID_FREE && (obj_id & SPIFFS_OBJ_ID_IX_FLAG)) { - // found an index object id - spiffs_page_header p_hdr; - spiffs_page_ix new_pix; - // load header - res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, - 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); - SPIFFS_CHECK_RES(res); - if (p_hdr.flags & SPIFFS_PH_FLAG_DELET) { - // move page - res = spiffs_page_move(fs, 0, 0, &p_hdr, cur_pix, &new_pix); - SPIFFS_DBG("gc_clean: MOVE_OBJIX move objix %04x:%04x page %04x to %04x\n", obj_id, p_hdr.span_ix, cur_pix, new_pix); - SPIFFS_CHECK_RES(res); - spiffs_cb_object_event(fs, 0, SPIFFS_EV_IX_UPD, obj_id, p_hdr.span_ix, new_pix, 0); - // move wipes obj_lu, reload it - res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, - 0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), - SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); - SPIFFS_CHECK_RES(res); - } else { - // page is deleted but not deleted in lookup, scrap it - SPIFFS_DBG("gc_clean: MOVE_OBJIX wipe objix %04x:%04x page %04x\n", obj_id, p_hdr.span_ix, cur_pix); - res = spiffs_page_delete(fs, cur_pix); - if (res == SPIFFS_OK) { - spiffs_cb_object_event(fs, 0, SPIFFS_EV_IX_DEL, obj_id, p_hdr.span_ix, cur_pix, 0); - } - } - SPIFFS_CHECK_RES(res); - } - break; case FIND_OBJ_DATA: - if (obj_id != SPIFFS_OBJ_ID_ERASED && obj_id != SPIFFS_OBJ_ID_FREE) { - SPIFFS_DBG("gc_clean: FIND_DATA state:%i - found obj id %04x\n", gc.state, obj_id); + if (obj_id != SPIFFS_OBJ_ID_DELETED && obj_id != SPIFFS_OBJ_ID_FREE && + ((obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0)) { + SPIFFS_GC_DBG("gc_clean: FIND_DATA state:%i - found obj id %04x\n", gc.state, obj_id); gc.obj_id_found = 1; gc.cur_obj_id = obj_id; scan = 0; @@ -310,15 +409,15 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); SPIFFS_CHECK_RES(res); - SPIFFS_DBG("gc_clean: MOVE_DATA found data page %04x:%04x @ %04x\n", gc.cur_obj_id, p_hdr.span_ix, cur_pix); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA found data page %04x:%04x @ %04x\n", gc.cur_obj_id, p_hdr.span_ix, cur_pix); if (SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, p_hdr.span_ix) != gc.cur_objix_spix) { - SPIFFS_DBG("gc_clean: MOVE_DATA no objix spix match, take in another run\n", gc.cur_obj_id, p_hdr.span_ix, cur_pix); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA no objix spix match, take in another run\n"); } else { spiffs_page_ix new_data_pix; if (p_hdr.flags & SPIFFS_PH_FLAG_DELET) { // move page - res = spiffs_page_move(fs, 0, 0, &p_hdr, cur_pix, &new_data_pix); - SPIFFS_DBG("gc_clean: MOVE_DATA move objix %04x:%04x page %04x to %04x\n", gc.cur_obj_id, p_hdr.span_ix, cur_pix, new_data_pix); + res = spiffs_page_move(fs, 0, 0, obj_id, &p_hdr, cur_pix, &new_data_pix); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA move objix %04x:%04x page %04x to %04x\n", gc.cur_obj_id, p_hdr.span_ix, cur_pix, new_data_pix); SPIFFS_CHECK_RES(res); // move wipes obj_lu, reload it res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, @@ -327,7 +426,7 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { SPIFFS_CHECK_RES(res); } else { // page is deleted but not deleted in lookup, scrap it - SPIFFS_DBG("gc_clean: MOVE_DATA wipe objix %04x:%04x page %04x\n", obj_id, p_hdr.span_ix, cur_pix); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA wipe objix %04x:%04x page %04x\n", obj_id, p_hdr.span_ix, cur_pix); res = spiffs_page_delete(fs, cur_pix); SPIFFS_CHECK_RES(res); new_data_pix = SPIFFS_OBJ_ID_FREE; @@ -336,15 +435,47 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { if (gc.cur_objix_spix == 0) { // update object index header page ((spiffs_page_ix*)((void*)objix_hdr + sizeof(spiffs_page_object_ix_header)))[p_hdr.span_ix] = new_data_pix; - SPIFFS_DBG("gc_clean: MOVE_DATA wrote page %04x to objix_hdr entry %02x in mem\n", new_data_pix, SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix)); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA wrote page %04x to objix_hdr entry %02x in mem\n", new_data_pix, SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix)); } else { // update object index page ((spiffs_page_ix*)((void*)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix)] = new_data_pix; - SPIFFS_DBG("gc_clean: MOVE_DATA wrote page %04x to objix entry %02x in mem\n", new_data_pix, SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix)); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA wrote page %04x to objix entry %02x in mem\n", new_data_pix, SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix)); } } } break; + case MOVE_OBJ_IX: + if (obj_id != SPIFFS_OBJ_ID_DELETED && obj_id != SPIFFS_OBJ_ID_FREE && + (obj_id & SPIFFS_OBJ_ID_IX_FLAG)) { + // found an index object id + spiffs_page_header p_hdr; + spiffs_page_ix new_pix; + // load header + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); + SPIFFS_CHECK_RES(res); + if (p_hdr.flags & SPIFFS_PH_FLAG_DELET) { + // move page + res = spiffs_page_move(fs, 0, 0, obj_id, &p_hdr, cur_pix, &new_pix); + SPIFFS_GC_DBG("gc_clean: MOVE_OBJIX move objix %04x:%04x page %04x to %04x\n", obj_id, p_hdr.span_ix, cur_pix, new_pix); + SPIFFS_CHECK_RES(res); + spiffs_cb_object_event(fs, 0, SPIFFS_EV_IX_UPD, obj_id, p_hdr.span_ix, new_pix, 0); + // move wipes obj_lu, reload it + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, + 0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), + SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + SPIFFS_CHECK_RES(res); + } else { + // page is deleted but not deleted in lookup, scrap it + SPIFFS_GC_DBG("gc_clean: MOVE_OBJIX wipe objix %04x:%04x page %04x\n", obj_id, p_hdr.span_ix, cur_pix); + res = spiffs_page_delete(fs, cur_pix); + if (res == SPIFFS_OK) { + spiffs_cb_object_event(fs, 0, SPIFFS_EV_IX_DEL, obj_id, p_hdr.span_ix, cur_pix, 0); + } + } + SPIFFS_CHECK_RES(res); + } + break; default: scan = 0; break; @@ -358,10 +489,6 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { // state finalization and switch switch (gc.state) { - case MOVE_OBJ_IX: - gc.state = FIND_OBJ_DATA; - cur_entry = 0; // restart entry scan index - break; case FIND_OBJ_DATA: if (gc.obj_id_found) { // find out corresponding obj ix page and load it to memory @@ -374,17 +501,18 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); SPIFFS_CHECK_RES(res); gc.cur_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, p_hdr.span_ix); - SPIFFS_DBG("gc_clean: FIND_DATA find objix span_ix:%04x\n", gc.cur_objix_spix); - res = spiffs_obj_lu_find_id_and_index(fs, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objix_spix, &objix_pix); + SPIFFS_GC_DBG("gc_clean: FIND_DATA find objix span_ix:%04x\n", gc.cur_objix_spix); + res = spiffs_obj_lu_find_id_and_span(fs, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objix_spix, 0, &objix_pix); SPIFFS_CHECK_RES(res); - SPIFFS_DBG("gc_clean: FIND_DATA found object index at page %04x\n", objix_pix); + SPIFFS_GC_DBG("gc_clean: FIND_DATA found object index at page %04x\n", objix_pix); res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); SPIFFS_CHECK_RES(res); - SPIFFS_VALIDATE_OBJIX(objix->p_hdr, gc.cur_obj_id, gc.cur_objix_spix); + SPIFFS_VALIDATE_OBJIX(objix->p_hdr, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objix_spix); gc.cur_objix_pix = objix_pix; } else { - gc.state = FINISHED; + gc.state = MOVE_OBJ_IX; + cur_entry = 0; // restart entry scan index } break; case MOVE_OBJ_DATA: { @@ -394,24 +522,27 @@ s32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix) { cur_entry = gc.stored_scan_entry_index; if (gc.cur_objix_spix == 0) { // store object index header page - res = spiffs_object_update_index_hdr(fs, 0, gc.cur_objix_pix, fs->work, 0, 0, &new_objix_pix); - SPIFFS_DBG("gc_clean: MOVE_DATA store modified objix_hdr page, %04x:%04x\n", new_objix_pix, 0); + res = spiffs_object_update_index_hdr(fs, 0, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objix_pix, fs->work, 0, 0, &new_objix_pix); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA store modified objix_hdr page, %04x:%04x\n", new_objix_pix, 0); SPIFFS_CHECK_RES(res); } else { // store object index page spiffs_page_ix new_objix_pix; - res = spiffs_page_move(fs, 0, fs->work, 0, gc.cur_objix_pix, &new_objix_pix); - SPIFFS_DBG("gc_clean: MOVE_DATA store modified objix page, %04x:%04x\n", new_objix_pix, objix->p_hdr.span_ix); + res = spiffs_page_move(fs, 0, fs->work, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, gc.cur_objix_pix, &new_objix_pix); + SPIFFS_GC_DBG("gc_clean: MOVE_DATA store modified objix page, %04x:%04x\n", new_objix_pix, objix->p_hdr.span_ix); SPIFFS_CHECK_RES(res); spiffs_cb_object_event(fs, 0, SPIFFS_EV_IX_UPD, gc.cur_obj_id, objix->p_hdr.span_ix, new_objix_pix, 0); } } break; + case MOVE_OBJ_IX: + gc.state = FINISHED; + break; default: cur_entry = 0; break; } - SPIFFS_DBG("gc_clean: state-> %i\n", gc.state); + SPIFFS_GC_DBG("gc_clean: state-> %i\n", gc.state); } // while state != FINISHED diff --git a/src/spiffs_hydrogen.c b/src/spiffs_hydrogen.c index b42fb10..cdbe089 100644 --- a/src/spiffs_hydrogen.c +++ b/src/spiffs_hydrogen.c @@ -13,7 +13,8 @@ static s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh); s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work, u8_t *fd_space, u32_t fd_space_size, - void *cache, u32_t cache_size) { + void *cache, u32_t cache_size, + spiffs_check_callback check_cb_f) { SPIFFS_LOCK(fs); memset(fs, 0, sizeof(spiffs)); memcpy(&fs->cfg, config, sizeof(spiffs_config)); @@ -64,6 +65,8 @@ s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work, SPIFFS_DBG("available file descriptors: %i\n", fs->fd_count); SPIFFS_DBG("free blocks: %i\n", fs->free_blocks); + fs->check_cb_f = check_cb_f; + SPIFFS_UNLOCK(fs); return 0; @@ -270,7 +273,8 @@ s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { SPIFFS_CACHE_DBG("CACHE_WR_DUMP: dumping cache page %i for fd %i:&04x, boundary viol, offs:%i size:%i\n", fd->cache_page->ix, fd->file_nbr, fd->obj_id, fd->cache_page->offset, fd->cache_page->size); res = spiffs_hydro_write(fs, fd, - get_cache_page(fs, get_cache(fs), fd->cache_page->ix), fd->cache_page->offset, fd->cache_page->size); + spiffs_get_cache_page(fs, spiffs_get_cache(fs), fd->cache_page->ix), + fd->cache_page->offset, fd->cache_page->size); spiffs_cache_fd_release(fs, fd->cache_page); } else { // writing within cache @@ -293,8 +297,8 @@ s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { SPIFFS_CACHE_DBG("CACHE_WR_WRITE: storing to cache page %i for fd %i:%04x, offs %i:%i len %i\n", fd->cache_page->ix, fd->file_nbr, fd->obj_id, offset, offset_in_cpage, len); - spiffs_cache *cache = get_cache(fs); - u8_t *cpage_data = get_cache_page(fs, cache, fd->cache_page->ix); + spiffs_cache *cache = spiffs_get_cache(fs); + u8_t *cpage_data = spiffs_get_cache_page(fs, cache, fd->cache_page->ix); memcpy(&cpage_data[offset_in_cpage], buf, len); fd->cache_page->size = MAX(fd->cache_page->size, offset_in_cpage + len); fd->fdoffset += len; @@ -314,7 +318,8 @@ s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len) { SPIFFS_CACHE_DBG("CACHE_WR_DUMP: dumping cache page %i for fd %i:%04x, big write, offs:%i size:%i\n", fd->cache_page->ix, fd->file_nbr, fd->obj_id, fd->cache_page->offset, fd->cache_page->size); res = spiffs_hydro_write(fs, fd, - get_cache_page(fs, get_cache(fs), fd->cache_page->ix), fd->cache_page->offset, fd->cache_page->size); + spiffs_get_cache_page(fs, spiffs_get_cache(fs), fd->cache_page->ix), + fd->cache_page->offset, fd->cache_page->size); spiffs_cache_fd_release(fs, fd->cache_page); res = spiffs_hydro_write(fs, fd, buf, offset, len); SPIFFS_API_CHECK_RES(fs, res); @@ -363,8 +368,8 @@ s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence) { spiffs_span_ix objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix); if (fd->cursor_objix_spix != objix_spix) { spiffs_page_ix pix; - res = spiffs_obj_lu_find_id_and_index( - fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, objix_spix, &pix); + res = spiffs_obj_lu_find_id_and_span( + fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, objix_spix, 0, &pix); SPIFFS_API_CHECK_RES_UNLOCK(fs, res); fd->cursor_objix_spix = objix_spix; fd->cursor_objix_pix = pix; @@ -380,16 +385,29 @@ s32_t SPIFFS_remove(spiffs *fs, const char *path) { SPIFFS_API_CHECK_MOUNT(fs); SPIFFS_LOCK(fs); - spiffs_fd fd; + spiffs_fd *fd; spiffs_page_ix pix; s32_t res; - fd.file_nbr = 0; - fd.fs = fs; + + res = spiffs_fd_find_new(fs, &fd); + SPIFFS_API_CHECK_RES_UNLOCK(fs, res); + res = spiffs_object_find_object_index_header_by_name(fs, (u8_t*)path, &pix); + if (res != SPIFFS_OK) { + spiffs_fd_return(fs, fd->file_nbr); + } SPIFFS_API_CHECK_RES_UNLOCK(fs, res); - res = spiffs_object_open_by_page(fs, pix, &fd, 0,0); + + res = spiffs_object_open_by_page(fs, pix, fd, 0,0); + if (res != SPIFFS_OK) { + spiffs_fd_return(fs, fd->file_nbr); + } SPIFFS_API_CHECK_RES_UNLOCK(fs, res); - res = spiffs_object_truncate(&fd, 0, 1); + + res = spiffs_object_truncate(fd, 0, 1); + if (res != SPIFFS_OK) { + spiffs_fd_return(fs, fd->file_nbr); + } SPIFFS_API_CHECK_RES_UNLOCK(fs, res); SPIFFS_UNLOCK(fs); @@ -418,13 +436,50 @@ s32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh) { return 0; } +static s32_t spiffs_stat_pix(spiffs *fs, spiffs_page_ix pix, spiffs_file fh, spiffs_stat *s) { + spiffs_page_object_ix_header objix_hdr; + spiffs_obj_id obj_id; + s32_t res =_spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, fh, + SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr); + SPIFFS_API_CHECK_RES(fs, res); + + u32_t obj_id_addr = SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs , pix)) + + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pix) * sizeof(spiffs_obj_id); + res =_spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, fh, + obj_id_addr, sizeof(spiffs_obj_id), (u8_t *)&obj_id); + SPIFFS_API_CHECK_RES(fs, res); + + s->obj_id = obj_id; + s->type = objix_hdr.type; + s->size = objix_hdr.size == SPIFFS_UNDEFINED_LEN ? 0 : objix_hdr.size; + strncpy((char *)s->name, (char *)objix_hdr.name, SPIFFS_OBJ_NAME_LEN); + + return res; +} + +s32_t SPIFFS_stat(spiffs *fs, const char *path, spiffs_stat *s) { + SPIFFS_API_CHECK_MOUNT(fs); + SPIFFS_LOCK(fs); + + s32_t res; + spiffs_page_ix pix; + + res = spiffs_object_find_object_index_header_by_name(fs, (u8_t*)path, &pix); + SPIFFS_API_CHECK_RES_UNLOCK(fs, res); + + res = spiffs_stat_pix(fs, pix, 0, s); + + SPIFFS_UNLOCK(fs); + + return res; +} + s32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s) { SPIFFS_API_CHECK_MOUNT(fs); SPIFFS_LOCK(fs); spiffs_fd *fd; s32_t res; - spiffs_page_object_ix_header objix_hdr; res = spiffs_fd_get(fs, fh, &fd); SPIFFS_API_CHECK_RES_UNLOCK(fs, res); @@ -433,17 +488,7 @@ s32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s) { spiffs_fflush_cache(fs, fh); #endif - res = spiffs_phys_rd(fs, -#if SPIFFS_CACHE - SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, fh, -#endif - SPIFFS_PAGE_TO_PADDR(fs, fd->objix_hdr_pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr); - SPIFFS_API_CHECK_RES_UNLOCK(fs, res); - - s->obj_id = objix_hdr.p_hdr.obj_id; - s->type = objix_hdr.type; - s->size = objix_hdr.size == SPIFFS_UNDEFINED_LEN ? 0 : objix_hdr.size; - strncpy((char *)s->name, (char *)objix_hdr.name, SPIFFS_OBJ_NAME_LEN); + res = spiffs_stat_pix(fs, fd->objix_hdr_pix, fh, s); SPIFFS_UNLOCK(fs); @@ -467,7 +512,8 @@ static s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh) { SPIFFS_CACHE_DBG("CACHE_WR_DUMP: dumping cache page %i for fd %i:%04x, flush, offs:%i size:%i\n", fd->cache_page->ix, fd->file_nbr, fd->obj_id, fd->cache_page->offset, fd->cache_page->size); res = spiffs_hydro_write(fs, fd, - get_cache_page(fs, get_cache(fs), fd->cache_page->ix), fd->cache_page->offset, fd->cache_page->size); + spiffs_get_cache_page(fs, spiffs_get_cache(fs), fd->cache_page->ix), + fd->cache_page->offset, fd->cache_page->size); spiffs_cache_fd_release(fs, fd->cache_page); } } @@ -524,7 +570,7 @@ static s32_t spiffs_read_dir_v( void *user_p) { s32_t res; spiffs_page_object_ix_header objix_hdr; - if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_ERASED || + if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_DELETED || (obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0) { return SPIFFS_VIS_COUNTINUE; } @@ -533,11 +579,12 @@ static s32_t spiffs_read_dir_v( res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr); if (res != SPIFFS_OK) return res; - if ((objix_hdr.p_hdr.obj_id & SPIFFS_OBJ_ID_IX_FLAG) && + if ((obj_id & SPIFFS_OBJ_ID_IX_FLAG) && objix_hdr.p_hdr.span_ix == 0 && - (objix_hdr.p_hdr.flags& (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL)) == SPIFFS_PH_FLAG_DELET) { + (objix_hdr.p_hdr.flags& (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) == + (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) { struct spiffs_dirent *e = (struct spiffs_dirent *)user_p; - e->obj_id = objix_hdr.p_hdr.obj_id; + e->obj_id = obj_id; strcpy((char *)e->name, (char *)objix_hdr.name); e->type = objix_hdr.type; e->size = objix_hdr.size == SPIFFS_UNDEFINED_LEN ? 0 : objix_hdr.size; @@ -590,8 +637,70 @@ s32_t SPIFFS_check(spiffs *fs) { SPIFFS_API_CHECK_MOUNT(fs); SPIFFS_LOCK(fs); - res = spiffs_area_check(fs, 0); + res = spiffs_lookup_consistency_check(fs, 0); + + res = spiffs_object_index_consistency_check(fs); + + res = spiffs_page_consistency_check(fs); + + res = spiffs_obj_lu_scan(fs); SPIFFS_UNLOCK(fs); return res; } + +#if SPIFFS_TEST_VISUALISATION +s32_t SPIFFS_vis(spiffs *fs) { + s32_t res = SPIFFS_OK; + SPIFFS_API_CHECK_MOUNT(fs); + SPIFFS_LOCK(fs); + + u32_t entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id)); + spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work; + spiffs_block_ix bix = 0; + + while (bix < fs->block_count) { + // check each object lookup page + int obj_lookup_page = 0; + int cur_entry = 0; + + while (res == SPIFFS_OK && obj_lookup_page < SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + int entry_offset = obj_lookup_page * entries_per_page; + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, + 0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + // check each entry + while (res == SPIFFS_OK && + cur_entry - entry_offset < entries_per_page && cur_entry < SPIFFS_PAGES_PER_BLOCK(fs)-SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + spiffs_obj_id obj_id = obj_lu_buf[cur_entry-entry_offset]; + if (cur_entry == 0) { + spiffs_printf("%4i ", bix); + } else if ((cur_entry & 0x3f) == 0) { + spiffs_printf(" "); + } + if (obj_id == SPIFFS_OBJ_ID_FREE) { + spiffs_printf(SPIFFS_TEST_VIS_FREE_STR); + } else if (obj_id == SPIFFS_OBJ_ID_DELETED) { + spiffs_printf(SPIFFS_TEST_VIS_DELE_STR); + } else if (obj_id & SPIFFS_OBJ_ID_IX_FLAG){ + spiffs_printf(SPIFFS_TEST_VIS_INDX_STR(obj_id)); + } else { + spiffs_printf(SPIFFS_TEST_VIS_DATA_STR(obj_id)); + } + cur_entry++; + if ((cur_entry & 0x3f) == 0) { + spiffs_printf("\n"); + } + } // per entry + obj_lookup_page++; + } // per object lookup page + if ((cur_entry & 0x1f) != 0) { + spiffs_printf("\n"); + } + + bix++; + } // per block + + SPIFFS_UNLOCK(fs); + return res; +} +#endif diff --git a/src/spiffs_nucleus.c b/src/spiffs_nucleus.c index e3d3d2d..db092d6 100644 --- a/src/spiffs_nucleus.c +++ b/src/spiffs_nucleus.c @@ -1,22 +1,20 @@ #include "spiffs.h" #include "spiffs_nucleus.h" -#define SPIFFS_VALIDATE_OBJIX(ph, objid, spix) \ - 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 ((ph).span_ix != (spix)) return SPIFFS_ERR_INDEX_SPAN_MISMATCH;\ - if (((ph).obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) != ((objid) & ~SPIFFS_OBJ_ID_IX_FLAG)) return SPIFFS_ERR_INDEX_WRONG_ID; - -#define SPIFFS_VALIDATE_DATA(ph, objid, spix) \ - 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 ((ph).span_ix != (spix)) return SPIFFS_ERR_DATA_SPAN_MISMATCH; \ - if (((ph).obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) != ((objid) & ~SPIFFS_OBJ_ID_IX_FLAG)) return SPIFFS_ERR_DATA_WRONG_ID; - static s32_t spiffs_page_data_check(spiffs *fs, spiffs_fd *fd, spiffs_page_ix pix, spiffs_span_ix spix) { s32_t res = SPIFFS_OK; + if (pix == (spiffs_page_ix)-1) { + // referring to page 0xffff...., bad object index + return SPIFFS_ERR_INDEX_REF_FREE; + } + if (pix % SPIFFS_PAGES_PER_BLOCK(fs) < SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + // referring to an object lookup page, bad object index + return SPIFFS_ERR_INDEX_REF_LU; + } + if (pix > SPIFFS_MAX_PAGES(fs)) { + // referring to a bad page + return SPIFFS_ERR_INDEX_REF_INVALID; + } #if SPIFFS_PAGE_CHECK spiffs_page_header ph; res = _spiffs_rd( @@ -26,13 +24,25 @@ static s32_t spiffs_page_data_check(spiffs *fs, spiffs_fd *fd, spiffs_page_ix pi sizeof(spiffs_page_header), (u8_t *)&ph); SPIFFS_CHECK_RES(res); - SPIFFS_VALIDATE_DATA(ph, fd->obj_id, spix); + SPIFFS_VALIDATE_DATA(ph, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, spix); #endif return res; } static s32_t spiffs_page_index_check(spiffs *fs, spiffs_fd *fd, spiffs_page_ix pix, spiffs_span_ix spix) { s32_t res = SPIFFS_OK; + if (pix == (spiffs_page_ix)-1) { + // referring to page 0xffff...., bad object index + return SPIFFS_ERR_INDEX_FREE; + } + if (pix % SPIFFS_PAGES_PER_BLOCK(fs) < SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + // referring to an object lookup page, bad object index + return SPIFFS_ERR_INDEX_LU; + } + if (pix > SPIFFS_MAX_PAGES(fs)) { + // referring to a bad page + return SPIFFS_ERR_INDEX_INVALID; + } #if SPIFFS_PAGE_CHECK spiffs_page_header ph; res = _spiffs_rd( @@ -67,7 +77,7 @@ s32_t spiffs_phys_wr( #endif -static s32_t spiffs_phys_cpy( +s32_t spiffs_phys_cpy( spiffs *fs, spiffs_file fh, u32_t dst, @@ -144,8 +154,19 @@ s32_t spiffs_obj_lu_find_entry_visitor( if (block_ix) *block_ix = cur_block; if (index_entry) *index_entry = cur_entry; if (v) { - res = v(fs, obj_lu_buf[cur_entry-entry_offset], cur_block, cur_entry, user_data, user_p); - if (res == SPIFFS_VIS_COUNTINUE) { + res = v( + fs, + (flags & SPIFFS_VIS_CHECK_PH) ? obj_id : obj_lu_buf[cur_entry-entry_offset], + cur_block, + cur_entry, + user_data, + user_p); + if (res == SPIFFS_VIS_COUNTINUE || res == SPIFFS_VIS_COUNTINUE_RELOAD) { + if (res == SPIFFS_VIS_COUNTINUE_RELOAD) { + res = _spiffs_rd(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(res); + } res = SPIFFS_OK; cur_entry++; entry_count--; @@ -194,7 +215,7 @@ static s32_t spiffs_obj_lu_scan_v( fs->free_blocks++; // todo optimize further, return SPIFFS_NEXT_BLOCK } - } else if (obj_id == SPIFFS_OBJ_ID_ERASED) { + } else if (obj_id == SPIFFS_OBJ_ID_DELETED) { fs->stats_p_deleted++; } else { fs->stats_p_allocated++; @@ -204,6 +225,7 @@ static s32_t spiffs_obj_lu_scan_v( } // Scans thru all obj lu and counts free, deleted and used pages +// Find the maximum block erase count s32_t spiffs_obj_lu_scan( spiffs *fs) { s32_t res; @@ -231,6 +253,36 @@ s32_t spiffs_obj_lu_scan( SPIFFS_CHECK_RES(res); + bix = 0; + spiffs_obj_id erase_count_final; + spiffs_obj_id erase_count_min = 0; + spiffs_obj_id erase_count_max = SPIFFS_OBJ_ID_FREE; + while (bix < fs->block_count) { + spiffs_obj_id erase_count; + res = _spiffs_rd(fs, + SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_ERASE_COUNT_PADDR(fs, bix) , + sizeof(spiffs_obj_id), (u8_t *)&erase_count); + SPIFFS_CHECK_RES(res); + if (erase_count != SPIFFS_OBJ_ID_FREE) { + erase_count_min = MIN(erase_count_min, erase_count); + erase_count_max = MAX(erase_count_max, erase_count); + } + bix++; + } + + if (erase_count_min == 0 && erase_count_max == SPIFFS_OBJ_ID_FREE) { + // 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 + erase_count_final = erase_count_min; + } else { + erase_count_final = erase_count_max; + } + + fs->max_erase_count = erase_count_final; + return res; } @@ -243,6 +295,9 @@ s32_t spiffs_obj_lu_find_free( spiffs_block_ix *block_ix, int *index_entry) { s32_t res; + if (!fs->cleaning && fs->free_blocks < 2) { + return SPIFFS_ERR_FULL; + } res = spiffs_obj_lu_find_id(fs, starting_block, starting_index_entry, SPIFFS_OBJ_ID_FREE, block_ix, index_entry); if (res == SPIFFS_OK) { @@ -255,6 +310,7 @@ s32_t spiffs_obj_lu_find_free( if (res == SPIFFS_VIS_END) { SPIFFS_DBG("fs full\n"); } + return res == SPIFFS_VIS_END ? SPIFFS_ERR_FULL : res; } @@ -276,7 +332,7 @@ s32_t spiffs_obj_lu_find_id( } -static s32_t spiffs_obj_lu_find_id_and_index_v( +static s32_t spiffs_obj_lu_find_id_and_span_v( spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix bix, @@ -289,7 +345,11 @@ static s32_t spiffs_obj_lu_find_id_and_index_v( res = _spiffs_rd(fs, 0, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_header), (u8_t *)&ph); SPIFFS_CHECK_RES(res); - if (ph.span_ix == (spiffs_span_ix)user_data && ((ph.flags & (SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET)) == SPIFFS_PH_FLAG_DELET)) { + if (ph.obj_id == obj_id && + ph.span_ix == (spiffs_span_ix)user_data && + (ph.flags & (SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED)) == SPIFFS_PH_FLAG_DELET && + !((obj_id & SPIFFS_OBJ_ID_IX_FLAG) && (ph.flags & SPIFFS_PH_FLAG_IXDELE) == 0 && ph.span_ix == 0) && + (user_p == 0 || *((spiffs_page_ix *)user_p) != pix)) { return SPIFFS_OK; } else { return SPIFFS_VIS_COUNTINUE; @@ -298,10 +358,11 @@ static s32_t spiffs_obj_lu_find_id_and_index_v( // Find object lookup entry containing given id and span index // Iterate over object lookup pages in each block until a given object id entry is found -s32_t spiffs_obj_lu_find_id_and_index( +s32_t spiffs_obj_lu_find_id_and_span( spiffs *fs, spiffs_obj_id obj_id, spiffs_span_ix spix, + spiffs_page_ix exclusion_pix, spiffs_page_ix *pix) { s32_t res; spiffs_block_ix bix; @@ -312,9 +373,48 @@ s32_t spiffs_obj_lu_find_id_and_index( fs->cursor_obj_lu_entry, SPIFFS_VIS_CHECK_ID, obj_id, - spiffs_obj_lu_find_id_and_index_v, + spiffs_obj_lu_find_id_and_span_v, (u32_t)spix, - 0, + exclusion_pix ? &exclusion_pix : 0, + &bix, + &entry); + + if (res == SPIFFS_VIS_END) { + res = SPIFFS_ERR_NOT_FOUND; + } + + SPIFFS_CHECK_RES(res); + + if (pix) { + *pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry); + } + + fs->cursor_block_ix = bix; + fs->cursor_obj_lu_entry = entry; + + return res; +} + +// Find object lookup entry containing given id and span index in page headers only +// Iterate over object lookup pages in each block until a given object id entry is found +s32_t spiffs_obj_lu_find_id_and_span_by_phdr( + spiffs *fs, + spiffs_obj_id obj_id, + spiffs_span_ix spix, + spiffs_page_ix exclusion_pix, + spiffs_page_ix *pix) { + s32_t res; + spiffs_block_ix bix; + int entry; + + res = spiffs_obj_lu_find_entry_visitor(fs, + fs->cursor_block_ix, + fs->cursor_obj_lu_entry, + SPIFFS_VIS_CHECK_PH, + obj_id, + spiffs_obj_lu_find_id_and_span_v, + (u32_t)spix, + exclusion_pix ? &exclusion_pix : 0, &bix, &entry); @@ -339,6 +439,7 @@ s32_t spiffs_obj_lu_find_id_and_index( // data may be NULL; where only page header is stored, len and page_offs is ignored s32_t spiffs_page_allocate_data( spiffs *fs, + spiffs_obj_id obj_id, spiffs_page_header *ph, u8_t *data, u32_t len, @@ -355,12 +456,13 @@ s32_t spiffs_page_allocate_data( // occupy page in object lookup res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, - 0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + entry * sizeof(spiffs_obj_id), sizeof(spiffs_obj_id), (u8_t*)&ph->obj_id); + 0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + entry * sizeof(spiffs_obj_id), sizeof(spiffs_obj_id), (u8_t*)&obj_id); SPIFFS_CHECK_RES(res); fs->stats_p_allocated++; // write page header + ph->flags &= ~SPIFFS_PH_FLAG_USED; res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, bix, entry), sizeof(spiffs_page_header), (u8_t*)ph); SPIFFS_CHECK_RES(res); @@ -396,6 +498,7 @@ s32_t spiffs_page_move( spiffs *fs, spiffs_file fh, u8_t *page_data, + spiffs_obj_id obj_id, spiffs_page_header *page_hdr, spiffs_page_ix src_pix, spiffs_page_ix *dst_pix) { @@ -419,6 +522,7 @@ s32_t spiffs_page_move( was_final = (p_hdr->flags & SPIFFS_PH_FLAG_FINAL) == 0; // write unfinalized page p_hdr->flags |= SPIFFS_PH_FLAG_FINAL; + p_hdr->flags &= ~SPIFFS_PH_FLAG_USED; res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, 0, SPIFFS_PAGE_TO_PADDR(fs, free_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), page_data); } else { @@ -431,14 +535,14 @@ s32_t spiffs_page_move( res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, 0, SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, free_pix)) + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, free_pix) * sizeof(spiffs_page_ix), sizeof(spiffs_obj_id), - (u8_t *)&p_hdr->obj_id); + (u8_t *)&obj_id); SPIFFS_CHECK_RES(res); fs->stats_p_allocated++; if (was_final) { // mark finalized in destination page - p_hdr->flags &= ~SPIFFS_PH_FLAG_FINAL; + p_hdr->flags &= ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_USED); res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT, fh, SPIFFS_PAGE_TO_PADDR(fs, free_pix) + offsetof(spiffs_page_header, flags), @@ -457,9 +561,9 @@ s32_t spiffs_page_delete( spiffs_page_ix pix) { s32_t res; spiffs_page_header hdr; - hdr.flags = 0xff & ~SPIFFS_PH_FLAG_DELET; + hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED); // mark deleted entry in source object lookup - spiffs_obj_id d_obj_id = SPIFFS_OBJ_ID_ERASED; + spiffs_obj_id d_obj_id = SPIFFS_OBJ_ID_DELETED; res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_DELE, 0, SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, pix)) + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pix) * sizeof(spiffs_page_ix), @@ -476,6 +580,7 @@ s32_t spiffs_page_delete( SPIFFS_PAGE_TO_PADDR(fs, pix) + offsetof(spiffs_page_header, flags), sizeof(u8_t), (u8_t *)&hdr.flags); + return res; } @@ -499,7 +604,7 @@ s32_t spiffs_object_create( // find free entry res = spiffs_obj_lu_find_free(fs, fs->free_cursor_block_ix, fs->free_cursor_obj_lu_entry, &bix, &entry); SPIFFS_CHECK_RES(res); - SPIFFS_DBG("found free page @ %04x bix:%i entry:%i\n", SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry), bix, entry); + SPIFFS_DBG("create: found free page @ %04x bix:%i entry:%i\n", SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry), bix, entry); // occupy page in object lookup res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT, @@ -511,7 +616,7 @@ s32_t spiffs_object_create( // write empty object index page oix_hdr.p_hdr.obj_id = obj_id; oix_hdr.p_hdr.span_ix = 0; - oix_hdr.p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX); + oix_hdr.p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED); oix_hdr.type = type; oix_hdr.size = SPIFFS_UNDEFINED_LEN; // keep ones so we can update later without wasting this page strncpy((char *)&oix_hdr.name, (char *)name, SPIFFS_OBJ_NAME_LEN); @@ -538,6 +643,7 @@ s32_t spiffs_object_create( s32_t spiffs_object_update_index_hdr( spiffs *fs, spiffs_fd *fd, + spiffs_obj_id obj_id, spiffs_page_ix objix_hdr_pix, u8_t *new_objix_hdr_data, u8_t name[SPIFFS_OBJ_NAME_LEN], @@ -547,6 +653,8 @@ s32_t spiffs_object_update_index_hdr( spiffs_page_object_ix_header *objix_hdr; spiffs_page_ix new_objix_hdr_pix; + obj_id |= SPIFFS_OBJ_ID_IX_FLAG; + if (new_objix_hdr_data) { // object index header page already given to us, no need to load it objix_hdr = (spiffs_page_object_ix_header *)new_objix_hdr_data; @@ -558,7 +666,7 @@ s32_t spiffs_object_update_index_hdr( objix_hdr = (spiffs_page_object_ix_header *)fs->work; } - SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, objix_hdr->p_hdr.obj_id, 0); + SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, obj_id, 0); // change name if (name) { @@ -569,14 +677,14 @@ s32_t spiffs_object_update_index_hdr( } // move and update page - res = spiffs_page_move(fs, fd == 0 ? 0 : fd->file_nbr, (u8_t*)objix_hdr, 0, objix_hdr_pix, &new_objix_hdr_pix); + res = spiffs_page_move(fs, fd == 0 ? 0 : fd->file_nbr, (u8_t*)objix_hdr, obj_id, 0, objix_hdr_pix, &new_objix_hdr_pix); if (res == SPIFFS_OK) { if (new_pix) { *new_pix = new_objix_hdr_pix; } // callback on object index update - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, objix_hdr->p_hdr.obj_id, objix_hdr->p_hdr.span_ix, new_objix_hdr_pix, objix_hdr->size); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, obj_id, objix_hdr->p_hdr.span_ix, new_objix_hdr_pix, objix_hdr->size); if (fd) fd->objix_hdr_pix = new_objix_hdr_pix; // if this is not in the registered cluster } @@ -607,7 +715,7 @@ void spiffs_cb_object_event( } } else if (ev == SPIFFS_EV_IX_DEL) { cur_fd->file_nbr = 0; - cur_fd->obj_id = SPIFFS_OBJ_ID_ERASED; + cur_fd->obj_id = SPIFFS_OBJ_ID_DELETED; } } if (cur_fd->cursor_objix_spix == spix) { @@ -631,7 +739,7 @@ s32_t spiffs_object_open_by_id( s32_t res = SPIFFS_OK; spiffs_page_ix pix; - res = spiffs_obj_lu_find_id_and_index(fs, obj_id, 0, &pix); + res = spiffs_obj_lu_find_id_and_span(fs, obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &pix); SPIFFS_CHECK_RES(res); res = spiffs_object_open_by_page(fs, pix, fd, attr, mode); @@ -648,18 +756,25 @@ s32_t spiffs_object_open_by_page( spiffs_mode mode) { s32_t res = SPIFFS_OK; spiffs_page_object_ix_header oix_hdr; + spiffs_obj_id obj_id; res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&oix_hdr); SPIFFS_CHECK_RES(res); + spiffs_block_ix bix = SPIFFS_BLOCK_FOR_PAGE(fs, pix); + int entry = SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pix); + + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, + 0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + entry * sizeof(spiffs_obj_id), sizeof(spiffs_obj_id), (u8_t *)&obj_id); + fd->fs = fs; fd->objix_hdr_pix = pix; fd->size = oix_hdr.size; fd->offset = 0; fd->cursor_objix_pix = pix; fd->cursor_objix_spix = 0; - fd->obj_id = oix_hdr.p_hdr.obj_id; + fd->obj_id = obj_id; fd->mode = mode; SPIFFS_VALIDATE_OBJIX(oix_hdr.p_hdr, fd->obj_id, 0); @@ -717,7 +832,8 @@ s32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { SPIFFS_CHECK_RES(res); } else { // was a nonempty object, update to new page - res = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, fs->work, 0, offset+written, &new_objix_hdr_page); + res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, fs->work, 0, offset+written, &new_objix_hdr_page); SPIFFS_CHECK_RES(res); SPIFFS_DBG("append: %04x store new objix_hdr, %04x:%04x, written %i\n", fd->obj_id, new_objix_hdr_page, 0, written); @@ -730,11 +846,12 @@ s32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); SPIFFS_CHECK_RES(res); - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, objix->p_hdr.obj_id, objix->p_hdr.span_ix, cur_objix_pix, 0); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD,fd->obj_id, objix->p_hdr.span_ix, cur_objix_pix, 0); // update length in object index header page - res = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, 0, 0, offset+written, &new_objix_hdr_page); + res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, 0, 0, offset+written, &new_objix_hdr_page); SPIFFS_CHECK_RES(res); - SPIFFS_DBG("append: %04x store new size %i in objix_hdr, %04x:%04x, written %i\n", fd->obj_id, + SPIFFS_DBG("append: %04x store new size I %i in objix_hdr, %04x:%04x, written %i\n", fd->obj_id, offset+written, new_objix_hdr_page, 0, written); } fd->size = offset+written; @@ -756,7 +873,8 @@ s32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { p_hdr.obj_id = fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG; p_hdr.span_ix = cur_objix_spix; p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX); - res = spiffs_page_allocate_data(fs, &p_hdr, 0, 0, 0, 1, &cur_objix_pix); + res = spiffs_page_allocate_data(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, + &p_hdr, 0, 0, 0, 1, &cur_objix_pix); SPIFFS_CHECK_RES(res); spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_NEW, fd->obj_id, cur_objix_spix, cur_objix_pix, 0); // quick "load" of new object index page @@ -771,7 +889,7 @@ s32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { if (fd->cursor_objix_spix == cur_objix_spix) { pix = fd->cursor_objix_pix; } else { - res = spiffs_obj_lu_find_id_and_index(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, &pix); + res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &pix); SPIFFS_CHECK_RES(res); } SPIFFS_DBG("append: %04x found object index at page %04x\n", fd->obj_id, pix); @@ -796,7 +914,8 @@ s32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { p_hdr.obj_id = fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG; p_hdr.span_ix = data_spix; p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL); // finalize immediately - res = spiffs_page_allocate_data(fs, &p_hdr, &data[written], to_spiffs_wr, page_offs, 1, &data_page); + res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, + &p_hdr, &data[written], to_spiffs_wr, page_offs, 1, &data_page); SPIFFS_DBG("append: %04x store new data page, %04x:%04x offset:%i, len %i, written %i\n", fd->obj_id, data_page, data_spix, page_offs, to_spiffs_wr, written); } else { @@ -859,12 +978,13 @@ s32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { res2 = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); SPIFFS_CHECK_RES(res2); - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, objix->p_hdr.obj_id, objix->p_hdr.span_ix, cur_objix_pix, 0); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, cur_objix_pix, 0); // update size in object header index page - SPIFFS_DBG("append: %04x store new size %i in objix_hdr, %04x:%04x, written %i\n", fd->obj_id + res2 = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, 0, 0, offset+written, &new_objix_hdr_page); + SPIFFS_DBG("append: %04x store new size II %i in objix_hdr, %04x:%04x, written %i\n", fd->obj_id , offset+written, new_objix_hdr_page, 0, written); - res2 = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, 0, 0, offset+written, &new_objix_hdr_page); SPIFFS_CHECK_RES(res2); } else { // wrote within object index header page @@ -881,10 +1001,11 @@ s32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); SPIFFS_CHECK_RES(res2); // callback on object index update - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, objix_hdr->p_hdr.obj_id, objix_hdr->p_hdr.span_ix, cur_objix_pix, objix_hdr->size); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, fd->obj_id, objix_hdr->p_hdr.span_ix, cur_objix_pix, objix_hdr->size); } else { // modifying object index header page, update size and make new copy - res2 = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, fs->work, 0, offset+written, &new_objix_hdr_page); + res2 = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, fs->work, 0, offset+written, &new_objix_hdr_page); SPIFFS_DBG("append: %04x store modified objix_hdr page, %04x:%04x, written %i\n", fd->obj_id , new_objix_hdr_page, 0, written); SPIFFS_CHECK_RES(res2); @@ -931,7 +1052,8 @@ s32_t spiffs_object_modify(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { // store previous object index (header) page, unless first pass if (prev_objix_spix == 0) { // store previous object index header page - res = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, fs->work, 0, 0, &new_objix_hdr_pix); + res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, fs->work, 0, 0, &new_objix_hdr_pix); SPIFFS_DBG("modify: store modified objix_hdr page, %04x:%04x, written %i\n", new_objix_hdr_pix, 0, written); SPIFFS_CHECK_RES(res); } else { @@ -941,10 +1063,10 @@ s32_t spiffs_object_modify(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { res = spiffs_page_index_check(fs, fd, cur_objix_pix, prev_objix_spix); SPIFFS_CHECK_RES(res); - res = spiffs_page_move(fs, fd->file_nbr, (u8_t*)objix, 0, cur_objix_pix, &new_objix_pix); + res = spiffs_page_move(fs, fd->file_nbr, (u8_t*)objix, fd->obj_id, 0, cur_objix_pix, &new_objix_pix); SPIFFS_DBG("modify: store previous modified objix page, %04x:%04x, written %i\n", new_objix_pix, objix->p_hdr.span_ix, written); SPIFFS_CHECK_RES(res); - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, objix->p_hdr.obj_id, objix->p_hdr.span_ix, new_objix_pix, 0); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, new_objix_pix, 0); } } @@ -963,7 +1085,7 @@ s32_t spiffs_object_modify(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { if (fd->cursor_objix_spix == cur_objix_spix) { pix = fd->cursor_objix_pix; } else { - res = spiffs_obj_lu_find_id_and_index(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, &pix); + res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &pix); SPIFFS_CHECK_RES(res); } SPIFFS_DBG("modify: found object index at page %04x\n", pix); @@ -993,10 +1115,10 @@ s32_t spiffs_object_modify(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { p_hdr.obj_id = fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG; p_hdr.span_ix = data_spix; p_hdr.flags = 0xff; - p_hdr.flags = 0xff; if (page_offs == 0 && to_write == SPIFFS_DATA_PAGE_SIZE(fs)) { // a full page, allocate and write a new page of data - res = spiffs_page_allocate_data(fs, &p_hdr, &data[written], to_write, page_offs, 1, &data_pix); + res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, + &p_hdr, &data[written], to_write, page_offs, 1, &data_pix); SPIFFS_DBG("modify: store new data page, %04x:%04x offset:%i, len %i, written %i\n", data_pix, data_spix, page_offs, to_write, written); } else { // write to existing page, allocate new and copy unmodified data @@ -1004,7 +1126,8 @@ s32_t spiffs_object_modify(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { res = spiffs_page_data_check(fs, fd, orig_data_pix, data_spix); SPIFFS_CHECK_RES(res); - res = spiffs_page_allocate_data(fs, &p_hdr, 0, 0, 0, 0, &data_pix); + res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, + &p_hdr, 0, 0, 0, 0, &data_pix); if (res != SPIFFS_OK) break; // copy unmodified data @@ -1075,16 +1198,17 @@ s32_t spiffs_object_modify(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len) { res2 = spiffs_page_index_check(fs, fd, cur_objix_pix, cur_objix_spix); SPIFFS_CHECK_RES(res2); - res2 = spiffs_page_move(fs, fd->file_nbr, (u8_t*)objix, 0, cur_objix_pix, &new_objix_pix); + res2 = spiffs_page_move(fs, fd->file_nbr, (u8_t*)objix, fd->obj_id, 0, cur_objix_pix, &new_objix_pix); SPIFFS_DBG("modify: store modified objix page, %04x:%04x, written %i\n", new_objix_pix, cur_objix_spix, written); fd->cursor_objix_pix = new_objix_pix; fd->cursor_objix_spix = cur_objix_spix; SPIFFS_CHECK_RES(res2); - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, objix->p_hdr.obj_id, objix->p_hdr.span_ix, new_objix_pix, 0); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, new_objix_pix, 0); } else { // wrote within object index header page - res2 = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, fs->work, 0, 0, &new_objix_hdr_pix); + res2 = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, fs->work, 0, 0, &new_objix_hdr_pix); SPIFFS_DBG("modify: store modified objix_hdr page, %04x:%04x, written %i\n", new_objix_hdr_pix, 0, written); SPIFFS_CHECK_RES(res2); } @@ -1102,16 +1226,16 @@ static s32_t spiffs_object_find_object_index_header_by_name_v( s32_t res; spiffs_page_object_ix_header objix_hdr; spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry); - if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_ERASED || + if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_DELETED || (obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0) { return SPIFFS_VIS_COUNTINUE; } res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr); SPIFFS_CHECK_RES(res); - if ((objix_hdr.p_hdr.obj_id & SPIFFS_OBJ_ID_IX_FLAG) && - objix_hdr.p_hdr.span_ix == 0 && - (objix_hdr.p_hdr.flags& (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL)) == SPIFFS_PH_FLAG_DELET) { + if (objix_hdr.p_hdr.span_ix == 0 && + (objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) == + (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) { if (strcmp((char *)user_p, (char *)objix_hdr.name) == 0) { return SPIFFS_OK; } @@ -1155,6 +1279,10 @@ s32_t spiffs_object_find_object_index_header_by_name( return res; } +void stop() { + printf("break"); +} + // Truncates object to new size. If new size is null, object may be removed totally s32_t spiffs_object_truncate( spiffs_fd *fd, @@ -1176,6 +1304,16 @@ s32_t spiffs_object_truncate( spiffs_page_ix data_pix; spiffs_page_ix new_objix_hdr_pix; + // before truncating, check if object is to be fully removed and mark this + if (remove && new_size == 0) { + u8_t flags = ~( SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE); + res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT, + fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, fd->objix_hdr_pix) + offsetof(spiffs_page_header, flags), + sizeof(u8_t), + (u8_t *)&flags); + SPIFFS_CHECK_RES(res); + } + // delete from end of object until desired len is reached while (cur_size > new_size) { cur_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix); @@ -1191,11 +1329,12 @@ s32_t spiffs_object_truncate( res = spiffs_page_delete(fs, objix_pix); SPIFFS_CHECK_RES(res); - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_DEL, objix->p_hdr.obj_id, objix->p_hdr.span_ix, objix_pix, 0); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_DEL, fd->obj_id, objix->p_hdr.span_ix, objix_pix, 0); if (prev_objix_spix > 0) { // update object index header page SPIFFS_DBG("truncate: update objix hdr page %04x:%04x to size %i\n", fd->objix_hdr_pix, prev_objix_spix, cur_size); - res = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, 0, 0, cur_size, &new_objix_hdr_pix); + res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, 0, 0, cur_size, &new_objix_hdr_pix); SPIFFS_CHECK_RES(res); fd->size = cur_size; } @@ -1204,9 +1343,10 @@ s32_t spiffs_object_truncate( if (cur_objix_spix == 0) { objix_pix = fd->objix_hdr_pix; } else { - res = spiffs_obj_lu_find_id_and_index(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, &objix_pix); + res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &objix_pix); SPIFFS_CHECK_RES(res); } + SPIFFS_DBG("truncate: load objix page %04x:%04x for data spix:%04x\n", objix_pix, cur_objix_spix, data_spix); res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work); @@ -1259,7 +1399,8 @@ s32_t spiffs_object_truncate( p_hdr.span_ix = data_spix; p_hdr.flags = 0xff; // allocate new page and copy unmodified data - res = spiffs_page_allocate_data(fs, &p_hdr, 0, 0, 0, 0, &new_data_pix); + res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, + &p_hdr, 0, 0, 0, 0, &new_data_pix); if (res != SPIFFS_OK) break; res = spiffs_phys_cpy(fs, 0, SPIFFS_PAGE_TO_PADDR(fs, new_data_pix) + sizeof(spiffs_page_header), @@ -1314,13 +1455,15 @@ s32_t spiffs_object_truncate( SPIFFS_DBG("truncate: reset objix_hdr page %04x\n", objix_pix); memset(fs->work + sizeof(spiffs_page_object_ix_header), 0xff, SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_object_ix_header)); - res = spiffs_object_update_index_hdr(fs, fd, objix_pix, fs->work, 0, SPIFFS_UNDEFINED_LEN, &new_objix_hdr_pix); + res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + objix_pix, fs->work, 0, SPIFFS_UNDEFINED_LEN, &new_objix_hdr_pix); SPIFFS_CHECK_RES(res); } } else { // update object index header page SPIFFS_DBG("truncate: update object index header page with indices and size\n"); - res = spiffs_object_update_index_hdr(fs, fd, objix_pix, fs->work, 0, cur_size, &new_objix_hdr_pix); + res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + objix_pix, fs->work, 0, cur_size, &new_objix_hdr_pix); SPIFFS_CHECK_RES(res); } } else { @@ -1331,15 +1474,16 @@ s32_t spiffs_object_truncate( SPIFFS_CHECK_RES(res); // move and update object index page - res = spiffs_page_move(fs, fd->file_nbr, (u8_t*)objix_hdr, 0, objix_pix, &new_objix_pix); + res = spiffs_page_move(fs, fd->file_nbr, (u8_t*)objix_hdr, fd->obj_id, 0, objix_pix, &new_objix_pix); SPIFFS_CHECK_RES(res); - spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, objix->p_hdr.obj_id, objix->p_hdr.span_ix, new_objix_pix, 0); + spiffs_cb_object_event(fs, fd, SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, new_objix_pix, 0); SPIFFS_DBG("truncate: store modified objix page, %04x:%04x\n", new_objix_pix, cur_objix_spix); fd->cursor_objix_pix = new_objix_pix; fd->cursor_objix_spix = cur_objix_spix; fd->offset = cur_size; // update object index header page with new size - res = spiffs_object_update_index_hdr(fs, fd, fd->objix_hdr_pix, 0, 0, cur_size, &new_objix_hdr_pix); + res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, + fd->objix_hdr_pix, 0, 0, cur_size, &new_objix_hdr_pix); SPIFFS_CHECK_RES(res); } fd->size = cur_size; @@ -1370,7 +1514,8 @@ s32_t spiffs_object_read( if (cur_objix_spix == 0) { objix_pix = fd->objix_hdr_pix; } else { - res = spiffs_obj_lu_find_id_and_index(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, &objix_pix); + SPIFFS_DBG("read: find objix %04x:%04x\n", fd->obj_id, cur_objix_spix); + res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &objix_pix); SPIFFS_CHECK_RES(res); } SPIFFS_DBG("read: load objix page %04x:%04x for data spix:%04x\n", objix_pix, cur_objix_spix, data_spix); @@ -1432,7 +1577,7 @@ typedef struct { static s32_t spiffs_obj_lu_find_free_obj_id_bitmap_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry, u32_t user_data, void *user_p) { - if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_ERASED) { + if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED) { spiffs_obj_id min_obj_id = user_data; id &= ~SPIFFS_OBJ_ID_IX_FLAG; int bit_ix = (id-min_obj_id) & 7; @@ -1446,7 +1591,7 @@ static s32_t spiffs_obj_lu_find_free_obj_id_bitmap_v(spiffs *fs, spiffs_obj_id i static s32_t spiffs_obj_lu_find_free_obj_id_compact_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry, u32_t user_data, void *user_p) { - if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_ERASED && (id & SPIFFS_OBJ_ID_IX_FLAG)) { + if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED && (id & SPIFFS_OBJ_ID_IX_FLAG)) { s32_t res; spiffs_free_obj_id_state *state = (spiffs_free_obj_id_state *)user_p; spiffs_page_header ph; @@ -1454,7 +1599,8 @@ static s32_t spiffs_obj_lu_find_free_obj_id_compact_v(spiffs *fs, spiffs_obj_id res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, bix, ix_entry), sizeof(spiffs_page_header), (u8_t*)&ph); if (res == SPIFFS_OK && ph.span_ix == 0 && - ((ph.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET)) == (SPIFFS_PH_FLAG_DELET))) { + ((ph.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET)) == + (SPIFFS_PH_FLAG_DELET))) { // ok object look up entry id &= ~SPIFFS_OBJ_ID_IX_FLAG; if (id >= state->min_obj_id && id <= state->max_obj_id) { diff --git a/src/spiffs_nucleus.h b/src/spiffs_nucleus.h index 121ab41..bc25d5b 100644 --- a/src/spiffs_nucleus.h +++ b/src/spiffs_nucleus.h @@ -110,8 +110,15 @@ #ifndef SPIFFS_NUCLEUS_H_ #define SPIFFS_NUCLEUS_H_ -#define SPIFFS_VIS_COUNTINUE -11000 -#define SPIFFS_VIS_END -11001 +#define _SPIFFS_ERR_CHECK_FIRST (SPIFFS_ERR_INTERNAL - 1) +#define SPIFFS_ERR_CHECK_OBJ_ID_MISM (SPIFFS_ERR_INTERNAL - 1) +#define SPIFFS_ERR_CHECK_SPIX_MISM (SPIFFS_ERR_INTERNAL - 2) +#define SPIFFS_ERR_CHECK_FLAGS_BAD (SPIFFS_ERR_INTERNAL - 3) +#define _SPIFFS_ERR_CHECK_LAST (SPIFFS_ERR_INTERNAL - 4) + +#define SPIFFS_VIS_COUNTINUE (SPIFFS_ERR_INTERNAL - 20) +#define SPIFFS_VIS_COUNTINUE_RELOAD (SPIFFS_ERR_INTERNAL - 21) +#define SPIFFS_VIS_END (SPIFFS_ERR_INTERNAL - 22) #define SPIFFS_EV_IX_UPD 0 #define SPIFFS_EV_IX_NEW 1 @@ -121,7 +128,7 @@ #define SPIFFS_UNDEFINED_LEN (-1) -#define SPIFFS_OBJ_ID_ERASED ((spiffs_obj_id)0) +#define SPIFFS_OBJ_ID_DELETED ((spiffs_obj_id)0) #define SPIFFS_OBJ_ID_FREE ((spiffs_obj_id)-1) #ifndef SPIFFS_SINGLETON @@ -137,6 +144,9 @@ ((fs)->cfg.phys_addr) #endif +// total number of pages +#define SPIFFS_MAX_PAGES(fs) \ + ( SPIFFS_CFG_PHYS_SZ(fs)/SPIFFS_CFG_LOG_PAGE_SZ(fs) ) // total number of pages per block, including object lookup pages #define SPIFFS_PAGES_PER_BLOCK(fs) \ ( SPIFFS_CFG_LOG_BLOCK_SZ(fs)/SPIFFS_CFG_LOG_PAGE_SZ(fs) ) @@ -169,16 +179,19 @@ ( ((addr) - SPIFFS_CFG_PHYS_ADDR(fs)) % SPIFFS_CFG_LOG_PAGE_SZ(fs) ) // returns containing block for given page #define SPIFFS_BLOCK_FOR_PAGE(fs, page) \ - ((page) / SPIFFS_PAGES_PER_BLOCK(fs)) + ( (page) / SPIFFS_PAGES_PER_BLOCK(fs) ) // returns starting page for block #define SPIFFS_PAGE_FOR_BLOCK(fs, block) \ - ((block) * SPIFFS_PAGES_PER_BLOCK(fs)) + ( (block) * SPIFFS_PAGES_PER_BLOCK(fs) ) // converts page to entry in object lookup page #define SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, page) \ - ((page) % SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)) + ( (page) % SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs) ) // returns data size in a data page #define SPIFFS_DATA_PAGE_SIZE(fs) \ ( SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_header) ) +// returns physical address for block's erase count +#define SPIFFS_ERASE_COUNT_PADDR(fs, bix) \ + ( SPIFFS_BLOCK_TO_PADDR(fs, bix) + SPIFFS_OBJ_LOOKUP_PAGES(fs) * SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_obj_id) ) // define helpers object @@ -206,19 +219,23 @@ #define SPIFFS_OP_C_MOVD (3<<2) #define SPIFFS_OP_C_FLSH (4<<2) #define SPIFFS_OP_C_READ (5<<2) +#define SPIFFS_OP_C_WRTHRU (6<<2) #define SPIFFS_OP_TYPE_MASK (3<<0) #define SPIFFS_OP_COM_MASK (7<<2) +// if 0, this page is written to, else clean +#define SPIFFS_PH_FLAG_USED (1<<0) // if 0, writing is finalized, else under modification -#define SPIFFS_PH_FLAG_FINAL (1<<0) -// if 0, page is deleted, else valid -#define SPIFFS_PH_FLAG_DELET (1<<1) -// if 0, page is corrupt, else ok -#define SPIFFS_PH_FLAG_CORRU (1<<2) +#define SPIFFS_PH_FLAG_FINAL (1<<1) // if 0, this is an index page, else a data page -#define SPIFFS_PH_FLAG_INDEX (1<<3) +#define SPIFFS_PH_FLAG_INDEX (1<<2) +// if 0, page is deleted, else valid +#define SPIFFS_PH_FLAG_DELET (1<<7) +// if 0, this index header is being deleted +#define SPIFFS_PH_FLAG_IXDELE (1<<6) + #define SPIFFS_CHECK_MOUNT(fs) \ ((fs)->block_count > 0) @@ -247,24 +264,28 @@ return -1; \ } - +// todo #define SPIFFS_VALIDATE_OBJIX(ph, objid, spix) \ + 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 ((ph).span_ix != (spix)) return SPIFFS_ERR_INDEX_SPAN_MISMATCH;\ - if (((ph).obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) != ((objid) & ~SPIFFS_OBJ_ID_IX_FLAG)) return SPIFFS_ERR_INDEX_WRONG_ID; + if (((objid) & SPIFFS_OBJ_ID_IX_FLAG) == 0) return SPIFFS_ERR_NOT_INDEX; \ + if ((ph).span_ix != (spix)) {stop(); return SPIFFS_ERR_INDEX_SPAN_MISMATCH;}; + //if ((spix) == 0 && ((ph).flags & SPIFFS_PH_FLAG_IXDELE) == 0) return SPIFFS_ERR_DELETED; #define SPIFFS_VALIDATE_DATA(ph, objid, spix) \ + 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 ((ph).span_ix != (spix)) return SPIFFS_ERR_DATA_SPAN_MISMATCH; \ - if (((ph).obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) != ((objid) & ~SPIFFS_OBJ_ID_IX_FLAG)) return SPIFFS_ERR_DATA_WRONG_ID; + if ((objid) & SPIFFS_OBJ_ID_IX_FLAG) return SPIFFS_ERR_IS_INDEX; \ + if ((ph).span_ix != (spix)) return SPIFFS_ERR_DATA_SPAN_MISMATCH; #define SPIFFS_VIS_CHECK_ID (1<<0) -#define SPIFFS_VIS_NO_WRAP (1<<1) +#define SPIFFS_VIS_CHECK_PH (1<<1) +#define SPIFFS_VIS_NO_WRAP (1<<2) #if SPIFFS_CACHE @@ -278,13 +299,13 @@ #define SPIFFS_CACHE_PAGE_SIZE(fs) \ (sizeof(spiffs_cache_page) + SPIFFS_CFG_LOG_PAGE_SZ(fs)) -#define get_cache(fs) \ +#define spiffs_get_cache(fs) \ ((spiffs_cache *)((fs)->cache)) -#define get_cache_page_hdr(fs, c, ix) \ +#define spiffs_get_cache_page_hdr(fs, c, ix) \ ((spiffs_cache_page *)(&((c)->cpages[(ix) * SPIFFS_CACHE_PAGE_SIZE(fs)]))) -#define get_cache_page(fs, c, ix) \ +#define spiffs_get_cache_page(fs, c, ix) \ ((u8_t *)(&((c)->cpages[(ix) * SPIFFS_CACHE_PAGE_SIZE(fs)])) + sizeof(spiffs_cache_page)) typedef struct { @@ -417,14 +438,14 @@ s32_t spiffs_phys_wr( u32_t addr, u32_t len, u8_t *src); -#if 0 + s32_t spiffs_phys_cpy( spiffs *fs, spiffs_file fh, u32_t dst, u32_t src, u32_t len); -#endif + s32_t spiffs_phys_count_free_blocks( spiffs *fs); @@ -464,16 +485,25 @@ s32_t spiffs_obj_lu_find_id( spiffs_block_ix *block_ix, int *index_entry); -s32_t spiffs_obj_lu_find_id_and_index( +s32_t spiffs_obj_lu_find_id_and_span( spiffs *fs, spiffs_obj_id obj_id, spiffs_span_ix spix, + spiffs_page_ix exclusion_pix, + spiffs_page_ix *pix); + +s32_t spiffs_obj_lu_find_id_and_span_by_phdr( + spiffs *fs, + spiffs_obj_id obj_id, + spiffs_span_ix spix, + spiffs_page_ix exclusion_pix, spiffs_page_ix *pix); // --------------- s32_t spiffs_page_allocate_data( spiffs *fs, + spiffs_obj_id obj_id, spiffs_page_header *ph, u8_t *data, u32_t len, @@ -485,6 +515,7 @@ s32_t spiffs_page_move( spiffs *fs, spiffs_file fh, u8_t *page_data, + spiffs_obj_id obj_id, spiffs_page_header *page_hdr, spiffs_page_ix src_pix, spiffs_page_ix *dst_pix); @@ -505,6 +536,7 @@ s32_t spiffs_object_create( s32_t spiffs_object_update_index_hdr( spiffs *fs, spiffs_fd *fd, + spiffs_obj_id obj_id, spiffs_page_ix objix_hdr_pix, u8_t *new_objix_hdr_data, u8_t name[SPIFFS_OBJ_NAME_LEN], @@ -581,6 +613,9 @@ s32_t spiffs_gc_clean( spiffs *fs, spiffs_block_ix bix); +s32_t spiffs_gc_quick( + spiffs *fs); + // --------------- s32_t spiffs_fd_find_new( @@ -619,6 +654,14 @@ spiffs_cache_page *spiffs_cache_page_get_by_fd( #endif #endif -s32_t spiffs_area_check(spiffs *fs, u8_t check_all_objects); +s32_t spiffs_lookup_consistency_check( + spiffs *fs, + u8_t check_all_objects); + +s32_t spiffs_page_consistency_check( + spiffs *fs); + +s32_t spiffs_object_index_consistency_check( + spiffs *fs); #endif /* SPIFFS_NUCLEUS_H_ */ diff --git a/src/test_spiffs.h b/src/test_spiffs.h index e93583f..bdd6181 100644 --- a/src/test_spiffs.h +++ b/src/test_spiffs.h @@ -20,8 +20,8 @@ void dump_page(spiffs *fs, spiffs_page_ix p); void hexdump(u32_t addr, u32_t len); char *make_test_fname(const char *name); void clear_test_path(); -u8_t area_read(u32_t addr); void area_write(u32_t addr, u8_t *buf, u32_t size); +void area_read(u32_t addr, u8_t *buf, u32_t size); #endif /* TEST_SPIFFS_H_ */ diff --git a/src/testsuites.c b/src/testsuites.c index ca286e8..6752f99 100644 --- a/src/testsuites.c +++ b/src/testsuites.c @@ -8,6 +8,7 @@ #include "testrunner.h" void add_suites() { - //ADD_SUITE(hydrogen_tests) ADD_SUITE(dev_tests); + ADD_SUITE(check_tests); + ADD_SUITE(hydrogen_tests) }