队列模型 - 📘 一、命令特定错误状态码(续) (第113页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、命令特定错误状态码(续) (第113页)

Blog Author

我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 102 页,本页涉及了更多的 命令特定错误状态码,并针对 I/O 命令集Fabrics 命令、以及其他 厂商特定状态码 进行了详细分类和说明。


📘 一、命令特定错误状态码(续)

状态码清单(2BhBFh

代码 名称 描述
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️⃣ 2BhI/O Command Set Combination Rejected

  • 原因:I/O 命令集的组合被拒绝。通常发生在两个或多个 I/O 命令集的组合请求无法同时执行时,或者在特定的命令集之间存在冲突。

场景:例如,在设置命令特性时请求了不支持的组合。


2️⃣ 2ChInvalid I/O Command Set

  • 原因:指定的 I/O 命令集无效。控制器无法识别或支持所请求的命令集。

场景:例如,尝试执行一个控制器不支持的命令集。


3️⃣ 2DhIdentifier Unavailable

  • 原因:请求的标识符不可用。通常发生在容量管理操作时,设备无法访问或找到请求的命名空间标识符。

场景:例如,尝试访问一个不存在或未注册的命名空间标识符。


4️⃣ 70h ~ 7FhDirective Specific

  • 原因:这些状态码是特定指令(Directive)相关的错误码,用于表示与命令特定指令相关的错误。具体定义请参见协议第 8.7 节

5️⃣ 80h ~ BFhI/O Command Set Specific

  • 原因:这些状态码专门用于特定的 I/O 命令集,标识 I/O 命令执行过程中发生的错误。具体定义如下:

📘 二、I/O 命令集特定状态码(80hBFh

代码 名称 描述
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️⃣ 80hConflicting Attributes

  • 原因:命令的某些属性与当前的状态或其他属性冲突。

场景:例如,在设置命令属性时,指定的属性不一致或互相排斥。


2️⃣ 81hInvalid Protection Information

  • 原因:命令传输中的 保护信息 无效,通常发生在写入操作中,保护数据完整性的元数据无效。

场景:例如,写入时指定的校验和或数据保护信息无法被识别。


3️⃣ 82hAttempted Write to Read Only Range

  • 原因:写操作试图修改一个标记为 只读 的区域,导致操作失败。

场景:例如,尝试在一个只读区域进行写入操作时触发此错误。


4️⃣ B8hZoned Boundary Error

  • 原因:在执行区域写入时,数据超出了 区域的有效边界。常见于区域命名空间(ZNS)。

场景:例如,数据写入的目标超出了定义的存储区域范围。


5️⃣ B9hZone Is Full

  • 原因:写入操作试图写入一个 已满的区域,无法再进行更多的写入。

场景:例如,ZNS 存储中某个区域写入已满,无法进行进一步的数据写入。


6️⃣ BBhZone Is Read Only

  • 原因:目标区域被标记为只读,无法进行写入操作。

场景:例如,某个存储区域被设置为只读模式,禁止任何写入操作。


7️⃣ BFhInvalid Zone State Transition

  • 原因:区域的状态转换不符合规则。状态机无法完成从一个状态到另一个状态的转换。

场景:例如,区域处于“读写”状态时,错误地尝试切换到“离线”状态。


📘 三、Fabrics 命令状态码

状态码清单(80h90h

代码 名称 描述
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 相关的状态码,处理连接、发现和队列类型等问题。

这些状态码帮助我们精确地识别命令执行失败的原因,并且能够根据具体的错误类型采取相应的恢复或重试操作。如果你需要更详细的分析某个命令集的错误或在开发中的应用示例,随时告诉我!