fix(nand-ftl): 传输失败不再误标坏块 + format 不再被脏缓存挡死(#79) #81

Merged
wandering1 merged 1 commits from fix/nand-ftl-format-deadlock into master 2026-11-04 19:01:38 +08:00
Collaborator

#79 修复完成,PR 见正文链接(提交 f979b394,已真机闭环)。

根因定案(比工单正文更进一层)

工单登记的两条放大机制成立(脏缓存不清 → format 被同一页挡死),但不是本板故障
的第一推动
。真机逐层取证(临时诊断构建:prog/erase 原语失败打印 → is_bad 命中
打印 → BBT 合并打印)后定案:

  1. 出厂扫描 0 坏块;诊断构建里 prog/erase 零失败——TOO_BAD 不来自当次 I/O;
  2. 合并持久化 BBT 后 129/2048 块坏,全部是 1016–1142 连续段;
    Map head=65024 >> 6 = 1016 正中段首 → prepare_head() 连续 8 次 is_bad
    → DHARA_E_TOO_BAD(journal.c:820-832)→ 写头永世不得前进;
  3. 误标来源:旧 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 还好、之后每轮必现、重启不恢复、容量读数不变」全部特征。
  4. 曾怀疑的写保护已排除:init 补了 A0h 回读校验哨兵,实测本板 A0h=0。
    「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 内)
  • C4 还清:nand_ftl_fault_get/clear() 跨调用失败类快照(20 B)+ defaultTask
    探针按类分流(NO_SPACE 跳过重格式化)——本轮排障就是靠它一眼定位
  • 哨兵/诊断:A0h 回读校验;gd5f_bbt_load() 合并后坏块增量 > 出厂扫描时打
    「BBT after merge」,现场可秒判真坏 vs 误标
  • 单测 149 → 178 全绿(format 死锁 21 条 + 传输失败不标坏 207/208/505;
    牙齿检查:回退修复即见红)
  • 文档:架构说明 §10.4/10.4.1/10.4.2、维护与容量恢复 §2/2.1、登记簿 C4 销项

存量误标处置(动作 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):

[NAND] BBT scan: 0 bad blocks found        ← 无 BBT after merge 行
[NAND_FTL] NAND FTL ready (capacity: 97504 pages = 190 MB)
[FS] no FAT volume, formatting NAND...
[FS] FATFS mounted                          ← ★
[CFG] load: file missing, factory template generated
[NET_CFG] load: OK ip=192.168.31.100

0 条 Cache flush FAIL / 0 条 TOO_BAD / 0 条 storage disabled。
#57 SNTP 被挡的两条真机判据、#68/#53 的落盘验证自此解锁。

遗留(不在本 PR)

  • 97504 vs 96064 pages 基线口径:恢复后仍报 97504;改判需跑动作 B(FULL_WIPE),
    已按工单注记留在维护文档 §2。
  • 旧卷内容(11-03 前的 config.ini/日志)随 map clear 作废——台架卷为可弃数据,
    出厂模板已重建。
