fix(nand-ftl): 传输失败不再误标坏块 + format 不再被脏缓存挡死(#79) #81
Reference in New Issue
Block a user
Delete Branch "fix/nand-ftl-format-deadlock"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
#79 修复完成,PR 见正文链接(提交 f979b394,已真机闭环)。
根因定案(比工单正文更进一层)
工单登记的两条放大机制成立(脏缓存不清 → format 被同一页挡死),但不是本板故障
的第一推动。真机逐层取证(临时诊断构建:prog/erase 原语失败打印 → is_bad 命中
打印 → BBT 合并打印)后定案:
Map head=65024 >> 6 = 1016正中段首 →prepare_head()连续 8 次is_bad→
DHARA_E_TOO_BAD(journal.c:820-832)→ 写头永世不得前进;dhara_nand_erase/prog()把一切失败(含传输层/等忙超时,芯片根本没回 E_FAIL/P_FAIL)一律
dhara_nand_mark_bad(),而gd5f2gq5ue_mark_block_bad()每次立即持久化 BBT(不可撤销)。11-03 21:0x–11-04 01:1x 的断电/reset 打中写窗口即固化一批——这解释了
「11-03 20:54 还好、之后每轮必现、重启不恢复、容量读数不变」全部特征。
「TOO_BAD 归类 CRC」不假(§10.4.1 判据修正保留),但本案连"页级坏"都不是——
是误标固化。
修复(PR 内容)
dhara_nand_erase/prog():只有芯片明确回 E_FAIL/P_FAIL 才标坏;传输/超时只报 BAD_BLOCK 重试,不标坏(杜绝误标再进 BBT)
nand_ftl_format():脏缓存 flush 失败不再挡死恢复动作(尽力刷一次后丢弃继续dhara_map_clear();丢弃权限只在 format 内)nand_ftl_fault_get/clear()跨调用失败类快照(20 B)+ defaultTask探针按类分流(NO_SPACE 跳过重格式化)——本轮排障就是靠它一眼定位
gd5f_bbt_load()合并后坏块增量 > 出厂扫描时打「BBT after merge」,现场可秒判真坏 vs 误标
牙齿检查:回退修复即见红)
存量误标处置(动作 A,卷内容已弃)
恢复构建(TEST_SUITE_STORAGE + ENABLE_STORAGE_RECOVERY_TESTS,未开 FULL_WIPE)
Storage Recovery: 3/3 PASSED→BBT rebuilt and persisted(version=71)→format 成功。产品镜像复烧后真机判据全中(2026-11-04 18:05):
0 条 Cache flush FAIL / 0 条 TOO_BAD / 0 条 storage disabled。
#57 SNTP 被挡的两条真机判据、#68/#53 的落盘验证自此解锁。
遗留(不在本 PR)
已按工单注记留在维护文档 §2。
出厂模板已重建。
4681e54764to0d21d9bf040d21d9bf04to5538af829b@super_agent_bot 对分支进行合并