FTL诊断:resume搜索逐探测探针日志(page_read/ECC/magic/epoch/BBT全输入)

This commit is contained in:
2026-09-20 04:39:41 +08:00
parent 573bf6264a
commit 36db071233
+37 -3
View File
@@ -52,6 +52,9 @@ static uint8_t s_copy_buf[FTL_PAGE_SIZE];
/* 初始化状态 */
static uint8_t s_initialized;
/* resume 搜索探针日志窗口(诊断:逐探测记录判定输入) */
static uint8_t s_probe_log;
/* ======================== 私有函数声明 ======================== */
static int ftl_flush_cache(void);
@@ -94,7 +97,12 @@ static int ftl_read_page(dhara_sector_t lpn) {
int dhara_nand_is_bad(const struct dhara_nand *n, dhara_block_t b) {
(void)n;
return gd5f2gq5ue_is_block_bad(ftl_phy_block(b));
const int bad = gd5f2gq5ue_is_block_bad(ftl_phy_block(b));
if (s_probe_log) {
DBG_INFO("probe blk %lu: bbt_bad=%u", (unsigned long)b,
(unsigned int)bad);
}
return bad;
}
void dhara_nand_mark_bad(const struct dhara_nand *n, dhara_block_t b) {
@@ -187,18 +195,42 @@ int dhara_nand_is_free(const struct dhara_nand *n, dhara_page_t p) {
int dhara_nand_read(const struct dhara_nand *n, dhara_page_t p, size_t offset, size_t length, uint8_t *data, dhara_error_t *err) {
(void)n;
uint32_t phy_pg = ftl_phy_page(p);
int rret;
int eret;
if (gd5f_page_read(phy_pg) != GD5F_OK) {
if ((rret = gd5f_page_read(phy_pg)) != GD5F_OK) {
if (s_probe_log) {
DBG_INFO("probe pg %lu blk %lu: page_read=%d",
(unsigned long)phy_pg, (unsigned long)(p >> 6),
rret);
}
dhara_set_error(err, DHARA_E_ECC);
return -1;
}
if (gd5f_check_ecc() != GD5F_OK) {
if ((eret = gd5f_check_ecc()) != GD5F_OK) {
if (s_probe_log) {
DBG_INFO("probe pg %lu blk %lu: ecc=%d",
(unsigned long)phy_pg, (unsigned long)(p >> 6),
eret);
}
dhara_set_error(err, DHARA_E_ECC);
return -1;
}
gd5f_read_from_cache((uint16_t)offset, data, length);
if (s_probe_log && offset == 0 && length == FTL_PAGE_SIZE) {
/* 组末页(组内偏移 15)= checkpoint 页:记录 magic/epoch 判定 */
if ((p & 63u) == 15u) {
const uint8_t *m = data;
DBG_INFO("probe pg %lu blk %lu chk: magic=%u epoch=%u",
(unsigned long)phy_pg, (unsigned long)(p >> 6),
(unsigned int)((m[0] == 'D' && m[1] == 'h' &&
m[2] == 'a') ? 1 : 0),
(unsigned int)m[3]);
}
}
return 0;
}
@@ -248,6 +280,7 @@ DSTATUS disk_initialize(BYTE pdrv) {
{
dhara_error_t err;
s_probe_log = 1;
if (dhara_map_resume(&s_map, &err) < 0) {
DBG_INFO("No valid map found, creating fresh (err=%d)", err);
dhara_map_clear(&s_map);
@@ -255,6 +288,7 @@ DSTATUS disk_initialize(BYTE pdrv) {
DBG_INFO("Map resumed: %lu/%lu sectors used",
dhara_map_size(&s_map), dhara_map_capacity(&s_map));
}
s_probe_log = 0;
}
s_initialized = 1;