一、reservation Acquire command
该命令用于在一个NS上获取一个“预定”,抢占一个“预定”并持有NS,并终止持有NS的“预定”。
该命令使用CDW10和Reservation Acquire structure,使用PRP1和PRP2(或者sgl)
携带的信息CDW10
RTYPE(除去预定可xx,其他都被禁止)
另外一个信息是Reservation Acquire structure
Reservation Acquire structure携带的信息是与主机关联的当前“预定”的key值和抢占“预定”key值(这个有限制,必须Reservation Acquire Action是001或者010b)
当命令完成,返回CQ(如发生异常,状态码参考IO命令)。
二、 Reservation Register structure
该命令用于在一个NS上注册或者注销,取代一个“预定”。
该命令使用CDW10和Reservation Register structure,使用PRP1和PRP2(或者sgl)
CDW10信息如下:
该命令重点关注Reservation Register Action,定义了是哪一个用途的Reservation key
数据结构如下:
定义了当前的Reservation key和新的Reservation key。
当命令完成,返回CQ(如发生异常,状态码参考IO命令)。
三、Reservation Release command
该命令用于在一个已经预定的NS上清除或者释放。
该命令使用CDW10和Reservation Release structure,使用PRP1和PRP2(或者sgl)
重点关注 Reservation Release Action,包括clear和release。
数据结构如下:
当命令完成,返回CQ(如发生异常,状态码参考IO命令)。
四、Reservation Report command
Reservation Report命令向内存返回一个Reservation Status数据结构,描述NS的Registration和reservation的状态。
Reservation status Structure的size有一个功能,可以反映与主机关联的nvme subsystem的控制器数量。主机是NS注册Reservation。
主机identitfier可选择128bit或者64bit,取决于是一个Registered Controller data structure ,还是一个 Registered Controller extended data structure。
如果是64bit的host identitifier,但是CDW11设置为1,或者是128bit的host identitifier,但是CDW11设置为0,都需报错Host Identifier Inconsistent Format.;
总结
Reservation用于共享NS的管理,在一些多host的场景,如果同时对一个NS进行操作,会造成未知错误,因此需要用一个权限进行管理。
根据reservation type,会有不同权限,如下图
0-保留 清空所有的reservation,包括holder和registant
1-2h 除去 holder reservation,其他host不能访问
3-4h 除去holder和一个registration,其他均不能访问
5-6 除去holder和registration,其他均不能访问
(可以理解 0是无holder,1-4是一个holder ,4-6是多个holder)
当注册一个reservation,需要命令
nvme resv-register /dev/nvmex