错误处理 - 🔐 一、Registering(注册) (第426页)
我们继续深入学习 NVMe Express Base Specification 2.0b 第 8.19 节 Reservation(预留)机制的注册过程(Registering)与注销过程(Unregistering)。这部分内容非常关键,决定了多主机共享命名空间时,如何正确地初始化、维护和撤销预留状态。
🔐 一、Registering(注册)
在进行 Reservation 操作之前,主机必须先注册一个 Reservation Key(预留密钥),这将建立:
主机(Host)⇌ 命名空间(Namespace)
之间的合法绑定。
✅ 1. 注册流程(基础流程)
主机使用 Reservation Register 命令并设置字段如下:
| 字段 | 值 | 说明 |
|---|---|---|
| RREGA | 000b |
表示执行的是 Register Reservation Key 操作 |
| NRKEY | 任意非零值 | 新的 Reservation Key |
| IEKEY | 忽略 | 在此操作下无效 |
💡 一旦注册成功: - 该主机即成为该命名空间的 “Registrant”(注册者) - 可以通过任意带有同一 Host Identifier 的 Controller 访问该命名空间
⚠️ 2. 注册冲突行为
若主机 已经是注册者,再尝试注册一个 不同的 Reservation Key,控制器将:
❌ 终止命令,返回 Reservation Conflict
🧩 3. Reservation Key 可重复注册?
是的,在同一个 host(同一个 Host Identifier)上:
- 多个 controller 上可以重复注册相同 Reservation Key;
- 不同 host 之间也允许注册相同的 Reservation Key(只要 Host ID 不同)。
🔁 4. 替换 Reservation Key
主机可通过以下字段修改自己当前的 Reservation Key:
| 字段 | 值 |
|---|---|
| RREGA | 010b(Replace Reservation Key) |
| CRKEY | 当前 Key |
| NRKEY | 新 Key |
如果
CRKEY不匹配,命令将返回 Reservation Conflict
🚨 IEKEY 特殊用法
IEKEY(Ignore Existing Key) = 1 时: - 可以忽略当前注册状态 - 可以强制替换当前注册 Key 或直接注册新 Key - 有效地提升了注册/更新的灵活性
🧼 二、Unregistering(注销)
当主机不再需要参与命名空间的预留,可以使用 Reservation Register 命令注销:
| 字段 | 值 | 说明 |
|---|---|---|
| RREGA | 001b(Unregister Reservation Key) |
|
| CRKEY | 当前注册的 Reservation Key | |
| IEKEY | 可选,如果为 1 则忽略 CRKEY 检查 |
❌ CRKEY 不匹配处理
- 如果
CRKEY和当前注册 Key 不匹配 →Reservation Conflict - 如果主机当前未注册任何 Key →
Reservation Conflict
🧯 注销带来的影响
注销后:
- 主机不再是该命名空间的 Registrant
- 如果当前主机是 Reservation 的持有者(Holder),且是 唯一持有者,则 Reservation 自动释放
| Reservation 类型 | 会自动释放吗? |
|---|---|
| Write Exclusive – All Registrants | ✅ 是的 |
| Exclusive Access – All Registrants | ✅ 是的 |
| 其他单主机持有类型 | ✅ 是的 |
✅ 总结小结
| 动作 | 命令参数设置 | 说明 |
|---|---|---|
| 注册 Reservation Key | RREGA = 000b,IEKEY = 0 |
成为注册者,需提供唯一 Key |
| 替换 Reservation Key | RREGA = 010b,IEKEY = 0 |
替换当前 Key,需提供原 Key |
| 忽略注册状态直接替换 | RREGA = 010b,IEKEY = 1 |
强制更新 Key |
| 注销 | RREGA = 001b,IEKEY = 0 |
仅在 Key 匹配时生效 |
| 强制注销 | RREGA = 001b,IEKEY = 1 |
无视当前 Key,强制注销 |
下一节内容将涉及:
🔄 Reservation Acquire(持有权获取)与 Release(释放)命令
你是否想继续逐节学习下去?或者我也可以为你制作一张 Reservation 状态机流程图来辅助理解~