1
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
13struct 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
25struct 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
35struct nullb_device {
36 struct nullb *nullb;
37 struct config_item item;
38 struct radix_tree_root data;
39 struct radix_tree_root cache;
40 unsigned long flags;
41 unsigned int curr_cache;
42 struct badblocks badblocks;
43
44 unsigned int nr_zones;
45 struct blk_zone *zones;
46 sector_t zone_size_sects;
47
48 unsigned long size;
49 unsigned long completion_nsec;
50 unsigned long cache_size;
51 unsigned long zone_size;
52 unsigned int submit_queues;
53 unsigned int home_node;
54 unsigned int queue_mode;
55 unsigned int blocksize;
56 unsigned int irqmode;
57 unsigned int hw_queue_depth;
58 unsigned int index;
59 unsigned int mbps;
60 bool blocking;
61 bool use_per_node_hctx;
62 bool power;
63 bool memory_backed;
64 bool discard;
65 bool zoned;
66};
67
68struct nullb {
69 struct nullb_device *dev;
70 struct list_head list;
71 unsigned int index;
72 struct request_queue *q;
73 struct gendisk *disk;
74 struct blk_mq_tag_set *tag_set;
75 struct blk_mq_tag_set __tag_set;
76 unsigned int queue_depth;
77 atomic_long_t cur_bytes;
78 struct hrtimer bw_timer;
79 unsigned long cache_flush_pos;
80 spinlock_t lock;
81
82 struct nullb_queue *queues;
83 unsigned int nr_queues;
84 char disk_name[DISK_NAME_LEN];
85};
86
87#ifdef CONFIG_BLK_DEV_ZONED
88int null_zone_init(struct nullb_device *dev);
89void null_zone_exit(struct nullb_device *dev);
90int null_zone_report(struct gendisk *disk, sector_t sector,
91 struct blk_zone *zones, unsigned int *nr_zones,
92 gfp_t gfp_mask);
93void null_zone_write(struct nullb_cmd *cmd, sector_t sector,
94 unsigned int nr_sectors);
95void null_zone_reset(struct nullb_cmd *cmd, sector_t sector);
96#else
97static inline int null_zone_init(struct nullb_device *dev)
98{
99 return -EINVAL;
100}
101static inline void null_zone_exit(struct nullb_device *dev) {}
102static inline int null_zone_report(struct gendisk *disk, sector_t sector,
103 struct blk_zone *zones,
104 unsigned int *nr_zones, gfp_t gfp_mask)
105{
106 return -EOPNOTSUPP;
107}
108static inline void null_zone_write(struct nullb_cmd *cmd, sector_t sector,
109 unsigned int nr_sectors)
110{
111}
112static inline void null_zone_reset(struct nullb_cmd *cmd, sector_t sector) {}
113#endif
114#endif
115