Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _LINUX_GENHD_H
3#define _LINUX_GENHD_H
4
5/*
6 * genhd.h Copyright (C) 1992 Drew Eckhardt
7 * Generic hard disk header file by
8 * Drew Eckhardt
9 *
10 * <drew@colorado.edu>
11 */
12
13#include <linux/types.h>
14#include <linux/kdev_t.h>
15#include <linux/uuid.h>
16#include <linux/blk_types.h>
17#include <linux/device.h>
18#include <linux/xarray.h>
19
20extern const struct device_type disk_type;
21extern struct device_type part_type;
22extern struct class block_class;
23
24#define DISK_MAX_PARTS 256
25#define DISK_NAME_LEN 32
26
27#define PARTITION_META_INFO_VOLNAMELTH 64
28/*
29 * Enough for the string representation of any kind of UUID plus NULL.
30 * EFI UUID is 36 characters. MSDOS UUID is 11 characters.
31 */
32#define PARTITION_META_INFO_UUIDLTH (UUID_STRING_LEN + 1)
33
34struct partition_meta_info {
35 char uuid[PARTITION_META_INFO_UUIDLTH];
36 u8 volname[PARTITION_META_INFO_VOLNAMELTH];
37};
38
39/**
40 * DOC: genhd capability flags
41 *
42 * ``GENHD_FL_REMOVABLE``: indicates that the block device gives access to
43 * removable media. When set, the device remains present even when media is not
44 * inserted. Shall not be set for devices which are removed entirely when the
45 * media is removed.
46 *
47 * ``GENHD_FL_HIDDEN``: the block device is hidden; it doesn't produce events,
48 * doesn't appear in sysfs, and can't be opened from userspace or using
49 * blkdev_get*. Used for the underlying components of multipath devices.
50 *
51 * ``GENHD_FL_NO_PART``: partition support is disabled. The kernel will not
52 * scan for partitions from add_disk, and users can't add partitions manually.
53 *
54 */
55enum {
56 GENHD_FL_REMOVABLE = 1 << 0,
57 GENHD_FL_HIDDEN = 1 << 1,
58 GENHD_FL_NO_PART = 1 << 2,
59};
60
61enum {
62 DISK_EVENT_MEDIA_CHANGE = 1 << 0, /* media changed */
63 DISK_EVENT_EJECT_REQUEST = 1 << 1, /* eject requested */
64};
65
66enum {
67 /* Poll even if events_poll_msecs is unset */
68 DISK_EVENT_FLAG_POLL = 1 << 0,
69 /* Forward events to udev */
70 DISK_EVENT_FLAG_UEVENT = 1 << 1,
71 /* Block event polling when open for exclusive write */
72 DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE = 1 << 2,
73};
74
75struct disk_events;
76struct badblocks;
77
78struct blk_integrity {
79 const struct blk_integrity_profile *profile;
80 unsigned char flags;
81 unsigned char tuple_size;
82 unsigned char interval_exp;
83 unsigned char tag_size;
84};
85
86struct gendisk {
87 /*
88 * major/first_minor/minors should not be set by any new driver, the
89 * block core will take care of allocating them automatically.
90 */
91 int major;
92 int first_minor;
93 int minors;
94
95 char disk_name[DISK_NAME_LEN]; /* name of major driver */
96
97 unsigned short events; /* supported events */
98 unsigned short event_flags; /* flags related to event processing */
99
100 struct xarray part_tbl;
101 struct block_device *part0;
102
103 const struct block_device_operations *fops;
104 struct request_queue *queue;
105 void *private_data;
106
107 int flags;
108 unsigned long state;
109#define GD_NEED_PART_SCAN 0
110#define GD_READ_ONLY 1
111#define GD_DEAD 2
112#define GD_NATIVE_CAPACITY 3
113
114 struct mutex open_mutex; /* open/close mutex */
115 unsigned open_partitions; /* number of open partitions */
116
117 struct backing_dev_info *bdi;
118 struct kobject *slave_dir;
119#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
120 struct list_head slave_bdevs;
121#endif
122 struct timer_rand_state *random;
123 atomic_t sync_io; /* RAID */
124 struct disk_events *ev;
125#ifdef CONFIG_BLK_DEV_INTEGRITY
126 struct kobject integrity_kobj;
127#endif /* CONFIG_BLK_DEV_INTEGRITY */
128#if IS_ENABLED(CONFIG_CDROM)
129 struct cdrom_device_info *cdi;
130#endif
131 int node_id;
132 struct badblocks *bb;
133 struct lockdep_map lockdep_map;
134 u64 diskseq;
135};
136
137static inline bool disk_live(struct gendisk *disk)
138{
139 return !inode_unhashed(disk->part0->bd_inode);
140}
141
142/*
143 * The gendisk is refcounted by the part0 block_device, and the bd_device
144 * therein is also used for device model presentation in sysfs.
145 */
146#define dev_to_disk(device) \
147 (dev_to_bdev(device)->bd_disk)
148#define disk_to_dev(disk) \
149 (&((disk)->part0->bd_device))
150
151#if IS_REACHABLE(CONFIG_CDROM)
152#define disk_to_cdi(disk) ((disk)->cdi)
153#else
154#define disk_to_cdi(disk) NULL
155#endif
156
157static inline dev_t disk_devt(struct gendisk *disk)
158{
159 return MKDEV(disk->major, disk->first_minor);
160}
161
162void disk_uevent(struct gendisk *disk, enum kobject_action action);
163
164/* block/genhd.c */
165int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
166 const struct attribute_group **groups);
167static inline int __must_check add_disk(struct gendisk *disk)
168{
169 return device_add_disk(NULL, disk, NULL);
170}
171extern void del_gendisk(struct gendisk *gp);
172
173void invalidate_disk(struct gendisk *disk);
174
175void set_disk_ro(struct gendisk *disk, bool read_only);
176
177static inline int get_disk_ro(struct gendisk *disk)
178{
179 return disk->part0->bd_read_only ||
180 test_bit(GD_READ_ONLY, &disk->state);
181}
182
183static inline int bdev_read_only(struct block_device *bdev)
184{
185 return bdev->bd_read_only || get_disk_ro(bdev->bd_disk);
186}
187
188extern void disk_block_events(struct gendisk *disk);
189extern void disk_unblock_events(struct gendisk *disk);
190extern void disk_flush_events(struct gendisk *disk, unsigned int mask);
191bool set_capacity_and_notify(struct gendisk *disk, sector_t size);
192bool disk_force_media_change(struct gendisk *disk, unsigned int events);
193
194/* drivers/char/random.c */
195extern void add_disk_randomness(struct gendisk *disk) __latent_entropy;
196extern void rand_initialize_disk(struct gendisk *disk);
197
198static inline sector_t get_start_sect(struct block_device *bdev)
199{
200 return bdev->bd_start_sect;
201}
202
203static inline sector_t bdev_nr_sectors(struct block_device *bdev)
204{
205 return bdev->bd_nr_sectors;
206}
207
208static inline loff_t bdev_nr_bytes(struct block_device *bdev)
209{
210 return (loff_t)bdev_nr_sectors(bdev) << SECTOR_SHIFT;
211}
212
213static inline sector_t get_capacity(struct gendisk *disk)
214{
215 return bdev_nr_sectors(disk->part0);
216}
217
218static inline u64 sb_bdev_nr_blocks(struct super_block *sb)
219{
220 return bdev_nr_sectors(sb->s_bdev) >>
221 (sb->s_blocksize_bits - SECTOR_SHIFT);
222}
223
224int bdev_disk_changed(struct gendisk *disk, bool invalidate);
225void blk_drop_partitions(struct gendisk *disk);
226
227struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
228 struct lock_class_key *lkclass);
229extern void put_disk(struct gendisk *disk);
230struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);
231
232/**
233 * blk_alloc_disk - allocate a gendisk structure
234 * @node_id: numa node to allocate on
235 *
236 * Allocate and pre-initialize a gendisk structure for use with BIO based
237 * drivers.
238 *
239 * Context: can sleep
240 */
241#define blk_alloc_disk(node_id) \
242({ \
243 static struct lock_class_key __key; \
244 \
245 __blk_alloc_disk(node_id, &__key); \
246})
247void blk_cleanup_disk(struct gendisk *disk);
248
249int __register_blkdev(unsigned int major, const char *name,
250 void (*probe)(dev_t devt));
251#define register_blkdev(major, name) \
252 __register_blkdev(major, name, NULL)
253void unregister_blkdev(unsigned int major, const char *name);
254
255bool bdev_check_media_change(struct block_device *bdev);
256int __invalidate_device(struct block_device *bdev, bool kill_dirty);
257void set_capacity(struct gendisk *disk, sector_t size);
258
259#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
260int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk);
261void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk);
262int bd_register_pending_holders(struct gendisk *disk);
263#else
264static inline int bd_link_disk_holder(struct block_device *bdev,
265 struct gendisk *disk)
266{
267 return 0;
268}
269static inline void bd_unlink_disk_holder(struct block_device *bdev,
270 struct gendisk *disk)
271{
272}
273static inline int bd_register_pending_holders(struct gendisk *disk)
274{
275 return 0;
276}
277#endif /* CONFIG_BLOCK_HOLDER_DEPRECATED */
278
279dev_t part_devt(struct gendisk *disk, u8 partno);
280void inc_diskseq(struct gendisk *disk);
281dev_t blk_lookup_devt(const char *name, int partno);
282void blk_request_module(dev_t devt);
283#ifdef CONFIG_BLOCK
284void printk_all_partitions(void);
285#else /* CONFIG_BLOCK */
286static inline void printk_all_partitions(void)
287{
288}
289#endif /* CONFIG_BLOCK */
290
291#endif /* _LINUX_GENHD_H */