塊層對永續性預留的支援

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。