1 /* SPDX-License-Identifier: GPL-2.0 */
6 * genhd.h Copyright (C) 1992 Drew Eckhardt
7 * Generic hard disk header file by
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>
20 extern const struct device_type disk_type;
21 extern struct device_type part_type;
22 extern struct class block_class;
24 #define DISK_MAX_PARTS 256
25 #define DISK_NAME_LEN 32
27 #define PARTITION_META_INFO_VOLNAMELTH 64
29 * Enough for the string representation of any kind of UUID plus NULL.
30 * EFI UUID is 36 characters. MSDOS UUID is 11 characters.
32 #define PARTITION_META_INFO_UUIDLTH (UUID_STRING_LEN + 1)
34 struct partition_meta_info {
35 char uuid[PARTITION_META_INFO_UUIDLTH];
36 u8 volname[PARTITION_META_INFO_VOLNAMELTH];
40 * DOC: genhd capability flags
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
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.
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.
56 GENHD_FL_REMOVABLE = 1 << 0,
57 GENHD_FL_HIDDEN = 1 << 1,
58 GENHD_FL_NO_PART = 1 << 2,
62 DISK_EVENT_MEDIA_CHANGE = 1 << 0, /* media changed */
63 DISK_EVENT_EJECT_REQUEST = 1 << 1, /* eject requested */
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,
78 struct blk_integrity {
79 const struct blk_integrity_profile *profile;
81 unsigned char tuple_size;
82 unsigned char interval_exp;
83 unsigned char tag_size;
88 * major/first_minor/minors should not be set by any new driver, the
89 * block core will take care of allocating them automatically.
95 char disk_name[DISK_NAME_LEN]; /* name of major driver */
97 unsigned short events; /* supported events */
98 unsigned short event_flags; /* flags related to event processing */
100 struct xarray part_tbl;
101 struct block_device *part0;
103 const struct block_device_operations *fops;
104 struct request_queue *queue;
109 #define GD_NEED_PART_SCAN 0
110 #define GD_READ_ONLY 1
112 #define GD_NATIVE_CAPACITY 3
114 struct mutex open_mutex; /* open/close mutex */
115 unsigned open_partitions; /* number of open partitions */
117 struct backing_dev_info *bdi;
118 struct kobject *slave_dir;
119 #ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
120 struct list_head slave_bdevs;
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;
132 struct badblocks *bb;
133 struct lockdep_map lockdep_map;
137 static inline bool disk_live(struct gendisk *disk)
139 return !inode_unhashed(disk->part0->bd_inode);
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.
146 #define dev_to_disk(device) \
147 (dev_to_bdev(device)->bd_disk)
148 #define disk_to_dev(disk) \
149 (&((disk)->part0->bd_device))
151 #if IS_REACHABLE(CONFIG_CDROM)
152 #define disk_to_cdi(disk) ((disk)->cdi)
154 #define disk_to_cdi(disk) NULL
157 static inline dev_t disk_devt(struct gendisk *disk)
159 return MKDEV(disk->major, disk->first_minor);
162 void disk_uevent(struct gendisk *disk, enum kobject_action action);
165 int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
166 const struct attribute_group **groups);
167 static inline int __must_check add_disk(struct gendisk *disk)
169 return device_add_disk(NULL, disk, NULL);
171 extern void del_gendisk(struct gendisk *gp);
173 void invalidate_disk(struct gendisk *disk);
175 void set_disk_ro(struct gendisk *disk, bool read_only);
177 static inline int get_disk_ro(struct gendisk *disk)
179 return disk->part0->bd_read_only ||
180 test_bit(GD_READ_ONLY, &disk->state);
183 static inline int bdev_read_only(struct block_device *bdev)
185 return bdev->bd_read_only || get_disk_ro(bdev->bd_disk);
188 extern void disk_block_events(struct gendisk *disk);
189 extern void disk_unblock_events(struct gendisk *disk);
190 extern void disk_flush_events(struct gendisk *disk, unsigned int mask);
191 bool set_capacity_and_notify(struct gendisk *disk, sector_t size);
192 bool disk_force_media_change(struct gendisk *disk, unsigned int events);
194 /* drivers/char/random.c */
195 extern void add_disk_randomness(struct gendisk *disk) __latent_entropy;
196 extern void rand_initialize_disk(struct gendisk *disk);
198 static inline sector_t get_start_sect(struct block_device *bdev)
200 return bdev->bd_start_sect;
203 static inline sector_t bdev_nr_sectors(struct block_device *bdev)
205 return bdev->bd_nr_sectors;
208 static inline loff_t bdev_nr_bytes(struct block_device *bdev)
210 return (loff_t)bdev_nr_sectors(bdev) << SECTOR_SHIFT;
213 static inline sector_t get_capacity(struct gendisk *disk)
215 return bdev_nr_sectors(disk->part0);
218 static inline u64 sb_bdev_nr_blocks(struct super_block *sb)
220 return bdev_nr_sectors(sb->s_bdev) >>
221 (sb->s_blocksize_bits - SECTOR_SHIFT);
224 int bdev_disk_changed(struct gendisk *disk, bool invalidate);
225 void blk_drop_partitions(struct gendisk *disk);
227 struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
228 struct lock_class_key *lkclass);
229 extern void put_disk(struct gendisk *disk);
230 struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);
233 * blk_alloc_disk - allocate a gendisk structure
234 * @node_id: numa node to allocate on
236 * Allocate and pre-initialize a gendisk structure for use with BIO based
241 #define blk_alloc_disk(node_id) \
243 static struct lock_class_key __key; \
245 __blk_alloc_disk(node_id, &__key); \
247 void blk_cleanup_disk(struct gendisk *disk);
249 int __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)
253 void unregister_blkdev(unsigned int major, const char *name);
255 bool bdev_check_media_change(struct block_device *bdev);
256 int __invalidate_device(struct block_device *bdev, bool kill_dirty);
257 void set_capacity(struct gendisk *disk, sector_t size);
259 #ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
260 int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk);
261 void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk);
262 int bd_register_pending_holders(struct gendisk *disk);
264 static inline int bd_link_disk_holder(struct block_device *bdev,
265 struct gendisk *disk)
269 static inline void bd_unlink_disk_holder(struct block_device *bdev,
270 struct gendisk *disk)
273 static inline int bd_register_pending_holders(struct gendisk *disk)
277 #endif /* CONFIG_BLOCK_HOLDER_DEPRECATED */
279 dev_t part_devt(struct gendisk *disk, u8 partno);
280 void inc_diskseq(struct gendisk *disk);
281 dev_t blk_lookup_devt(const char *name, int partno);
282 void blk_request_module(dev_t devt);
284 void printk_all_partitions(void);
285 #else /* CONFIG_BLOCK */
286 static inline void printk_all_partitions(void)
289 #endif /* CONFIG_BLOCK */
291 #endif /* _LINUX_GENHD_H */