队列模型 - 📘 一、命令特定错误状态码(续) (第113页)
我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 102 页,本页涉及了更多的 命令特定错误状态码,并针对 I/O 命令集、Fabrics 命令、以及其他 厂商特定状态码 进行了详细分类和说明。
📘 一、命令特定错误状态码(续)
✅ 状态码清单(2Bh 到 BFh)
| 代码 | 名称 | 描述 |
|---|---|---|
2Bh |
I/O Command Set Combination Rejected | I/O 命令集组合被拒绝:请求的 I/O 命令集组合无效或不被支持。 |
2Ch |
Invalid I/O Command Set | 无效的 I/O 命令集:指定的 I/O 命令集无效或不被支持。 |
2Dh |
Identifier Unavailable | 标识符不可用:请求的标识符不可用,通常用于容量管理等场景。 |
2Eh ~ 6Fh |
保留 | 当前未使用。 |
70h ~ 7Fh |
Directive Specific | 仅适用于特定的指令类型状态码。详情请参见 8.7 节。 |
80h ~ BFh |
I/O Command Set Specific | 特定 I/O 命令集的错误状态码。 |
🧩 二、状态码解析
1️⃣ 2Bh – I/O Command Set Combination Rejected
- 原因:I/O 命令集的组合被拒绝。通常发生在两个或多个 I/O 命令集的组合请求无法同时执行时,或者在特定的命令集之间存在冲突。
场景:例如,在设置命令特性时请求了不支持的组合。
2️⃣ 2Ch – Invalid I/O Command Set
- 原因:指定的 I/O 命令集无效。控制器无法识别或支持所请求的命令集。
场景:例如,尝试执行一个控制器不支持的命令集。
3️⃣ 2Dh – Identifier Unavailable
- 原因:请求的标识符不可用。通常发生在容量管理操作时,设备无法访问或找到请求的命名空间标识符。
场景:例如,尝试访问一个不存在或未注册的命名空间标识符。
4️⃣ 70h ~ 7Fh – Directive Specific
- 原因:这些状态码是特定指令(Directive)相关的错误码,用于表示与命令特定指令相关的错误。具体定义请参见协议第 8.7 节。
5️⃣ 80h ~ BFh – I/O Command Set Specific
- 原因:这些状态码专门用于特定的 I/O 命令集,标识 I/O 命令执行过程中发生的错误。具体定义如下:
📘 二、I/O 命令集特定状态码(80h 到 BFh)
| 代码 | 名称 | 描述 |
|---|---|---|
80h |
Conflicting Attributes | 属性冲突:命令的属性冲突,导致命令无法执行。 |
81h |
Invalid Protection Information | 无效的保护信息:传输的数据保护信息无效。 |
82h |
Attempted Write to Read Only Range | 尝试写入只读区域:写入操作试图影响只读区域。 |
83h |
Command Size Limit Exceeded | 命令大小超限:命令的大小超出了控制器支持的最大值。 |
B8h |
Zoned Boundary Error | 区域边界错误:在分区写操作中,数据超出了当前分区的有效边界。 |
B9h |
Zone Is Full | 区域已满:尝试写入一个已经满的存储区域。 |
BAh |
Zone Is Read Only | 区域为只读:该区域为只读,无法进行写操作。 |
BBh |
Zone Is Offline | 区域已下线:该存储区域已处于离线状态,无法访问。 |
BCh |
Zone Invalid Write | 区域写入无效:写入操作不符合区域写入规则。 |
BDh |
Too Many Active Zones | 激活的区域过多:当前系统允许的激活区域数已达上限。 |
BEh |
Too Many Open Zones | 打开的区域过多:当前系统允许的打开区域数已达上限。 |
BFh |
Invalid Zone State Transition | 无效的区域状态转换:区域状态的转换不合法。 |
🧩 三、状态码解析(I/O 命令集特定)
1️⃣ 80h – Conflicting Attributes
- 原因:命令的某些属性与当前的状态或其他属性冲突。
场景:例如,在设置命令属性时,指定的属性不一致或互相排斥。
2️⃣ 81h – Invalid Protection Information
- 原因:命令传输中的 保护信息 无效,通常发生在写入操作中,保护数据完整性的元数据无效。
场景:例如,写入时指定的校验和或数据保护信息无法被识别。
3️⃣ 82h – Attempted Write to Read Only Range
- 原因:写操作试图修改一个标记为 只读 的区域,导致操作失败。
场景:例如,尝试在一个只读区域进行写入操作时触发此错误。
4️⃣ B8h – Zoned Boundary Error
- 原因:在执行区域写入时,数据超出了 区域的有效边界。常见于区域命名空间(ZNS)。
场景:例如,数据写入的目标超出了定义的存储区域范围。
5️⃣ B9h – Zone Is Full
- 原因:写入操作试图写入一个 已满的区域,无法再进行更多的写入。
场景:例如,ZNS 存储中某个区域写入已满,无法进行进一步的数据写入。
6️⃣ BBh – Zone Is Read Only
- 原因:目标区域被标记为只读,无法进行写入操作。
场景:例如,某个存储区域被设置为只读模式,禁止任何写入操作。
7️⃣ BFh – Invalid Zone State Transition
- 原因:区域的状态转换不符合规则。状态机无法完成从一个状态到另一个状态的转换。
场景:例如,区域处于“读写”状态时,错误地尝试切换到“离线”状态。
📘 三、Fabrics 命令状态码
✅ 状态码清单(80h 到 90h)
| 代码 | 名称 | 描述 |
|---|---|---|
80h |
Incompatible Format | 格式不兼容:主机指定的记录格式不被 NVM 子系统支持。 |
81h |
Controller Busy | 控制器忙碌:控制器已与主机关联,无法建立新连接。 |
82h |
Connect Invalid Parameters | 连接无效参数:连接命令中某个或多个参数无效。 |
83h |
Connect Restart Discovery | 连接请求的子系统不可用,主机应重新启动发现过程。 |
84h |
Connect Invalid Host | 主机未被允许与指定控制器建立连接。 |
85h |
Invalid Queue Type | 错误的队列类型:命令被发送到错误的队列类型。 |
90h |
Discover Restart | 发现日志页面的快照无效或过时,主机应重新读取发现日志。 |
🧠 总结与核心要点
| 状态码 | 说明 |
|---|---|
80h ~ BFh |
I/O 命令集特定错误:涉及不同 I/O 命令集中的常见错误,如 保护信息无效、区域写入超出边界等。 |
80h ~ 90h |
Fabrics 命令状态码:与 NVMe over Fabrics 相关的状态码,处理连接、发现和队列类型等问题。 |
这些状态码帮助我们精确地识别命令执行失败的原因,并且能够根据具体的错误类型采取相应的恢复或重试操作。如果你需要更详细的分析某个命令集的错误或在开发中的应用示例,随时告诉我!