aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2015-10-15 08:10:48 -0400
committerJens Axboe <axboe@fb.com>2015-10-21 16:46:56 -0400
commitbbd3e064362e5057cc4799ba2e4d68c7593e490b (patch)
tree94c1efd47cf05eaf940e3381bb4eb9df421ae001 /include/linux
parentd8e4bb8103df02a2c509868732dc93fb66110a12 (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.h2
-rw-r--r--include/linux/pr.h18
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;
35struct bsg_job; 35struct bsg_job;
36struct blkcg_gq; 36struct blkcg_gq;
37struct blk_flush_queue; 37struct blk_flush_queue;
38struct 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
1638extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, 1640extern 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
6struct 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 */