mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
Merge branch 'for-5.18/block' into for-5.18/write-streams
* for-5.18/block: (96 commits) block: remove bio_devname ext4: stop using bio_devname raid5-ppl: stop using bio_devname raid1: stop using bio_devname md-multipath: stop using bio_devname dm-integrity: stop using bio_devname dm-crypt: stop using bio_devname pktcdvd: remove a pointless debug check in pkt_submit_bio block: remove handle_bad_sector block: fix and cleanup bio_check_ro bfq: fix use-after-free in bfq_dispatch_request blk-crypto: show crypto capabilities in sysfs block: don't delete queue kobject before its children block: simplify calling convention of elv_unregister_queue() block: remove redundant semicolon block: default BLOCK_LEGACY_AUTOLOAD to y block: update io_ticks when io hang block, bfq: don't move oom_bfqq block, bfq: avoid moving bfqq to it's parent bfqg block, bfq: cleanup bfq_bfqq_to_bfqg() ...
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Portions Copyright (C) 1992 Drew Eckhardt
|
||||
*/
|
||||
#ifndef _LINUX_BLKDEV_H
|
||||
#define _LINUX_BLKDEV_H
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/genhd.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>
|
||||
@@ -12,11 +16,15 @@
|
||||
#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/srcu.h>
|
||||
#include <linux/uuid.h>
|
||||
#include <linux/xarray.h>
|
||||
|
||||
struct module;
|
||||
struct request_queue;
|
||||
@@ -33,6 +41,10 @@ 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
|
||||
|
||||
@@ -45,6 +57,145 @@ struct blk_crypto_profile;
|
||||
*/
|
||||
#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;
|
||||
|
||||
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
|
||||
|
||||
struct mutex open_mutex; /* open/close mutex */
|
||||
unsigned open_partitions; /* number of open partitions */
|
||||
|
||||
struct backing_dev_info *bdi;
|
||||
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 */
|
||||
#if IS_ENABLED(CONFIG_CDROM)
|
||||
struct cdrom_device_info *cdi;
|
||||
#endif
|
||||
int node_id;
|
||||
struct badblocks *bb;
|
||||
struct lockdep_map lockdep_map;
|
||||
u64 diskseq;
|
||||
};
|
||||
|
||||
static inline bool disk_live(struct gendisk *disk)
|
||||
{
|
||||
return !inode_unhashed(disk->part0->bd_inode);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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))
|
||||
@@ -262,6 +413,7 @@ struct request_queue {
|
||||
|
||||
#ifdef CONFIG_BLK_INLINE_ENCRYPTION
|
||||
struct blk_crypto_profile *crypto_profile;
|
||||
struct kobject *crypto_kobject;
|
||||
#endif
|
||||
|
||||
unsigned int rq_timeout;
|
||||
@@ -596,6 +748,118 @@ static inline unsigned int blk_queue_depth(struct request_queue *q)
|
||||
#define for_each_bio(_bio) \
|
||||
for (; _bio; _bio = _bio->bi_next)
|
||||
|
||||
int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
|
||||
const struct attribute_group **groups);
|
||||
static inline int __must_check add_disk(struct gendisk *disk)
|
||||
{
|
||||
return device_add_disk(NULL, disk, NULL);
|
||||
}
|
||||
void del_gendisk(struct gendisk *gp);
|
||||
void invalidate_disk(struct gendisk *disk);
|
||||
void set_disk_ro(struct gendisk *disk, bool read_only);
|
||||
void disk_uevent(struct gendisk *disk, enum kobject_action action);
|
||||
|
||||
static inline int get_disk_ro(struct gendisk *disk)
|
||||
{
|
||||
return disk->part0->bd_read_only ||
|
||||
test_bit(GD_READ_ONLY, &disk->state);
|
||||
}
|
||||
|
||||
static inline int bdev_read_only(struct block_device *bdev)
|
||||
{
|
||||
return bdev->bd_read_only || get_disk_ro(bdev->bd_disk);
|
||||
}
|
||||
|
||||
bool set_capacity_and_notify(struct gendisk *disk, sector_t size);
|
||||
bool disk_force_media_change(struct gendisk *disk, unsigned int events);
|
||||
|
||||
void add_disk_randomness(struct gendisk *disk) __latent_entropy;
|
||||
void rand_initialize_disk(struct gendisk *disk);
|
||||
|
||||
static inline sector_t get_start_sect(struct block_device *bdev)
|
||||
{
|
||||
return bdev->bd_start_sect;
|
||||
}
|
||||
|
||||
static inline sector_t bdev_nr_sectors(struct block_device *bdev)
|
||||
{
|
||||
return bdev->bd_nr_sectors;
|
||||
}
|
||||
|
||||
static inline loff_t bdev_nr_bytes(struct block_device *bdev)
|
||||
{
|
||||
return (loff_t)bdev_nr_sectors(bdev) << SECTOR_SHIFT;
|
||||
}
|
||||
|
||||
static inline sector_t get_capacity(struct gendisk *disk)
|
||||
{
|
||||
return bdev_nr_sectors(disk->part0);
|
||||
}
|
||||
|
||||
static inline u64 sb_bdev_nr_blocks(struct super_block *sb)
|
||||
{
|
||||
return bdev_nr_sectors(sb->s_bdev) >>
|
||||
(sb->s_blocksize_bits - SECTOR_SHIFT);
|
||||
}
|
||||
|
||||
int bdev_disk_changed(struct gendisk *disk, bool invalidate);
|
||||
|
||||
struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
|
||||
struct lock_class_key *lkclass);
|
||||
void put_disk(struct gendisk *disk);
|
||||
struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);
|
||||
|
||||
/**
|
||||
* blk_alloc_disk - allocate a gendisk structure
|
||||
* @node_id: numa node to allocate on
|
||||
*
|
||||
* Allocate and pre-initialize a gendisk structure for use with BIO based
|
||||
* drivers.
|
||||
*
|
||||
* Context: can sleep
|
||||
*/
|
||||
#define blk_alloc_disk(node_id) \
|
||||
({ \
|
||||
static struct lock_class_key __key; \
|
||||
\
|
||||
__blk_alloc_disk(node_id, &__key); \
|
||||
})
|
||||
void blk_cleanup_disk(struct gendisk *disk);
|
||||
|
||||
int __register_blkdev(unsigned int major, const char *name,
|
||||
void (*probe)(dev_t devt));
|
||||
#define register_blkdev(major, name) \
|
||||
__register_blkdev(major, name, NULL)
|
||||
void unregister_blkdev(unsigned int major, const char *name);
|
||||
|
||||
bool bdev_check_media_change(struct block_device *bdev);
|
||||
int __invalidate_device(struct block_device *bdev, bool kill_dirty);
|
||||
void set_capacity(struct gendisk *disk, sector_t size);
|
||||
|
||||
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
|
||||
int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk);
|
||||
void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk);
|
||||
int bd_register_pending_holders(struct gendisk *disk);
|
||||
#else
|
||||
static inline int bd_link_disk_holder(struct block_device *bdev,
|
||||
struct gendisk *disk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void bd_unlink_disk_holder(struct block_device *bdev,
|
||||
struct gendisk *disk)
|
||||
{
|
||||
}
|
||||
static inline int bd_register_pending_holders(struct gendisk *disk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_BLOCK_HOLDER_DEPRECATED */
|
||||
|
||||
dev_t part_devt(struct gendisk *disk, u8 partno);
|
||||
void inc_diskseq(struct gendisk *disk);
|
||||
dev_t blk_lookup_devt(const char *name, int partno);
|
||||
void blk_request_module(dev_t devt);
|
||||
|
||||
extern int blk_register_queue(struct gendisk *disk);
|
||||
extern void blk_unregister_queue(struct gendisk *disk);
|
||||
@@ -792,14 +1056,11 @@ extern void blk_start_plug(struct blk_plug *);
|
||||
extern void blk_start_plug_nr_ios(struct blk_plug *, unsigned short);
|
||||
extern void blk_finish_plug(struct blk_plug *);
|
||||
|
||||
void blk_flush_plug(struct blk_plug *plug, bool from_schedule);
|
||||
|
||||
static inline bool blk_needs_flush_plug(struct task_struct *tsk)
|
||||
void __blk_flush_plug(struct blk_plug *plug, bool from_schedule);
|
||||
static inline void blk_flush_plug(struct blk_plug *plug, bool async)
|
||||
{
|
||||
struct blk_plug *plug = tsk->plug;
|
||||
|
||||
return plug &&
|
||||
(plug->mq_list || !list_empty(&plug->cb_list));
|
||||
if (plug)
|
||||
__blk_flush_plug(plug, async);
|
||||
}
|
||||
|
||||
int blkdev_issue_flush(struct block_device *bdev);
|
||||
@@ -825,11 +1086,6 @@ static inline void blk_flush_plug(struct blk_plug *plug, bool async)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool blk_needs_flush_plug(struct task_struct *tsk)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int blkdev_issue_flush(struct block_device *bdev)
|
||||
{
|
||||
return 0;
|
||||
@@ -1211,6 +1467,7 @@ struct block_device_operations {
|
||||
void (*unlock_native_capacity) (struct gendisk *);
|
||||
int (*getgeo)(struct block_device *, struct hd_geometry *);
|
||||
int (*set_read_only)(struct block_device *bdev, bool ro);
|
||||
void (*free_disk)(struct gendisk *disk);
|
||||
/* this callback is with swap_lock and sometimes page table lock held */
|
||||
void (*swap_slot_free_notify) (struct block_device *, unsigned long);
|
||||
int (*report_zones)(struct gendisk *, sector_t sector,
|
||||
@@ -1267,7 +1524,7 @@ void bio_end_io_acct_remapped(struct bio *bio, unsigned long start_time,
|
||||
/**
|
||||
* bio_end_io_acct - end I/O accounting for bio based drivers
|
||||
* @bio: bio to end account for
|
||||
* @start: start time returned by bio_start_io_acct()
|
||||
* @start_time: start time returned by bio_start_io_acct()
|
||||
*/
|
||||
static inline void bio_end_io_acct(struct bio *bio, unsigned long start_time)
|
||||
{
|
||||
@@ -1312,6 +1569,7 @@ void invalidate_bdev(struct block_device *bdev);
|
||||
int sync_blockdev(struct block_device *bdev);
|
||||
int sync_blockdev_nowait(struct block_device *bdev);
|
||||
void sync_bdevs(bool wait);
|
||||
void printk_all_partitions(void);
|
||||
#else
|
||||
static inline void invalidate_bdev(struct block_device *bdev)
|
||||
{
|
||||
@@ -1327,7 +1585,11 @@ static inline int sync_blockdev_nowait(struct block_device *bdev)
|
||||
static inline void sync_bdevs(bool wait)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
static inline void printk_all_partitions(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_BLOCK */
|
||||
|
||||
int fsync_bdev(struct block_device *bdev);
|
||||
|
||||
int freeze_bdev(struct block_device *bdev);
|
||||
|
Reference in New Issue
Block a user