块层对持久性预留的支持¶
Linux 内核支持一个用户空间接口,用于简化持久性预留,这些预留映射到支持它们的块设备(如 SCSI)。持久性预留允许在共享存储设置中,限制对块设备的访问,使其仅限于特定的发起方。
本文档概述了支持的 ioctl 命令。有关更详细的参考,请查阅 SCSI Primary Commands 标准,特别是关于预留的部分以及“PERSISTENT RESERVE IN”和“PERSISTENT RESERVE OUT”命令。
所有实现都应确保预留能在断电后继续存在,并涵盖多路径环境中的所有连接。这些行为在 SPC 中是可选的,但 Linux 将自动应用它们。
支持以下类型的预留:¶
- PR_WRITE_EXCLUSIVE
只有拥有预留的发起方才能写入设备。任何发起方都可以从设备读取。
- PR_EXCLUSIVE_ACCESS
只有拥有预留的发起方才能访问设备。
- PR_WRITE_EXCLUSIVE_REG_ONLY
只有持有注册密钥的发起方才能写入设备,任何发起方都可以从设备读取。
- PR_EXCLUSIVE_ACCESS_REG_ONLY
只有持有注册密钥的发起方才能访问设备。
PR_WRITE_EXCLUSIVE_ALL_REGS
只有持有注册密钥的发起方才能写入设备,任何发起方都可以从设备读取。所有持有注册密钥的发起方都被视为预留持有者。如果想使用此类型,请参考 SPC 规范中关于预留持有者的定义。
- PR_EXCLUSIVE_ACCESS_ALL_REGS
只有持有注册密钥的发起方才能访问设备。所有持有注册密钥的发起方都被视为预留持有者。如果想使用此类型,请参考 SPC 规范中关于预留持有者的定义。
支持以下 ioctl:¶
1. IOC_PR_REGISTER¶
如果 new_key 参数非空,此 ioctl 命令将注册一个新的预留。如果不存在现有预留,old_key 必须为零;如果现有预留应被替换,old_key 必须包含旧的预留密钥。
如果 new_key 参数为 0,它将注销 old_key 中传入的现有预留。
2. IOC_PR_RESERVE¶
此 ioctl 命令预留设备,并根据 type 参数限制其他设备的访问。key 参数必须是设备现有的预留密钥,该密钥通过 IOC_PR_REGISTER、IOC_PR_REGISTER_IGNORE、IOC_PR_PREEMPT 或 IOC_PR_PREEMPT_ABORT 命令获取。
3. IOC_PR_RELEASE¶
此 ioctl 命令释放由 key 和 flags 指定的预留,从而移除其隐含的任何访问限制。
4. IOC_PR_PREEMPT¶
此 ioctl 命令释放 old_key 引用的现有预留,并将其替换为针对预留密钥 new_key 的新类型预留。
5. IOC_PR_PREEMPT_ABORT¶
此 ioctl 命令的作用类似于 IOC_PR_PREEMPT,但它还会中止通过 old_key 标识的连接发送的任何未完成命令。
6. IOC_PR_CLEAR¶
此 ioctl 命令注销 key 和任何其他已注册到设备的预留密钥,并解除任何现有预留。
标志¶
所有 ioctl 都有一个标志字段。目前只支持一个标志
- PR_FL_IGNORE_KEY
忽略现有的预留密钥。这通常受 IOC_PR_REGISTER 支持,并且某些实现可能支持 IOC_PR_RESERVE 的此标志。
对于所有未知标志,内核将返回 -EOPNOTSUPP。