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 zone_nr_conv;
53 unsigned int submit_queues;
54 unsigned int home_node;
55 unsigned int queue_mode;
56 unsigned int blocksize;
57 unsigned int irqmode;
58 unsigned int hw_queue_depth;
59 unsigned int index;
60 unsigned int mbps;
61 bool blocking;
62 bool use_per_node_hctx;
63 bool power;
64 bool memory_backed;
65 bool discard;
66 bool zoned;
67};
68
69struct 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};
87
88#ifdef CONFIG_BLK_DEV_ZONED
89int null_zone_init(struct nullb_device *dev);
90void null_zone_exit(struct nullb_device *dev);
91int null_zone_report(struct gendisk *disk, sector_t sector,
92 struct blk_zone *zones, unsigned int *nr_zones);
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 pr_err("null_blk: CONFIG_BLK_DEV_ZONED not enabled\n");
100 return -EINVAL;
101}
102static inline void null_zone_exit(struct nullb_device *dev) {}
103static inline int null_zone_report(struct gendisk *disk, sector_t sector,
104 struct blk_zone *zones,
105 unsigned int *nr_zones)
106{
107 return -EOPNOTSUPP;
108}
109static inline void null_zone_write(struct nullb_cmd *cmd, sector_t sector,
110 unsigned int nr_sectors)
111{
112}
113static inline void null_zone_reset(struct nullb_cmd *cmd, sector_t sector) {}
114#endif
115#endif
116