| =============================================== |
| Block layer support for Persistent Reservations |
| =============================================== |
| |
| The Linux kernel supports a user space interface for simplified |
| Persistent Reservations which map to block devices that support |
| these (like SCSI). Persistent Reservations allow restricting |
| access to block devices to specific initiators in a shared storage |
| setup. |
| |
| This document gives a general overview of the support ioctl commands. |
| For a more detailed reference please refer to the SCSI Primary |
| Commands standard, specifically the section on Reservations and the |
| "PERSISTENT RESERVE IN" and "PERSISTENT RESERVE OUT" commands. |
| |
| All implementations are expected to ensure the reservations survive |
| a power loss and cover all connections in a multi path environment. |
| These behaviors are optional in SPC but will be automatically applied |
| by Linux. |
| |
| |
| The following types of reservations are supported: |
| -------------------------------------------------- |
| |
| - PR_WRITE_EXCLUSIVE |
| Only the initiator that owns the reservation can write to the |
| device. Any initiator can read from the device. |
| |
| - PR_EXCLUSIVE_ACCESS |
| Only the initiator that owns the reservation can access the |
| device. |
| |
| - PR_WRITE_EXCLUSIVE_REG_ONLY |
| Only initiators with a registered key can write to the device, |
| Any initiator can read from the device. |
| |
| - PR_EXCLUSIVE_ACCESS_REG_ONLY |
| Only initiators with a registered key can access the device. |
| |
| - PR_WRITE_EXCLUSIVE_ALL_REGS |
| |
| Only initiators with a registered key can write to the device, |
| Any initiator can read from the device. |
| All initiators with a registered key are considered reservation |
| holders. |
| Please reference the SPC spec on the meaning of a reservation |
| holder if you want to use this type. |
| |
| - PR_EXCLUSIVE_ACCESS_ALL_REGS |
| Only initiators with a registered key can access the device. |
| All initiators with a registered key are considered reservation |
| holders. |
| Please reference the SPC spec on the meaning of a reservation |
| holder if you want to use this type. |
| |
| |
| The following ioctl are supported: |
| ---------------------------------- |
| |
| 1. IOC_PR_REGISTER |
| ^^^^^^^^^^^^^^^^^^ |
| |
| This ioctl command registers a new reservation if the new_key argument |
| is non-null. If no existing reservation exists old_key must be zero, |
| if an existing reservation should be replaced old_key must contain |
| the old reservation key. |
| |
| If the new_key argument is 0 it unregisters the existing reservation passed |
| in old_key. |
| |
| |
| 2. IOC_PR_RESERVE |
| ^^^^^^^^^^^^^^^^^ |
| |
| This ioctl command reserves the device and thus restricts access for other |
| devices based on the type argument. The key argument must be the existing |
| reservation key for the device as acquired by the IOC_PR_REGISTER, |
| IOC_PR_REGISTER_IGNORE, IOC_PR_PREEMPT or IOC_PR_PREEMPT_ABORT commands. |
| |
| |
| 3. IOC_PR_RELEASE |
| ^^^^^^^^^^^^^^^^^ |
| |
| This ioctl command releases the reservation specified by key and flags |
| and thus removes any access restriction implied by it. |
| |
| |
| 4. IOC_PR_PREEMPT |
| ^^^^^^^^^^^^^^^^^ |
| |
| This ioctl command releases the existing reservation referred to by |
| old_key and replaces it with a new reservation of type for the |
| reservation key new_key. |
| |
| |
| 5. IOC_PR_PREEMPT_ABORT |
| ^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| This ioctl command works like IOC_PR_PREEMPT except that it also aborts |
| any outstanding command sent over a connection identified by old_key. |
| |
| 6. IOC_PR_CLEAR |
| ^^^^^^^^^^^^^^^ |
| |
| This ioctl command unregisters both key and any other reservation key |
| registered with the device and drops any existing reservation. |
| |
| |
| Flags |
| ----- |
| |
| All the ioctls have a flag field. Currently only one flag is supported: |
| |
| - PR_FL_IGNORE_KEY |
| Ignore the existing reservation key. This is commonly supported for |
| IOC_PR_REGISTER, and some implementation may support the flag for |
| IOC_PR_RESERVE. |
| |
| For all unknown flags the kernel will return -EOPNOTSUPP. |