Commit | Line | Data |
---|---|---|
6dad38d3 MB |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __BLK_NULL_BLK_H | |
3 | #define __BLK_NULL_BLK_H | |
4 | ||
5 | #include <linux/blkdev.h> | |
6 | #include <linux/slab.h> | |
7 | #include <linux/blk-mq.h> | |
8 | #include <linux/hrtimer.h> | |
9 | #include <linux/configfs.h> | |
10 | #include <linux/badblocks.h> | |
11 | #include <linux/fault-inject.h> | |
12 | ||
13 | struct nullb_cmd { | |
14 | struct list_head list; | |
15 | struct llist_node ll_list; | |
16 | struct __call_single_data csd; | |
17 | struct request *rq; | |
18 | struct bio *bio; | |
19 | unsigned int tag; | |
20 | blk_status_t error; | |
21 | struct nullb_queue *nq; | |
22 | struct hrtimer timer; | |
23 | }; | |
24 | ||
25 | struct nullb_queue { | |
26 | unsigned long *tag_map; | |
27 | wait_queue_head_t wait; | |
28 | unsigned int queue_depth; | |
29 | struct nullb_device *dev; | |
30 | unsigned int requeue_selection; | |
31 | ||
32 | struct nullb_cmd *cmds; | |
33 | }; | |
34 | ||
35 | struct nullb_device { | |
36 | struct nullb *nullb; | |
37 | struct config_item item; | |
38 | struct radix_tree_root data; /* data stored in the disk */ | |
39 | struct radix_tree_root cache; /* disk cache data */ | |
40 | unsigned long flags; /* device flags */ | |
41 | unsigned int curr_cache; | |
42 | struct badblocks badblocks; | |
43 | ||
ca4b2a01 MB |
44 | unsigned int nr_zones; |
45 | struct blk_zone *zones; | |
46 | sector_t zone_size_sects; | |
47 | ||
6dad38d3 MB |
48 | unsigned long size; /* device size in MB */ |
49 | unsigned long completion_nsec; /* time in ns to complete a request */ | |
50 | unsigned long cache_size; /* disk cache size in MB */ | |
ca4b2a01 | 51 | unsigned long zone_size; /* zone size in MB if device is zoned */ |
ea2c18e1 | 52 | unsigned int zone_nr_conv; /* number of conventional zones */ |
6dad38d3 MB |
53 | unsigned int submit_queues; /* number of submission queues */ |
54 | unsigned int home_node; /* home node for the device */ | |
55 | unsigned int queue_mode; /* block interface */ | |
56 | unsigned int blocksize; /* block size */ | |
57 | unsigned int irqmode; /* IRQ completion handler */ | |
58 | unsigned int hw_queue_depth; /* queue depth */ | |
59 | unsigned int index; /* index of the disk, only valid with a disk */ | |
60 | unsigned int mbps; /* Bandwidth throttle cap (in MB/s) */ | |
61 | bool blocking; /* blocking blk-mq device */ | |
62 | bool use_per_node_hctx; /* use per-node allocation for hardware context */ | |
63 | bool power; /* power on/off the device */ | |
64 | bool memory_backed; /* if data is stored in memory */ | |
65 | bool discard; /* if support discard */ | |
ca4b2a01 | 66 | bool zoned; /* if device is zoned */ |
6dad38d3 MB |
67 | }; |
68 | ||
69 | struct nullb { | |
70 | struct nullb_device *dev; | |
71 | struct list_head list; | |
72 | unsigned int index; | |
73 | struct request_queue *q; | |
74 | struct gendisk *disk; | |
75 | struct blk_mq_tag_set *tag_set; | |
76 | struct blk_mq_tag_set __tag_set; | |
77 | unsigned int queue_depth; | |
78 | atomic_long_t cur_bytes; | |
79 | struct hrtimer bw_timer; | |
80 | unsigned long cache_flush_pos; | |
81 | spinlock_t lock; | |
82 | ||
83 | struct nullb_queue *queues; | |
84 | unsigned int nr_queues; | |
85 | char disk_name[DISK_NAME_LEN]; | |
86 | }; | |
ca4b2a01 MB |
87 | |
88 | #ifdef CONFIG_BLK_DEV_ZONED | |
89 | int null_zone_init(struct nullb_device *dev); | |
90 | void null_zone_exit(struct nullb_device *dev); | |
e76239a3 CH |
91 | int null_zone_report(struct gendisk *disk, sector_t sector, |
92 | struct blk_zone *zones, unsigned int *nr_zones, | |
93 | gfp_t gfp_mask); | |
b228ba1c JA |
94 | void null_zone_write(struct nullb_cmd *cmd, sector_t sector, |
95 | unsigned int nr_sectors); | |
96 | void null_zone_reset(struct nullb_cmd *cmd, sector_t sector); | |
ca4b2a01 MB |
97 | #else |
98 | static inline int null_zone_init(struct nullb_device *dev) | |
99 | { | |
373282e7 | 100 | pr_err("null_blk: CONFIG_BLK_DEV_ZONED not enabled\n"); |
ca4b2a01 MB |
101 | return -EINVAL; |
102 | } | |
103 | static inline void null_zone_exit(struct nullb_device *dev) {} | |
e76239a3 CH |
104 | static inline int null_zone_report(struct gendisk *disk, sector_t sector, |
105 | struct blk_zone *zones, | |
106 | unsigned int *nr_zones, gfp_t gfp_mask) | |
ca4b2a01 | 107 | { |
e76239a3 | 108 | return -EOPNOTSUPP; |
ca4b2a01 | 109 | } |
b228ba1c JA |
110 | static inline void null_zone_write(struct nullb_cmd *cmd, sector_t sector, |
111 | unsigned int nr_sectors) | |
112 | { | |
113 | } | |
114 | static inline void null_zone_reset(struct nullb_cmd *cmd, sector_t sector) {} | |
ca4b2a01 | 115 | #endif /* CONFIG_BLK_DEV_ZONED */ |
6dad38d3 | 116 | #endif /* __NULL_BLK_H */ |