diff options
| author | Christoph Hellwig <hch@lst.de> | 2015-10-15 08:10:48 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@fb.com> | 2015-10-21 16:46:56 -0400 |
| commit | bbd3e064362e5057cc4799ba2e4d68c7593e490b (patch) | |
| tree | 94c1efd47cf05eaf940e3381bb4eb9df421ae001 /include/linux | |
| parent | d8e4bb8103df02a2c509868732dc93fb66110a12 (diff) | |
block: add an API for Persistent Reservations
This commits adds a driver API and ioctls for controlling Persistent
Reservations s/genericly/generically/ at the block layer. Persistent
Reservations are supported by SCSI and NVMe and allow controlling who gets
access to a device in a shared storage setup.
Note that we add a pr_ops structure to struct block_device_operations
instead of adding the members directly to avoid bloating all instances
of devices that will never support Persistent Reservations.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/blkdev.h | 2 | ||||
| -rw-r--r-- | include/linux/pr.h | 18 |
2 files changed, 20 insertions, 0 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 19c2e947d4d1..fe25da05e823 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -35,6 +35,7 @@ struct sg_io_hdr; | |||
| 35 | struct bsg_job; | 35 | struct bsg_job; |
| 36 | struct blkcg_gq; | 36 | struct blkcg_gq; |
| 37 | struct blk_flush_queue; | 37 | struct blk_flush_queue; |
| 38 | struct pr_ops; | ||
| 38 | 39 | ||
| 39 | #define BLKDEV_MIN_RQ 4 | 40 | #define BLKDEV_MIN_RQ 4 |
| 40 | #define BLKDEV_MAX_RQ 128 /* Default maximum */ | 41 | #define BLKDEV_MAX_RQ 128 /* Default maximum */ |
| @@ -1633,6 +1634,7 @@ struct block_device_operations { | |||
| 1633 | /* this callback is with swap_lock and sometimes page table lock held */ | 1634 | /* this callback is with swap_lock and sometimes page table lock held */ |
| 1634 | void (*swap_slot_free_notify) (struct block_device *, unsigned long); | 1635 | void (*swap_slot_free_notify) (struct block_device *, unsigned long); |
| 1635 | struct module *owner; | 1636 | struct module *owner; |
| 1637 | const struct pr_ops *pr_ops; | ||
| 1636 | }; | 1638 | }; |
| 1637 | 1639 | ||
| 1638 | extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, | 1640 | extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, |
diff --git a/include/linux/pr.h b/include/linux/pr.h new file mode 100644 index 000000000000..65c01c10b335 --- /dev/null +++ b/include/linux/pr.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | #ifndef LINUX_PR_H | ||
| 2 | #define LINUX_PR_H | ||
| 3 | |||
| 4 | #include <uapi/linux/pr.h> | ||
| 5 | |||
| 6 | struct pr_ops { | ||
| 7 | int (*pr_register)(struct block_device *bdev, u64 old_key, u64 new_key, | ||
| 8 | u32 flags); | ||
| 9 | int (*pr_reserve)(struct block_device *bdev, u64 key, | ||
| 10 | enum pr_type type, u32 flags); | ||
| 11 | int (*pr_release)(struct block_device *bdev, u64 key, | ||
| 12 | enum pr_type type); | ||
| 13 | int (*pr_preempt)(struct block_device *bdev, u64 old_key, u64 new_key, | ||
| 14 | enum pr_type type, bool abort); | ||
| 15 | int (*pr_clear)(struct block_device *bdev, u64 key); | ||
| 16 | }; | ||
| 17 | |||
| 18 | #endif /* LINUX_PR_H */ | ||
