2007 lines · 57.8 KB · C
RawDownload
#ifndef _LINUX_BLKDEV_H#define _LINUX_BLKDEV_H #include <linux/sched.h>#include <linux/sched/clock.h> #ifdef CONFIG_BLOCK #include <linux/major.h>#include <linux/genhd.h>#include <linux/list.h>#include <linux/llist.h>#include <linux/timer.h>#include <linux/workqueue.h>#include <linux/pagemap.h>#include <linux/backing-dev-defs.h>#include <linux/wait.h>#include <linux/mempool.h>#include <linux/pfn.h>#include <linux/bio.h>#include <linux/stringify.h>#include <linux/gfp.h>#include <linux/bsg.h>#include <linux/smp.h>#include <linux/rcupdate.h>#include <linux/percpu-refcount.h>#include <linux/scatterlist.h>#include <linux/blkzoned.h> struct module;struct scsi_ioctl_command; struct request_queue;struct elevator_queue;struct blk_trace;struct request;struct sg_io_hdr;struct bsg_job;struct blkcg_gq;struct blk_flush_queue;struct pr_ops;struct rq_wb;struct blk_queue_stats;struct blk_stat_callback; #define BLKDEV_MIN_RQ	4#define BLKDEV_MAX_RQ	128	/* Default maximum */ /* Must be consisitent with blk_mq_poll_stats_bkt() */#define BLK_MQ_POLL_STATS_BKTS 16 /* * Maximum number of blkcg policies allowed to be registered concurrently. * Defined here to simplify include dependency. */#define BLKCG_MAX_POLS		3 typedef void (rq_end_io_fn)(struct request *, blk_status_t); #define BLK_RL_SYNCFULL		(1U << 0)#define BLK_RL_ASYNCFULL	(1U << 1) struct request_list {	struct request_queue	*q;	/* the queue this rl belongs to */#ifdef CONFIG_BLK_CGROUP	struct blkcg_gq		*blkg;	/* blkg this request pool belongs to */#endif	/*	 * count[], starved[], and wait[] are indexed by	 * BLK_RW_SYNC/BLK_RW_ASYNC	 */	int			count[2];	int			starved[2];	mempool_t		*rq_pool;	wait_queue_head_t	wait[2];	unsigned int		flags;}; /* * request flags */typedef __u32 __bitwise req_flags_t; /* elevator knows about this request */#define RQF_SORTED		((__force req_flags_t)(1 << 0))/* drive already may have started this one */#define RQF_STARTED		((__force req_flags_t)(1 << 1))/* uses tagged queueing */#define RQF_QUEUED		((__force req_flags_t)(1 << 2))/* may not be passed by ioscheduler */#define RQF_SOFTBARRIER		((__force req_flags_t)(1 << 3))/* request for flush sequence */#define RQF_FLUSH_SEQ		((__force req_flags_t)(1 << 4))/* merge of different types, fail separately */#define RQF_MIXED_MERGE		((__force req_flags_t)(1 << 5))/* track inflight for MQ */#define RQF_MQ_INFLIGHT		((__force req_flags_t)(1 << 6))/* don't call prep for this one */#define RQF_DONTPREP		((__force req_flags_t)(1 << 7))/* set for "ide_preempt" requests and also for requests for which the SCSI   "quiesce" state must be ignored. */#define RQF_PREEMPT		((__force req_flags_t)(1 << 8))/* contains copies of user pages */#define RQF_COPY_USER		((__force req_flags_t)(1 << 9))/* vaguely specified driver internal error.  Ignored by the block layer */#define RQF_FAILED		((__force req_flags_t)(1 << 10))/* don't warn about errors */#define RQF_QUIET		((__force req_flags_t)(1 << 11))/* elevator private data attached */#define RQF_ELVPRIV		((__force req_flags_t)(1 << 12))/* account I/O stat */#define RQF_IO_STAT		((__force req_flags_t)(1 << 13))/* request came from our alloc pool */#define RQF_ALLOCED		((__force req_flags_t)(1 << 14))/* runtime pm request */#define RQF_PM			((__force req_flags_t)(1 << 15))/* on IO scheduler merge hash */#define RQF_HASHED		((__force req_flags_t)(1 << 16))/* IO stats tracking on */#define RQF_STATS		((__force req_flags_t)(1 << 17))/* Look at ->special_vec for the actual data payload instead of the   bio chain. */#define RQF_SPECIAL_PAYLOAD	((__force req_flags_t)(1 << 18)) /* flags that prevent us from merging requests: */#define RQF_NOMERGE_FLAGS \	(RQF_STARTED | RQF_SOFTBARRIER | RQF_FLUSH_SEQ | RQF_SPECIAL_PAYLOAD) /* * Try to put the fields that are referenced together in the same cacheline. * * If you modify this structure, make sure to update blk_rq_init() and * especially blk_mq_rq_ctx_init() to take care of the added fields. */struct request {	struct list_head queuelist;	union {		struct call_single_data csd;		u64 fifo_time;	}; 	struct request_queue *q;	struct blk_mq_ctx *mq_ctx; 	int cpu;	unsigned int cmd_flags;		/* op and common flags */	req_flags_t rq_flags; 	int internal_tag; 	unsigned long atomic_flags; 	/* the following two fields are internal, NEVER access directly */	unsigned int __data_len;	/* total data len */	int tag;	sector_t __sector;		/* sector cursor */ 	struct bio *bio;	struct bio *biotail; 	/*	 * The hash is used inside the scheduler, and killed once the	 * request reaches the dispatch list. The ipi_list is only used	 * to queue the request for softirq completion, which is long	 * after the request has been unhashed (and even removed from	 * the dispatch list).	 */	union {		struct hlist_node hash;	/* merge hash */		struct list_head ipi_list;	}; 	/*	 * The rb_node is only used inside the io scheduler, requests	 * are pruned when moved to the dispatch queue. So let the	 * completion_data share space with the rb_node.	 */	union {		struct rb_node rb_node;	/* sort/lookup */		struct bio_vec special_vec;		void *completion_data;		int error_count; /* for legacy drivers, don't use */	}; 	/*	 * Three pointers are available for the IO schedulers, if they need	 * more they have to dynamically allocate it.  Flush requests are	 * never put on the IO scheduler. So let the flush fields share	 * space with the elevator data.	 */	union {		struct {			struct io_cq		*icq;			void			*priv[2];		} elv; 		struct {			unsigned int		seq;			struct list_head	list;			rq_end_io_fn		*saved_end_io;		} flush;	}; 	struct gendisk *rq_disk;	struct hd_struct *part;	unsigned long start_time;	struct blk_issue_stat issue_stat;#ifdef CONFIG_BLK_CGROUP	struct request_list *rl;		/* rl this rq is alloced from */	unsigned long long start_time_ns;	unsigned long long io_start_time_ns;    /* when passed to hardware */#endif	/* Number of scatter-gather DMA addr+len pairs after	 * physical address coalescing is performed.	 */	unsigned short nr_phys_segments;#if defined(CONFIG_BLK_DEV_INTEGRITY)	unsigned short nr_integrity_segments;#endif 	unsigned short ioprio; 	unsigned int timeout; 	void *special;		/* opaque pointer available for LLD use */ 	unsigned int extra_len;	/* length of alignment and padding */ 	unsigned short write_hint; 	unsigned long deadline;	struct list_head timeout_list; 	/*	 * completion callback.	 */	rq_end_io_fn *end_io;	void *end_io_data; 	/* for bidi */	struct request *next_rq;}; static inline bool blk_rq_is_scsi(struct request *rq){	return req_op(rq) == REQ_OP_SCSI_IN || req_op(rq) == REQ_OP_SCSI_OUT;} static inline bool blk_rq_is_private(struct request *rq){	return req_op(rq) == REQ_OP_DRV_IN || req_op(rq) == REQ_OP_DRV_OUT;} static inline bool blk_rq_is_passthrough(struct request *rq){	return blk_rq_is_scsi(rq) || blk_rq_is_private(rq);} static inline unsigned short req_get_ioprio(struct request *req){	return req->ioprio;} #include <linux/elevator.h> struct blk_queue_ctx; typedef void (request_fn_proc) (struct request_queue *q);typedef blk_qc_t (make_request_fn) (struct request_queue *q, struct bio *bio);typedef int (prep_rq_fn) (struct request_queue *, struct request *);typedef void (unprep_rq_fn) (struct request_queue *, struct request *); struct bio_vec;typedef void (softirq_done_fn)(struct request *);typedef int (dma_drain_needed_fn)(struct request *);typedef int (lld_busy_fn) (struct request_queue *q);typedef int (bsg_job_fn) (struct bsg_job *);typedef int (init_rq_fn)(struct request_queue *, struct request *, gfp_t);typedef void (exit_rq_fn)(struct request_queue *, struct request *); enum blk_eh_timer_return {	BLK_EH_NOT_HANDLED,	BLK_EH_HANDLED,	BLK_EH_RESET_TIMER,}; typedef enum blk_eh_timer_return (rq_timed_out_fn)(struct request *); enum blk_queue_state {	Queue_down,	Queue_up,}; struct blk_queue_tag {	struct request **tag_index;	/* map of busy tags */	unsigned long *tag_map;		/* bit map of free/busy tags */	int max_depth;			/* what we will send to device */	int real_max_depth;		/* what the array can hold */	atomic_t refcnt;		/* map can be shared */	int alloc_policy;		/* tag allocation policy */	int next_tag;			/* next tag */};#define BLK_TAG_ALLOC_FIFO 0 /* allocate starting from 0 */#define BLK_TAG_ALLOC_RR 1 /* allocate starting from last allocated tag */ #define BLK_SCSI_MAX_CMDS	(256)#define BLK_SCSI_CMD_PER_LONG	(BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) /* * Zoned block device models (zoned limit). */enum blk_zoned_model {	BLK_ZONED_NONE,	/* Regular block device */	BLK_ZONED_HA,	/* Host-aware zoned block device */	BLK_ZONED_HM,	/* Host-managed zoned block device */}; struct queue_limits {	unsigned long		bounce_pfn;	unsigned long		seg_boundary_mask;	unsigned long		virt_boundary_mask; 	unsigned int		max_hw_sectors;	unsigned int		max_dev_sectors;	unsigned int		chunk_sectors;	unsigned int		max_sectors;	unsigned int		max_segment_size;	unsigned int		physical_block_size;	unsigned int		alignment_offset;	unsigned int		io_min;	unsigned int		io_opt;	unsigned int		max_discard_sectors;	unsigned int		max_hw_discard_sectors;	unsigned int		max_write_same_sectors;	unsigned int		max_write_zeroes_sectors;	unsigned int		discard_granularity;	unsigned int		discard_alignment; 	unsigned short		logical_block_size;	unsigned short		max_segments;	unsigned short		max_integrity_segments;	unsigned short		max_discard_segments; 	unsigned char		misaligned;	unsigned char		discard_misaligned;	unsigned char		cluster;	unsigned char		raid_partial_stripes_expensive;	enum blk_zoned_model	zoned;}; #ifdef CONFIG_BLK_DEV_ZONED struct blk_zone_report_hdr {	unsigned int	nr_zones;	u8		padding[60];}; extern int blkdev_report_zones(struct block_device *bdev,			       sector_t sector, struct blk_zone *zones,			       unsigned int *nr_zones, gfp_t gfp_mask);extern int blkdev_reset_zones(struct block_device *bdev, sector_t sectors,			      sector_t nr_sectors, gfp_t gfp_mask); extern int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,				     unsigned int cmd, unsigned long arg);extern int blkdev_reset_zones_ioctl(struct block_device *bdev, fmode_t mode,				    unsigned int cmd, unsigned long arg); #else /* CONFIG_BLK_DEV_ZONED */ static inline int blkdev_report_zones_ioctl(struct block_device *bdev,					    fmode_t mode, unsigned int cmd,					    unsigned long arg){	return -ENOTTY;} static inline int blkdev_reset_zones_ioctl(struct block_device *bdev,					   fmode_t mode, unsigned int cmd,					   unsigned long arg){	return -ENOTTY;} #endif /* CONFIG_BLK_DEV_ZONED */ struct request_queue {	/*	 * Together with queue_head for cacheline sharing	 */	struct list_head	queue_head;	struct request		*last_merge;	struct elevator_queue	*elevator;	int			nr_rqs[2];	/* # allocated [a]sync rqs */	int			nr_rqs_elvpriv;	/* # allocated rqs w/ elvpriv */ 	atomic_t		shared_hctx_restart; 	struct blk_queue_stats	*stats;	struct rq_wb		*rq_wb; 	/*	 * If blkcg is not used, @q->root_rl serves all requests.  If blkcg	 * is used, root blkg allocates from @q->root_rl and all other	 * blkgs from their own blkg->rl.  Which one to use should be	 * determined using bio_request_list().	 */	struct request_list	root_rl; 	request_fn_proc		*request_fn;	make_request_fn		*make_request_fn;	prep_rq_fn		*prep_rq_fn;	unprep_rq_fn		*unprep_rq_fn;	softirq_done_fn		*softirq_done_fn;	rq_timed_out_fn		*rq_timed_out_fn;	dma_drain_needed_fn	*dma_drain_needed;	lld_busy_fn		*lld_busy_fn;	/* Called just after a request is allocated */	init_rq_fn		*init_rq_fn;	/* Called just before a request is freed */	exit_rq_fn		*exit_rq_fn;	/* Called from inside blk_get_request() */	void (*initialize_rq_fn)(struct request *rq); 	const struct blk_mq_ops	*mq_ops; 	unsigned int		*mq_map; 	/* sw queues */	struct blk_mq_ctx __percpu	*queue_ctx;	unsigned int		nr_queues; 	unsigned int		queue_depth; 	/* hw dispatch queues */	struct blk_mq_hw_ctx	**queue_hw_ctx;	unsigned int		nr_hw_queues; 	/*	 * Dispatch queue sorting	 */	sector_t		end_sector;	struct request		*boundary_rq; 	/*	 * Delayed queue handling	 */	struct delayed_work	delay_work; 	struct backing_dev_info	*backing_dev_info; 	/*	 * The queue owner gets to use this for whatever they like.	 * ll_rw_blk doesn't touch it.	 */	void			*queuedata; 	/*	 * various queue flags, see QUEUE_* below	 */	unsigned long		queue_flags; 	/*	 * ida allocated id for this queue.  Used to index queues from	 * ioctx.	 */	int			id; 	/*	 * queue needs bounce pages for pages above this limit	 */	gfp_t			bounce_gfp; 	/*	 * protects queue structures from reentrancy. ->__queue_lock should	 * _never_ be used directly, it is queue private. always use	 * ->queue_lock.	 */	spinlock_t		__queue_lock;	spinlock_t		*queue_lock; 	/*	 * queue kobject	 */	struct kobject kobj; 	/*	 * mq queue kobject	 */	struct kobject mq_kobj; #ifdef  CONFIG_BLK_DEV_INTEGRITY	struct blk_integrity integrity;#endif	/* CONFIG_BLK_DEV_INTEGRITY */ #ifdef CONFIG_PM	struct device		*dev;	int			rpm_status;	unsigned int		nr_pending;#endif 

Lines 1–500 of 2007.