#79 修复完成,PR 见正文链接(提交 f979b394,已真机闭环)。 ## 根因定案(比工单正文更进一层) 工单登记的两条放大机制成立(脏缓存不清 → format 被同一页挡死),但**不是本板故障 的第一推动**。真机逐层取证(临时诊断构建:prog/erase 原语失败打印 → is_bad 命中 打印 → BBT 合并打印)后定案: 1. 出厂扫描 **0 坏块**;诊断构建里 prog/erase **零失败**——TOO_BAD 不来自当次 I/O; 2. 合并持久化 BBT 后 **129/2048 块坏**,全部是 1016–1142 **连续段**; `Map head=65024 >> 6 = 1016` 正中段首 → `prepare_head()` 连续 8 次 `is_bad` → `DHARA_E_TOO_BAD`(journal.c:820-832)→ 写头永世不得前进; 3. 误标来源:旧 `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 还好、之后每轮必现、重启不恢复、容量读数不变」全部特征。 4. 曾怀疑的写保护已排除:init 补了 A0h 回读校验哨兵,实测本板 A0h=0。 「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 内) - C4 还清:`nand_ftl_fault_get/clear()` 跨调用失败类快照(20 B)+ defaultTask 探针按类分流(NO_SPACE 跳过重格式化)——本轮排障就是靠它一眼定位 - 哨兵/诊断:A0h 回读校验;`gd5f_bbt_load()` 合并后坏块增量 > 出厂扫描时打 「BBT after merge」,现场可秒判真坏 vs 误标 - 单测 149 → 178 全绿(format 死锁 21 条 + 传输失败不标坏 207/208/505; 牙齿检查:回退修复即见红) - 文档:架构说明 §10.4/10.4.1/10.4.2、维护与容量恢复 §2/2.1、登记簿 C4 销项 ## 存量误标处置(动作 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): ``` [NAND] BBT scan: 0 bad blocks found ← 无 BBT after merge 行 [NAND_FTL] NAND FTL ready (capacity: 97504 pages = 190 MB) [FS] no FAT volume, formatting NAND... [FS] FATFS mounted ← ★ [CFG] load: file missing, factory template generated [NET_CFG] load: OK ip=192.168.31.100 ``` 0 条 Cache flush FAIL / 0 条 TOO_BAD / 0 条 storage disabled。 #57 SNTP 被挡的两条真机判据、#68/#53 的落盘验证自此解锁。 ## 遗留(不在本 PR) - 97504 vs 96064 pages 基线口径:恢复后仍报 97504;改判需跑动作 B(FULL_WIPE), 已按工单注记留在维护文档 §2。 - 旧卷内容(11-03 前的 config.ini/日志)随 map clear 作废——台架卷为可弃数据, 出厂模板已重建。
super_agent_bot force-pushed fix/nand-ftl-format-deadlock from 4681e54764 to 0d21d9bf04 2026-11-04 18:51:38 +08:00 Compare
super_agent_bot added 1 commit 2026-11-04 18:58:25 +08:00
fix(nand-ftl): 传输失败不再误标坏块 + format 不再被脏缓存挡死(#79)
CI / 静态门禁 (pre-commit) (push) Failing after 43s
CI / 主机侧单测 (MSVC) (push) Failing after 45s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 44s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 43s
5538af829b
根因(真机定案,问题 #79):旧 dhara_nand_erase/prog() 把一切失败一律
mark_bad,而 mark_block_bad 每次**立即持久化**板级 BBT(不可撤销)——
一次传输层/等忙抖动就把好块永久记成坏块。台架 129 个好块(1016–1142
连续段)被固化,journal prepare_head() 连续 8 次撞 is_bad → TOO_BAD →
Cache flush FAIL → reformat 又被同一页挡住 → 整卷禁用、重启不恢复。

- 修复①:只有芯片明确回 E_FAIL/P_FAIL(状态位证据)才标坏;
  传输/超时失败只报 DHARA_E_BAD_BLOCK 让 dhara 重试,不标坏
- 修复②:nand_ftl_format() 尽力刷一次脏缓存,失败即丢弃并继续
  dhara_map_clear()(格式化语义本就是销毁映射;旧实现第一步返回,
  恢复动作在同一页死锁,f_mkfs 全在旧映射上必失败)
- C4 还债:新增跨调用失败类快照 nand_ftl_fault_get/clear(20 B,
  resume/读/刷/同步四点位记账);defaultTask 探针按类分流,
  BSP_ERR_NO_SPACE 跳过重格式化(容量问题不该用 mkfs 解)
- 哨兵与诊断:init 解锁块保护(A0h)后补回读校验(与 B0h ECC 同族
  缺口,实测本板 A0h=0,非本次根因,留作哨兵);gd5f_bbt_load()
  合并后坏块数 > 出厂扫描时打「BBT after merge」,现场可区分
  真坏与误标固化
- 测试:主机单测 149→178 全绿;新增 format 死锁(TC-NANDPORT-800..
  813b)、传输失败不标坏(207 语义翻转 + 208/505);牙齿检查过——
  把修复回退即见红
- 真机:恢复动作 A 重建 BBT 清除已固化误标(3/3 PASSED,BBT
  version=71);产品镜像复烧 [FS] FATFS mounted、配置出厂模板
  落盘、0 条 flush FAIL——#79 真机闭环(旧卷内容随 map clear
  作废,台架卷为可弃数据)
- 文档:存储架构说明 §10.4 口径修正 + 新增 §10.4.1/§10.4.2(页级
  失败升级链与误标持久化机理),存储维护与容量恢复 §2 补板级 BBT
  独立持久化注记 + §2.1(动作 A 此前静默失效),登记簿 C4 销项
- Keil 0 错 0 警(Code=255552,与烧录验证镜像一致);doc-links 213
  文档通过
super_agent_bot force-pushed fix/nand-ftl-format-deadlock from 0d21d9bf04 to 5538af829b 2026-11-04 18:58:25 +08:00 Compare
Owner

@super_agent_bot 对分支进行合并

@super_agent_bot 对分支进行合并
wandering1 merged commit 740bcbcc37 into master 2026-11-04 19:01:38 +08:00
wandering1 deleted branch fix/nand-ftl-format-deadlock 2026-11-04 19:01:40 +08:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wandering1/STM32F4-Base#81