| .. | .. |
|---|
| 2 | 2 | #ifndef __BLK_NULL_BLK_H |
|---|
| 3 | 3 | #define __BLK_NULL_BLK_H |
|---|
| 4 | 4 | |
|---|
| 5 | +#undef pr_fmt |
|---|
| 6 | +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
|---|
| 7 | + |
|---|
| 5 | 8 | #include <linux/blkdev.h> |
|---|
| 6 | 9 | #include <linux/slab.h> |
|---|
| 7 | 10 | #include <linux/blk-mq.h> |
|---|
| .. | .. |
|---|
| 11 | 14 | #include <linux/fault-inject.h> |
|---|
| 12 | 15 | |
|---|
| 13 | 16 | struct nullb_cmd { |
|---|
| 14 | | - struct list_head list; |
|---|
| 15 | | - struct llist_node ll_list; |
|---|
| 16 | | - struct __call_single_data csd; |
|---|
| 17 | 17 | struct request *rq; |
|---|
| 18 | 18 | struct bio *bio; |
|---|
| 19 | 19 | unsigned int tag; |
|---|
| 20 | 20 | blk_status_t error; |
|---|
| 21 | 21 | struct nullb_queue *nq; |
|---|
| 22 | 22 | struct hrtimer timer; |
|---|
| 23 | + bool fake_timeout; |
|---|
| 23 | 24 | }; |
|---|
| 24 | 25 | |
|---|
| 25 | 26 | struct nullb_queue { |
|---|
| .. | .. |
|---|
| 42 | 43 | struct badblocks badblocks; |
|---|
| 43 | 44 | |
|---|
| 44 | 45 | unsigned int nr_zones; |
|---|
| 46 | + unsigned int nr_zones_imp_open; |
|---|
| 47 | + unsigned int nr_zones_exp_open; |
|---|
| 48 | + unsigned int nr_zones_closed; |
|---|
| 45 | 49 | struct blk_zone *zones; |
|---|
| 46 | 50 | sector_t zone_size_sects; |
|---|
| 51 | + spinlock_t zone_lock; |
|---|
| 52 | + unsigned long *zone_locks; |
|---|
| 47 | 53 | |
|---|
| 48 | 54 | unsigned long size; /* device size in MB */ |
|---|
| 49 | 55 | unsigned long completion_nsec; /* time in ns to complete a request */ |
|---|
| 50 | 56 | unsigned long cache_size; /* disk cache size in MB */ |
|---|
| 51 | 57 | unsigned long zone_size; /* zone size in MB if device is zoned */ |
|---|
| 58 | + unsigned long zone_capacity; /* zone capacity in MB if device is zoned */ |
|---|
| 59 | + unsigned int zone_nr_conv; /* number of conventional zones */ |
|---|
| 60 | + unsigned int zone_max_open; /* max number of open zones */ |
|---|
| 61 | + unsigned int zone_max_active; /* max number of active zones */ |
|---|
| 52 | 62 | unsigned int submit_queues; /* number of submission queues */ |
|---|
| 53 | 63 | unsigned int home_node; /* home node for the device */ |
|---|
| 54 | 64 | unsigned int queue_mode; /* block interface */ |
|---|
| .. | .. |
|---|
| 84 | 94 | char disk_name[DISK_NAME_LEN]; |
|---|
| 85 | 95 | }; |
|---|
| 86 | 96 | |
|---|
| 97 | +blk_status_t null_process_cmd(struct nullb_cmd *cmd, |
|---|
| 98 | + enum req_opf op, sector_t sector, |
|---|
| 99 | + unsigned int nr_sectors); |
|---|
| 100 | + |
|---|
| 87 | 101 | #ifdef CONFIG_BLK_DEV_ZONED |
|---|
| 88 | | -int null_zone_init(struct nullb_device *dev); |
|---|
| 89 | | -void null_zone_exit(struct nullb_device *dev); |
|---|
| 90 | | -blk_status_t null_zone_report(struct nullb *nullb, struct bio *bio); |
|---|
| 91 | | -void null_zone_write(struct nullb_cmd *cmd, sector_t sector, |
|---|
| 92 | | - unsigned int nr_sectors); |
|---|
| 93 | | -void null_zone_reset(struct nullb_cmd *cmd, sector_t sector); |
|---|
| 102 | +int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q); |
|---|
| 103 | +int null_register_zoned_dev(struct nullb *nullb); |
|---|
| 104 | +void null_free_zoned_dev(struct nullb_device *dev); |
|---|
| 105 | +int null_report_zones(struct gendisk *disk, sector_t sector, |
|---|
| 106 | + unsigned int nr_zones, report_zones_cb cb, void *data); |
|---|
| 107 | +blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd, |
|---|
| 108 | + enum req_opf op, sector_t sector, |
|---|
| 109 | + sector_t nr_sectors); |
|---|
| 110 | +size_t null_zone_valid_read_len(struct nullb *nullb, |
|---|
| 111 | + sector_t sector, unsigned int len); |
|---|
| 94 | 112 | #else |
|---|
| 95 | | -static inline int null_zone_init(struct nullb_device *dev) |
|---|
| 113 | +static inline int null_init_zoned_dev(struct nullb_device *dev, |
|---|
| 114 | + struct request_queue *q) |
|---|
| 96 | 115 | { |
|---|
| 116 | + pr_err("CONFIG_BLK_DEV_ZONED not enabled\n"); |
|---|
| 97 | 117 | return -EINVAL; |
|---|
| 98 | 118 | } |
|---|
| 99 | | -static inline void null_zone_exit(struct nullb_device *dev) {} |
|---|
| 100 | | -static inline blk_status_t null_zone_report(struct nullb *nullb, |
|---|
| 101 | | - struct bio *bio) |
|---|
| 119 | +static inline int null_register_zoned_dev(struct nullb *nullb) |
|---|
| 120 | +{ |
|---|
| 121 | + return -ENODEV; |
|---|
| 122 | +} |
|---|
| 123 | +static inline void null_free_zoned_dev(struct nullb_device *dev) {} |
|---|
| 124 | +static inline blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd, |
|---|
| 125 | + enum req_opf op, sector_t sector, sector_t nr_sectors) |
|---|
| 102 | 126 | { |
|---|
| 103 | 127 | return BLK_STS_NOTSUPP; |
|---|
| 104 | 128 | } |
|---|
| 105 | | -static inline void null_zone_write(struct nullb_cmd *cmd, sector_t sector, |
|---|
| 106 | | - unsigned int nr_sectors) |
|---|
| 129 | +static inline size_t null_zone_valid_read_len(struct nullb *nullb, |
|---|
| 130 | + sector_t sector, |
|---|
| 131 | + unsigned int len) |
|---|
| 107 | 132 | { |
|---|
| 133 | + return len; |
|---|
| 108 | 134 | } |
|---|
| 109 | | -static inline void null_zone_reset(struct nullb_cmd *cmd, sector_t sector) {} |
|---|
| 135 | +#define null_report_zones NULL |
|---|
| 110 | 136 | #endif /* CONFIG_BLK_DEV_ZONED */ |
|---|
| 111 | 137 | #endif /* __NULL_BLK_H */ |
|---|