mirror of
https://github.com/pellepl/spiffs.git
synced 2026-10-31 19:46:26 +00:00
fiddled with gc and check yet again, only checker callbacks left
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -576,7 +576,7 @@ static s32_t spiffs_page_consistency_check_i(spiffs *fs) {
|
||||
// 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);
|
||||
res = spiffs_page_delete(fs, cur_pix);
|
||||
}
|
||||
SPIFFS_CHECK_RES(res);
|
||||
restart = 1;
|
||||
|
||||
+51
-65
@@ -1,6 +1,43 @@
|
||||
#include "spiffs.h"
|
||||
#include "spiffs_nucleus.h"
|
||||
|
||||
static s32_t spiffs_gc_erase_block(
|
||||
spiffs *fs,
|
||||
spiffs_block_ix bix) {
|
||||
s32_t res;
|
||||
u32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, bix);
|
||||
s32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs);
|
||||
|
||||
SPIFFS_GC_DBG("gc: erase block %i\n", bix);
|
||||
|
||||
// here we ignore res, just try erasing the block
|
||||
while (size > 0) {
|
||||
SPIFFS_GC_DBG("gc: erase %08x:%08x\n", addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs));
|
||||
(void)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, bix),
|
||||
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, bix) + i);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
||||
s32_t spiffs_gc_quick(
|
||||
spiffs *fs) {
|
||||
s32_t res = SPIFFS_OK;
|
||||
@@ -10,6 +47,11 @@ s32_t spiffs_gc_quick(
|
||||
int cur_entry = 0;
|
||||
spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;
|
||||
|
||||
SPIFFS_GC_DBG("gc_quick: running\n", cur_block);
|
||||
#if SPIFFS_GC_STATS
|
||||
fs->stats_gc_runs++;
|
||||
#endif
|
||||
|
||||
u32_t entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id));
|
||||
|
||||
// find fully deleted blocks
|
||||
@@ -27,12 +69,14 @@ s32_t spiffs_gc_quick(
|
||||
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) {
|
||||
if (obj_id == SPIFFS_OBJ_ID_DELETED) {
|
||||
deleted_pages_in_block++;
|
||||
} else if (obj_id == SPIFFS_OBJ_ID_FREE) {
|
||||
// kill scan, go for next block
|
||||
obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs);
|
||||
break;
|
||||
} else if (obj_id == SPIFFS_OBJ_ID_DELETED) {
|
||||
deleted_pages_in_block++;
|
||||
} else {
|
||||
} else {
|
||||
// kill scan, go for next block
|
||||
obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs);
|
||||
break;
|
||||
}
|
||||
@@ -44,36 +88,7 @@ s32_t spiffs_gc_quick(
|
||||
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
|
||||
res = spiffs_gc_erase_block(fs, cur_block);
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -134,42 +149,13 @@ s32_t spiffs_gc_check(
|
||||
res = spiffs_gc_erase_page_stats(fs, cand);
|
||||
SPIFFS_CHECK_RES(res);
|
||||
|
||||
u32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, cand);
|
||||
s32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs);
|
||||
res = spiffs_gc_erase_block(fs, cand);
|
||||
SPIFFS_CHECK_RES(res);
|
||||
|
||||
// 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_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++;
|
||||
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;
|
||||
for (i = 0; i < SPIFFS_PAGES_PER_BLOCK(fs); i++) {
|
||||
spiffs_cache_drop_page(fs, SPIFFS_PAGE_FOR_BLOCK(fs, cand) + i);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
//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");
|
||||
|
||||
@@ -296,7 +296,11 @@ s32_t spiffs_obj_lu_find_free(
|
||||
int *index_entry) {
|
||||
s32_t res;
|
||||
if (!fs->cleaning && fs->free_blocks < 2) {
|
||||
return SPIFFS_ERR_FULL;
|
||||
res = spiffs_gc_quick(fs);
|
||||
SPIFFS_CHECK_RES(res);
|
||||
if (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);
|
||||
|
||||
+2
-2
@@ -31,14 +31,14 @@
|
||||
#define LOG_BLOCK 1*65536
|
||||
#define LOG_PAGE 1*PAGE_SIZE
|
||||
|
||||
static unsigned char area[1*1024*1024];
|
||||
static unsigned char area[2*1024*1024];
|
||||
|
||||
static int erases[sizeof(area)/SECTOR_SIZE];
|
||||
static char _path[256];
|
||||
|
||||
spiffs __fs;
|
||||
static u8_t _work[LOG_PAGE*2];
|
||||
static u8_t _fds[LOG_PAGE+LOG_PAGE/2];
|
||||
static u8_t _fds[256+256/2];
|
||||
static u8_t _cache[LOG_PAGE*5];
|
||||
|
||||
static int check_valid_flash = 1;
|
||||
|
||||
Reference in New Issue
Block a user