1750 lines · 49.2 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>#include <linux/file.h>#include <linux/lockdep.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 const struct device_type part_type;extern const struct class block_class; /* * 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; enum blk_integrity_checksum {	BLK_INTEGRITY_CSUM_NONE		= 0,	BLK_INTEGRITY_CSUM_IP		= 1,	BLK_INTEGRITY_CSUM_CRC		= 2,	BLK_INTEGRITY_CSUM_CRC64	= 3,} __packed ; struct blk_integrity {	unsigned char				flags;	enum blk_integrity_checksum		csum_type;	unsigned char				tuple_size;	unsigned char				pi_offset;	unsigned char				interval_exp;	unsigned char				tag_size;}; typedef unsigned int __bitwise blk_mode_t; /* open for reading */#define BLK_OPEN_READ		((__force blk_mode_t)(1 << 0))/* open for writing */#define BLK_OPEN_WRITE		((__force blk_mode_t)(1 << 1))/* open exclusively (vs other exclusive openers */#define BLK_OPEN_EXCL		((__force blk_mode_t)(1 << 2))/* opened with O_NDELAY */#define BLK_OPEN_NDELAY		((__force blk_mode_t)(1 << 3))/* open for "writes" only for ioctls (specialy hack for floppy.c) */#define BLK_OPEN_WRITE_IOCTL	((__force blk_mode_t)(1 << 4))/* open is exclusive wrt all other BLK_OPEN_WRITE opens to the device */#define BLK_OPEN_RESTRICT_WRITES	((__force blk_mode_t)(1 << 5))/* return partition scanning errors */#define BLK_OPEN_STRICT_SCAN	((__force blk_mode_t)(1 << 6)) 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_ZONED	/*	 * Zoned block device information. 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		zone_capacity;	unsigned int		last_zone_capacity;	unsigned long __rcu	*conv_zones_bitmap;	unsigned int		zone_wplugs_hash_bits;	atomic_t		nr_zone_wplugs;	spinlock_t		zone_wplugs_lock;	struct mempool_s	*zone_wplugs_pool;	struct hlist_head	*zone_wplugs_hash;	struct workqueue_struct *zone_wplugs_wq;#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;	blk_mode_t open_mode; 	/*	 * 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;}; /** * 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);} /** * disk_has_partscan - return %true if partition scanning is enabled on a disk * @disk: disk to check * * Returns %true if partitions scanning is enabled for @disk, or %false if * partition scanning is disabled either permanently or temporarily. */static inline bool disk_has_partscan(struct gendisk *disk){	return !(disk->flags & (GENHD_FL_NO_PART | GENHD_FL_HIDDEN)) &&		!test_bit(GD_SUPPRESS_PART_SCAN, &disk->state);} /* * 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);} /* blk_validate_limits() validates bsize, so drivers don't usually need to */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;} /* flags set by the driver in queue_limits.features */typedef unsigned int __bitwise blk_features_t; /* supports a volatile write cache */#define BLK_FEAT_WRITE_CACHE		((__force blk_features_t)(1u << 0)) /* supports passing on the FUA bit */#define BLK_FEAT_FUA			((__force blk_features_t)(1u << 1)) /* rotational device (hard drive or floppy) */#define BLK_FEAT_ROTATIONAL		((__force blk_features_t)(1u << 2)) /* contributes to the random number pool */#define BLK_FEAT_ADD_RANDOM		((__force blk_features_t)(1u << 3)) /* do disk/partitions IO accounting */#define BLK_FEAT_IO_STAT		((__force blk_features_t)(1u << 4)) /* don't modify data until writeback is done */#define BLK_FEAT_STABLE_WRITES		((__force blk_features_t)(1u << 5)) /* always completes in submit context */#define BLK_FEAT_SYNCHRONOUS		((__force blk_features_t)(1u << 6)) /* supports REQ_NOWAIT */#define BLK_FEAT_NOWAIT			((__force blk_features_t)(1u << 7)) /* supports DAX */#define BLK_FEAT_DAX			((__force blk_features_t)(1u << 8)) /* supports I/O polling */#define BLK_FEAT_POLL			((__force blk_features_t)(1u << 9)) /* is a zoned device */#define BLK_FEAT_ZONED			((__force blk_features_t)(1u << 10)) /* supports PCI(e) p2p requests */#define BLK_FEAT_PCI_P2PDMA		((__force blk_features_t)(1u << 12)) /* skip this queue in blk_mq_(un)quiesce_tagset */#define BLK_FEAT_SKIP_TAGSET_QUIESCE	((__force blk_features_t)(1u << 13)) /* bounce all highmem pages */#define BLK_FEAT_BOUNCE_HIGH		((__force blk_features_t)(1u << 14)) /* undocumented magic for bcache */#define BLK_FEAT_RAID_PARTIAL_STRIPES_EXPENSIVE \	((__force blk_features_t)(1u << 15)) /* atomic writes enabled */#define BLK_FEAT_ATOMIC_WRITES \	((__force blk_features_t)(1u << 16)) /* * Flags automatically inherited when stacking limits. */#define BLK_FEAT_INHERIT_MASK \	(BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA | BLK_FEAT_ROTATIONAL | \	 BLK_FEAT_STABLE_WRITES | BLK_FEAT_ZONED | BLK_FEAT_BOUNCE_HIGH | \	 BLK_FEAT_RAID_PARTIAL_STRIPES_EXPENSIVE) /* internal flags in queue_limits.flags */typedef unsigned int __bitwise blk_flags_t; /* do not send FLUSH/FUA commands despite advertising a write cache */#define BLK_FLAG_WRITE_CACHE_DISABLED	((__force blk_flags_t)(1u << 0)) /* I/O topology is misaligned */#define BLK_FLAG_MISALIGNED		((__force blk_flags_t)(1u << 1)) /* passthrough command IO accounting */#define BLK_FLAG_IOSTATS_PASSTHROUGH	((__force blk_flags_t)(1u << 2)) struct queue_limits {	blk_features_t		features;	blk_flags_t		flags;	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		min_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_user_discard_sectors;	unsigned int		max_secure_erase_sectors;	unsigned int		max_write_zeroes_sectors;	unsigned int		max_hw_zone_append_sectors;	unsigned int		max_zone_append_sectors;	unsigned int		discard_granularity;	unsigned int		discard_alignment;	unsigned int		zone_write_granularity; 	/* atomic write limits */	unsigned int		atomic_write_hw_max;	unsigned int		atomic_write_max_sectors;	unsigned int		atomic_write_hw_boundary;	unsigned int		atomic_write_boundary_sectors;	unsigned int		atomic_write_hw_unit_min;	unsigned int		atomic_write_unit_min;	unsigned int		atomic_write_hw_unit_max;	unsigned int		atomic_write_unit_max; 	unsigned short		max_segments;	unsigned short		max_integrity_segments;	unsigned short		max_discard_segments; 	unsigned int		max_open_zones;	unsigned int		max_active_zones; 	/*	 * 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;	unsigned int		dma_pad_mask; 	struct blk_integrity	integrity;}; typedef int (*report_zones_cb)(struct blk_zone *zone, unsigned int idx,			       void *data); #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);int blkdev_zone_mgmt(struct block_device *bdev, enum req_op op,		sector_t sectors, sector_t nr_sectors);int blk_revalidate_disk_zones(struct gendisk *disk); /* * 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 {	/*	 * The queue owner gets to use this for whatever they like.	 * ll_rw_blk doesn't touch it.	 */	void			*queuedata; 	struct elevator_queue	*elevator; 	const struct blk_mq_ops	*mq_ops; 	/* sw queues */	struct blk_mq_ctx __percpu	*queue_ctx; 	/*	 * various queue flags, see QUEUE_* below	 */	unsigned long		queue_flags; 	unsigned int		rq_timeout; 	unsigned int		queue_depth; 	refcount_t		refs; 	/* hw dispatch queues */	unsigned int		nr_hw_queues;	struct xarray		hctx_table; 	struct percpu_ref	q_usage_counter;	struct lock_class_key	io_lock_cls_key;	struct lockdep_map	io_lockdep_map; 	struct lock_class_key	q_lock_cls_key;	struct lockdep_map	q_lockdep_map; 	struct request		*last_merge; 	spinlock_t		queue_lock; 	int			quiesce_depth; 	struct gendisk		*disk; 	/*	 * mq queue kobject	 */	struct kobject *mq_kobj;

Lines 1–500 of 1750.