1544 lines · 44.6 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 *//* * Portions Copyright (C) 1992 Drew Eckhardt */#ifndef _LINUX_BLKDEV_H#define _LINUX_BLKDEV_H #include <linux/types.h>#include <linux/blk_types.h>#include <linux/device.h>#include <linux/list.h>#include <linux/llist.h>#include <linux/minmax.h>#include <linux/timer.h>#include <linux/workqueue.h>#include <linux/wait.h>#include <linux/bio.h>#include <linux/gfp.h>#include <linux/kdev_t.h>#include <linux/rcupdate.h>#include <linux/percpu-refcount.h>#include <linux/blkzoned.h>#include <linux/sched.h>#include <linux/sbitmap.h>#include <linux/uuid.h>#include <linux/xarray.h> struct module;struct request_queue;struct elevator_queue;struct blk_trace;struct request;struct sg_io_hdr;struct blkcg_gq;struct blk_flush_queue;struct kiocb;struct pr_ops;struct rq_qos;struct blk_queue_stats;struct blk_stat_callback;struct blk_crypto_profile; extern const struct device_type disk_type;extern struct device_type part_type;extern struct class block_class; /* Must be consistent with blk_mq_poll_stats_bkt() */#define BLK_MQ_POLL_STATS_BKTS 16 /* Doing classic polling */#define BLK_MQ_POLL_CLASSIC -1 /* * Maximum number of blkcg policies allowed to be registered concurrently. * Defined here to simplify include dependency. */#define BLKCG_MAX_POLS		6 #define DISK_MAX_PARTS			256#define DISK_NAME_LEN			32 #define PARTITION_META_INFO_VOLNAMELTH	64/* * Enough for the string representation of any kind of UUID plus NULL. * EFI UUID is 36 characters. MSDOS UUID is 11 characters. */#define PARTITION_META_INFO_UUIDLTH	(UUID_STRING_LEN + 1) struct partition_meta_info {	char uuid[PARTITION_META_INFO_UUIDLTH];	u8 volname[PARTITION_META_INFO_VOLNAMELTH];}; /** * DOC: genhd capability flags * * ``GENHD_FL_REMOVABLE``: indicates that the block device gives access to * removable media.  When set, the device remains present even when media is not * inserted.  Shall not be set for devices which are removed entirely when the * media is removed. * * ``GENHD_FL_HIDDEN``: the block device is hidden; it doesn't produce events, * doesn't appear in sysfs, and can't be opened from userspace or using * blkdev_get*. Used for the underlying components of multipath devices. * * ``GENHD_FL_NO_PART``: partition support is disabled.  The kernel will not * scan for partitions from add_disk, and users can't add partitions manually. * */enum {	GENHD_FL_REMOVABLE			= 1 << 0,	GENHD_FL_HIDDEN				= 1 << 1,	GENHD_FL_NO_PART			= 1 << 2,}; enum {	DISK_EVENT_MEDIA_CHANGE			= 1 << 0, /* media changed */	DISK_EVENT_EJECT_REQUEST		= 1 << 1, /* eject requested */}; enum {	/* Poll even if events_poll_msecs is unset */	DISK_EVENT_FLAG_POLL			= 1 << 0,	/* Forward events to udev */	DISK_EVENT_FLAG_UEVENT			= 1 << 1,	/* Block event polling when open for exclusive write */	DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE	= 1 << 2,}; struct disk_events;struct badblocks; struct blk_integrity {	const struct blk_integrity_profile	*profile;	unsigned char				flags;	unsigned char				tuple_size;	unsigned char				interval_exp;	unsigned char				tag_size;}; struct gendisk {	/*	 * major/first_minor/minors should not be set by any new driver, the	 * block core will take care of allocating them automatically.	 */	int major;	int first_minor;	int minors; 	char disk_name[DISK_NAME_LEN];	/* name of major driver */ 	unsigned short events;		/* supported events */	unsigned short event_flags;	/* flags related to event processing */ 	struct xarray part_tbl;	struct block_device *part0; 	const struct block_device_operations *fops;	struct request_queue *queue;	void *private_data; 	struct bio_set bio_split; 	int flags;	unsigned long state;#define GD_NEED_PART_SCAN		0#define GD_READ_ONLY			1#define GD_DEAD				2#define GD_NATIVE_CAPACITY		3#define GD_ADDED			4#define GD_SUPPRESS_PART_SCAN		5#define GD_OWNS_QUEUE			6 	struct mutex open_mutex;	/* open/close mutex */	unsigned open_partitions;	/* number of open partitions */ 	struct backing_dev_info	*bdi;	struct kobject queue_kobj;	/* the queue/ directory */	struct kobject *slave_dir;#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED	struct list_head slave_bdevs;#endif	struct timer_rand_state *random;	atomic_t sync_io;		/* RAID */	struct disk_events *ev;#ifdef  CONFIG_BLK_DEV_INTEGRITY	struct kobject integrity_kobj;#endif	/* CONFIG_BLK_DEV_INTEGRITY */ #ifdef CONFIG_BLK_DEV_ZONED	/*	 * Zoned block device information for request dispatch control.	 * nr_zones is the total number of zones of the device. This is always	 * 0 for regular block devices. conv_zones_bitmap is a bitmap of nr_zones	 * bits which indicates if a zone is conventional (bit set) or	 * sequential (bit clear). seq_zones_wlock is a bitmap of nr_zones	 * bits which indicates if a zone is write locked, that is, if a write	 * request targeting the zone was dispatched.	 *	 * Reads of this information must be protected with blk_queue_enter() /	 * blk_queue_exit(). Modifying this information is only allowed while	 * no requests are being processed. See also blk_mq_freeze_queue() and	 * blk_mq_unfreeze_queue().	 */	unsigned int		nr_zones;	unsigned int		max_open_zones;	unsigned int		max_active_zones;	unsigned long		*conv_zones_bitmap;	unsigned long		*seq_zones_wlock;#endif /* CONFIG_BLK_DEV_ZONED */ #if IS_ENABLED(CONFIG_CDROM)	struct cdrom_device_info *cdi;#endif	int node_id;	struct badblocks *bb;	struct lockdep_map lockdep_map;	u64 diskseq; 	/*	 * Independent sector access ranges. This is always NULL for	 * devices that do not have multiple independent access ranges.	 */	struct blk_independent_access_ranges *ia_ranges;}; static inline bool disk_live(struct gendisk *disk){	return !inode_unhashed(disk->part0->bd_inode);} /** * disk_openers - returns how many openers are there for a disk * @disk: disk to check * * This returns the number of openers for a disk.  Note that this value is only * stable if disk->open_mutex is held. * * Note: Due to a quirk in the block layer open code, each open partition is * only counted once even if there are multiple openers. */static inline unsigned int disk_openers(struct gendisk *disk){	return atomic_read(&disk->part0->bd_openers);} /* * The gendisk is refcounted by the part0 block_device, and the bd_device * therein is also used for device model presentation in sysfs. */#define dev_to_disk(device) \	(dev_to_bdev(device)->bd_disk)#define disk_to_dev(disk) \	(&((disk)->part0->bd_device)) #if IS_REACHABLE(CONFIG_CDROM)#define disk_to_cdi(disk)	((disk)->cdi)#else#define disk_to_cdi(disk)	NULL#endif static inline dev_t disk_devt(struct gendisk *disk){	return MKDEV(disk->major, disk->first_minor);} static inline int blk_validate_block_size(unsigned long bsize){	if (bsize < 512 || bsize > PAGE_SIZE || !is_power_of_2(bsize))		return -EINVAL; 	return 0;} static inline bool blk_op_is_passthrough(blk_opf_t op){	op &= REQ_OP_MASK;	return op == REQ_OP_DRV_IN || op == REQ_OP_DRV_OUT;} /* * Zoned block device models (zoned limit). * * Note: This needs to be ordered from the least to the most severe * restrictions for the inheritance in blk_stack_limits() to work. */enum blk_zoned_model {	BLK_ZONED_NONE = 0,	/* Regular block device */	BLK_ZONED_HA,		/* Host-aware zoned block device */	BLK_ZONED_HM,		/* Host-managed zoned block device */}; /* * BLK_BOUNCE_NONE:	never bounce (default) * BLK_BOUNCE_HIGH:	bounce all highmem pages */enum blk_bounce {	BLK_BOUNCE_NONE,	BLK_BOUNCE_HIGH,}; struct queue_limits {	enum blk_bounce		bounce;	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_user_sectors;	unsigned int		max_segment_size;	unsigned int		physical_block_size;	unsigned int		logical_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_secure_erase_sectors;	unsigned int		max_write_zeroes_sectors;	unsigned int		max_zone_append_sectors;	unsigned int		discard_granularity;	unsigned int		discard_alignment;	unsigned int		zone_write_granularity; 	unsigned short		max_segments;	unsigned short		max_integrity_segments;	unsigned short		max_discard_segments; 	unsigned char		misaligned;	unsigned char		discard_misaligned;	unsigned char		raid_partial_stripes_expensive;	enum blk_zoned_model	zoned; 	/*	 * Drivers that set dma_alignment to less than 511 must be prepared to	 * handle individual bvec's that are not a multiple of a SECTOR_SIZE	 * due to possible offsets.	 */	unsigned int		dma_alignment;}; typedef int (*report_zones_cb)(struct blk_zone *zone, unsigned int idx,			       void *data); void disk_set_zoned(struct gendisk *disk, enum blk_zoned_model model); #ifdef CONFIG_BLK_DEV_ZONED #define BLK_ALL_ZONES  ((unsigned int)-1)int blkdev_report_zones(struct block_device *bdev, sector_t sector,			unsigned int nr_zones, report_zones_cb cb, void *data);unsigned int bdev_nr_zones(struct block_device *bdev);extern int blkdev_zone_mgmt(struct block_device *bdev, enum req_op op,			    sector_t sectors, sector_t nr_sectors,			    gfp_t gfp_mask);int blk_revalidate_disk_zones(struct gendisk *disk,			      void (*update_driver_data)(struct gendisk *disk)); extern int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,				     unsigned int cmd, unsigned long arg);extern int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,				  unsigned int cmd, unsigned long arg); #else /* CONFIG_BLK_DEV_ZONED */ static inline unsigned int bdev_nr_zones(struct block_device *bdev){	return 0;} 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_zone_mgmt_ioctl(struct block_device *bdev,					 fmode_t mode, unsigned int cmd,					 unsigned long arg){	return -ENOTTY;} #endif /* CONFIG_BLK_DEV_ZONED */ /* * Independent access ranges: struct blk_independent_access_range describes * a range of contiguous sectors that can be accessed using device command * execution resources that are independent from the resources used for * other access ranges. This is typically found with single-LUN multi-actuator * HDDs where each access range is served by a different set of heads. * The set of independent ranges supported by the device is defined using * struct blk_independent_access_ranges. The independent ranges must not overlap * and must include all sectors within the disk capacity (no sector holes * allowed). * For a device with multiple ranges, requests targeting sectors in different * ranges can be executed in parallel. A request can straddle an access range * boundary. */struct blk_independent_access_range {	struct kobject		kobj;	sector_t		sector;	sector_t		nr_sectors;}; struct blk_independent_access_ranges {	struct kobject				kobj;	bool					sysfs_registered;	unsigned int				nr_ia_ranges;	struct blk_independent_access_range	ia_range[];}; struct request_queue {	struct request		*last_merge;	struct elevator_queue	*elevator; 	struct percpu_ref	q_usage_counter; 	struct blk_queue_stats	*stats;	struct rq_qos		*rq_qos; 	const struct blk_mq_ops	*mq_ops; 	/* sw queues */	struct blk_mq_ctx __percpu	*queue_ctx; 	unsigned int		queue_depth; 	/* hw dispatch queues */	struct xarray		hctx_table;	unsigned int		nr_hw_queues; 	/*	 * 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;	/*	 * Number of contexts that have called blk_set_pm_only(). If this	 * counter is above zero then only RQF_PM requests are processed.	 */	atomic_t		pm_only; 	/*	 * ida allocated id for this queue.  Used to index queues from	 * ioctx.	 */	int			id; 	spinlock_t		queue_lock; 	struct gendisk		*disk; 	refcount_t		refs; 	/*	 * 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;	enum rpm_status		rpm_status;#endif 	/*	 * queue settings	 */	unsigned long		nr_requests;	/* Max # of requests */ 	unsigned int		dma_pad_mask; #ifdef CONFIG_BLK_INLINE_ENCRYPTION	struct blk_crypto_profile *crypto_profile;	struct kobject *crypto_kobject;#endif 	unsigned int		rq_timeout;	int			poll_nsec; 	struct blk_stat_callback	*poll_cb;	struct blk_rq_stat	*poll_stat; 	struct timer_list	timeout;	struct work_struct	timeout_work; 	atomic_t		nr_active_requests_shared_tags; 	struct blk_mq_tags	*sched_shared_tags; 	struct list_head	icq_list;#ifdef CONFIG_BLK_CGROUP	DECLARE_BITMAP		(blkcg_pols, BLKCG_MAX_POLS);	struct blkcg_gq		*root_blkg;	struct list_head	blkg_list;	struct mutex		blkcg_mutex;#endif 	struct queue_limits	limits; 	unsigned int		required_elevator_features; 	int			node;#ifdef CONFIG_BLK_DEV_IO_TRACE	struct blk_trace __rcu	*blk_trace;#endif	/*	 * for flush operations

Lines 1–500 of 1544.