1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _LINUX_GENHD_H
3*4882a593Smuzhiyun #define _LINUX_GENHD_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun * genhd.h Copyright (C) 1992 Drew Eckhardt
7*4882a593Smuzhiyun * Generic hard disk header file by
8*4882a593Smuzhiyun * Drew Eckhardt
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * <drew@colorado.edu>
11*4882a593Smuzhiyun */
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <linux/types.h>
14*4882a593Smuzhiyun #include <linux/kdev_t.h>
15*4882a593Smuzhiyun #include <linux/rcupdate.h>
16*4882a593Smuzhiyun #include <linux/slab.h>
17*4882a593Smuzhiyun #include <linux/percpu-refcount.h>
18*4882a593Smuzhiyun #include <linux/uuid.h>
19*4882a593Smuzhiyun #include <linux/blk_types.h>
20*4882a593Smuzhiyun #include <linux/android_kabi.h>
21*4882a593Smuzhiyun #include <asm/local.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #define dev_to_disk(device) container_of((device), struct gendisk, part0.__dev)
24*4882a593Smuzhiyun #define dev_to_part(device) container_of((device), struct hd_struct, __dev)
25*4882a593Smuzhiyun #define disk_to_dev(disk) (&(disk)->part0.__dev)
26*4882a593Smuzhiyun #define part_to_dev(part) (&((part)->__dev))
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun extern const struct device_type disk_type;
29*4882a593Smuzhiyun extern struct device_type part_type;
30*4882a593Smuzhiyun extern struct class block_class;
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun #define DISK_MAX_PARTS 256
33*4882a593Smuzhiyun #define DISK_NAME_LEN 32
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #include <linux/major.h>
36*4882a593Smuzhiyun #include <linux/device.h>
37*4882a593Smuzhiyun #include <linux/smp.h>
38*4882a593Smuzhiyun #include <linux/string.h>
39*4882a593Smuzhiyun #include <linux/fs.h>
40*4882a593Smuzhiyun #include <linux/workqueue.h>
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #define PARTITION_META_INFO_VOLNAMELTH 64
43*4882a593Smuzhiyun /*
44*4882a593Smuzhiyun * Enough for the string representation of any kind of UUID plus NULL.
45*4882a593Smuzhiyun * EFI UUID is 36 characters. MSDOS UUID is 11 characters.
46*4882a593Smuzhiyun */
47*4882a593Smuzhiyun #define PARTITION_META_INFO_UUIDLTH (UUID_STRING_LEN + 1)
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun struct partition_meta_info {
50*4882a593Smuzhiyun char uuid[PARTITION_META_INFO_UUIDLTH];
51*4882a593Smuzhiyun u8 volname[PARTITION_META_INFO_VOLNAMELTH];
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun struct hd_struct {
55*4882a593Smuzhiyun sector_t start_sect;
56*4882a593Smuzhiyun /*
57*4882a593Smuzhiyun * nr_sects is protected by sequence counter. One might extend a
58*4882a593Smuzhiyun * partition while IO is happening to it and update of nr_sects
59*4882a593Smuzhiyun * can be non-atomic on 32bit machines with 64bit sector_t.
60*4882a593Smuzhiyun */
61*4882a593Smuzhiyun sector_t nr_sects;
62*4882a593Smuzhiyun #if BITS_PER_LONG==32 && defined(CONFIG_SMP)
63*4882a593Smuzhiyun seqcount_t nr_sects_seq;
64*4882a593Smuzhiyun #endif
65*4882a593Smuzhiyun unsigned long stamp;
66*4882a593Smuzhiyun struct disk_stats __percpu *dkstats;
67*4882a593Smuzhiyun struct percpu_ref ref;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun struct device __dev;
70*4882a593Smuzhiyun struct kobject *holder_dir;
71*4882a593Smuzhiyun int policy, partno;
72*4882a593Smuzhiyun struct partition_meta_info *info;
73*4882a593Smuzhiyun #ifdef CONFIG_FAIL_MAKE_REQUEST
74*4882a593Smuzhiyun int make_it_fail;
75*4882a593Smuzhiyun #endif
76*4882a593Smuzhiyun struct rcu_work rcu_work;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
79*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2);
80*4882a593Smuzhiyun ANDROID_KABI_RESERVE(3);
81*4882a593Smuzhiyun ANDROID_KABI_RESERVE(4);
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun /**
85*4882a593Smuzhiyun * DOC: genhd capability flags
86*4882a593Smuzhiyun *
87*4882a593Smuzhiyun * ``GENHD_FL_REMOVABLE`` (0x0001): indicates that the block device
88*4882a593Smuzhiyun * gives access to removable media.
89*4882a593Smuzhiyun * When set, the device remains present even when media is not
90*4882a593Smuzhiyun * inserted.
91*4882a593Smuzhiyun * Must not be set for devices which are removed entirely when the
92*4882a593Smuzhiyun * media is removed.
93*4882a593Smuzhiyun *
94*4882a593Smuzhiyun * ``GENHD_FL_CD`` (0x0008): the block device is a CD-ROM-style
95*4882a593Smuzhiyun * device.
96*4882a593Smuzhiyun * Affects responses to the ``CDROM_GET_CAPABILITY`` ioctl.
97*4882a593Smuzhiyun *
98*4882a593Smuzhiyun * ``GENHD_FL_UP`` (0x0010): indicates that the block device is "up",
99*4882a593Smuzhiyun * with a similar meaning to network interfaces.
100*4882a593Smuzhiyun *
101*4882a593Smuzhiyun * ``GENHD_FL_SUPPRESS_PARTITION_INFO`` (0x0020): don't include
102*4882a593Smuzhiyun * partition information in ``/proc/partitions`` or in the output of
103*4882a593Smuzhiyun * printk_all_partitions().
104*4882a593Smuzhiyun * Used for the null block device and some MMC devices.
105*4882a593Smuzhiyun *
106*4882a593Smuzhiyun * ``GENHD_FL_EXT_DEVT`` (0x0040): the driver supports extended
107*4882a593Smuzhiyun * dynamic ``dev_t``, i.e. it wants extended device numbers
108*4882a593Smuzhiyun * (``BLOCK_EXT_MAJOR``).
109*4882a593Smuzhiyun * This affects the maximum number of partitions.
110*4882a593Smuzhiyun *
111*4882a593Smuzhiyun * ``GENHD_FL_NATIVE_CAPACITY`` (0x0080): based on information in the
112*4882a593Smuzhiyun * partition table, the device's capacity has been extended to its
113*4882a593Smuzhiyun * native capacity; i.e. the device has hidden capacity used by one
114*4882a593Smuzhiyun * of the partitions (this is a flag used so that native capacity is
115*4882a593Smuzhiyun * only ever unlocked once).
116*4882a593Smuzhiyun *
117*4882a593Smuzhiyun * ``GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE`` (0x0100): event polling is
118*4882a593Smuzhiyun * blocked whenever a writer holds an exclusive lock.
119*4882a593Smuzhiyun *
120*4882a593Smuzhiyun * ``GENHD_FL_NO_PART_SCAN`` (0x0200): partition scanning is disabled.
121*4882a593Smuzhiyun * Used for loop devices in their default settings and some MMC
122*4882a593Smuzhiyun * devices.
123*4882a593Smuzhiyun *
124*4882a593Smuzhiyun * ``GENHD_FL_HIDDEN`` (0x0400): the block device is hidden; it
125*4882a593Smuzhiyun * doesn't produce events, doesn't appear in sysfs, and doesn't have
126*4882a593Smuzhiyun * an associated ``bdev``.
127*4882a593Smuzhiyun * Implies ``GENHD_FL_SUPPRESS_PARTITION_INFO`` and
128*4882a593Smuzhiyun * ``GENHD_FL_NO_PART_SCAN``.
129*4882a593Smuzhiyun * Used for multipath devices.
130*4882a593Smuzhiyun */
131*4882a593Smuzhiyun #define GENHD_FL_REMOVABLE 0x0001
132*4882a593Smuzhiyun /* 2 is unused (used to be GENHD_FL_DRIVERFS) */
133*4882a593Smuzhiyun /* 4 is unused (used to be GENHD_FL_MEDIA_CHANGE_NOTIFY) */
134*4882a593Smuzhiyun #define GENHD_FL_CD 0x0008
135*4882a593Smuzhiyun #define GENHD_FL_UP 0x0010
136*4882a593Smuzhiyun #define GENHD_FL_SUPPRESS_PARTITION_INFO 0x0020
137*4882a593Smuzhiyun #define GENHD_FL_EXT_DEVT 0x0040
138*4882a593Smuzhiyun #define GENHD_FL_NATIVE_CAPACITY 0x0080
139*4882a593Smuzhiyun #define GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE 0x0100
140*4882a593Smuzhiyun #define GENHD_FL_NO_PART_SCAN 0x0200
141*4882a593Smuzhiyun #define GENHD_FL_HIDDEN 0x0400
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun enum {
144*4882a593Smuzhiyun DISK_EVENT_MEDIA_CHANGE = 1 << 0, /* media changed */
145*4882a593Smuzhiyun DISK_EVENT_EJECT_REQUEST = 1 << 1, /* eject requested */
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun enum {
149*4882a593Smuzhiyun /* Poll even if events_poll_msecs is unset */
150*4882a593Smuzhiyun DISK_EVENT_FLAG_POLL = 1 << 0,
151*4882a593Smuzhiyun /* Forward events to udev */
152*4882a593Smuzhiyun DISK_EVENT_FLAG_UEVENT = 1 << 1,
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun struct disk_part_tbl {
156*4882a593Smuzhiyun struct rcu_head rcu_head;
157*4882a593Smuzhiyun int len;
158*4882a593Smuzhiyun struct hd_struct __rcu *last_lookup;
159*4882a593Smuzhiyun struct hd_struct __rcu *part[];
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun struct disk_events;
163*4882a593Smuzhiyun struct badblocks;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun struct blk_integrity {
166*4882a593Smuzhiyun const struct blk_integrity_profile *profile;
167*4882a593Smuzhiyun unsigned char flags;
168*4882a593Smuzhiyun unsigned char tuple_size;
169*4882a593Smuzhiyun unsigned char interval_exp;
170*4882a593Smuzhiyun unsigned char tag_size;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
173*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2);
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun struct gendisk {
177*4882a593Smuzhiyun /* major, first_minor and minors are input parameters only,
178*4882a593Smuzhiyun * don't use directly. Use disk_devt() and disk_max_parts().
179*4882a593Smuzhiyun */
180*4882a593Smuzhiyun int major; /* major number of driver */
181*4882a593Smuzhiyun int first_minor;
182*4882a593Smuzhiyun int minors; /* maximum number of minors, =1 for
183*4882a593Smuzhiyun * disks that can't be partitioned. */
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun char disk_name[DISK_NAME_LEN]; /* name of major driver */
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun unsigned short events; /* supported events */
188*4882a593Smuzhiyun unsigned short event_flags; /* flags related to event processing */
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun /* Array of pointers to partitions indexed by partno.
191*4882a593Smuzhiyun * Protected with matching bdev lock but stat and other
192*4882a593Smuzhiyun * non-critical accesses use RCU. Always access through
193*4882a593Smuzhiyun * helpers.
194*4882a593Smuzhiyun */
195*4882a593Smuzhiyun struct disk_part_tbl __rcu *part_tbl;
196*4882a593Smuzhiyun struct hd_struct part0;
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun const struct block_device_operations *fops;
199*4882a593Smuzhiyun struct request_queue *queue;
200*4882a593Smuzhiyun void *private_data;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun int flags;
203*4882a593Smuzhiyun unsigned long state;
204*4882a593Smuzhiyun #define GD_NEED_PART_SCAN 0
205*4882a593Smuzhiyun struct rw_semaphore lookup_sem;
206*4882a593Smuzhiyun struct kobject *slave_dir;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun struct timer_rand_state *random;
209*4882a593Smuzhiyun atomic_t sync_io; /* RAID */
210*4882a593Smuzhiyun struct disk_events *ev;
211*4882a593Smuzhiyun #ifdef CONFIG_BLK_DEV_INTEGRITY
212*4882a593Smuzhiyun struct kobject integrity_kobj;
213*4882a593Smuzhiyun #endif /* CONFIG_BLK_DEV_INTEGRITY */
214*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_CDROM)
215*4882a593Smuzhiyun struct cdrom_device_info *cdi;
216*4882a593Smuzhiyun #endif
217*4882a593Smuzhiyun int node_id;
218*4882a593Smuzhiyun struct badblocks *bb;
219*4882a593Smuzhiyun struct lockdep_map lockdep_map;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
222*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2);
223*4882a593Smuzhiyun ANDROID_KABI_RESERVE(3);
224*4882a593Smuzhiyun ANDROID_KABI_RESERVE(4);
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun #if IS_REACHABLE(CONFIG_CDROM)
229*4882a593Smuzhiyun #define disk_to_cdi(disk) ((disk)->cdi)
230*4882a593Smuzhiyun #else
231*4882a593Smuzhiyun #define disk_to_cdi(disk) NULL
232*4882a593Smuzhiyun #endif
233*4882a593Smuzhiyun
part_to_disk(struct hd_struct * part)234*4882a593Smuzhiyun static inline struct gendisk *part_to_disk(struct hd_struct *part)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun if (likely(part)) {
237*4882a593Smuzhiyun if (part->partno)
238*4882a593Smuzhiyun return dev_to_disk(part_to_dev(part)->parent);
239*4882a593Smuzhiyun else
240*4882a593Smuzhiyun return dev_to_disk(part_to_dev(part));
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun return NULL;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun
disk_max_parts(struct gendisk * disk)245*4882a593Smuzhiyun static inline int disk_max_parts(struct gendisk *disk)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun if (disk->flags & GENHD_FL_EXT_DEVT)
248*4882a593Smuzhiyun return DISK_MAX_PARTS;
249*4882a593Smuzhiyun return disk->minors;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
disk_part_scan_enabled(struct gendisk * disk)252*4882a593Smuzhiyun static inline bool disk_part_scan_enabled(struct gendisk *disk)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun return disk_max_parts(disk) > 1 &&
255*4882a593Smuzhiyun !(disk->flags & GENHD_FL_NO_PART_SCAN);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun
disk_devt(struct gendisk * disk)258*4882a593Smuzhiyun static inline dev_t disk_devt(struct gendisk *disk)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun return MKDEV(disk->major, disk->first_minor);
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
part_devt(struct hd_struct * part)263*4882a593Smuzhiyun static inline dev_t part_devt(struct hd_struct *part)
264*4882a593Smuzhiyun {
265*4882a593Smuzhiyun return part_to_dev(part)->devt;
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun extern struct hd_struct *__disk_get_part(struct gendisk *disk, int partno);
269*4882a593Smuzhiyun extern struct hd_struct *disk_get_part(struct gendisk *disk, int partno);
270*4882a593Smuzhiyun
disk_put_part(struct hd_struct * part)271*4882a593Smuzhiyun static inline void disk_put_part(struct hd_struct *part)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun if (likely(part))
274*4882a593Smuzhiyun put_device(part_to_dev(part));
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun
hd_sects_seq_init(struct hd_struct * p)277*4882a593Smuzhiyun static inline void hd_sects_seq_init(struct hd_struct *p)
278*4882a593Smuzhiyun {
279*4882a593Smuzhiyun #if BITS_PER_LONG==32 && defined(CONFIG_SMP)
280*4882a593Smuzhiyun seqcount_init(&p->nr_sects_seq);
281*4882a593Smuzhiyun #endif
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun /*
285*4882a593Smuzhiyun * Smarter partition iterator without context limits.
286*4882a593Smuzhiyun */
287*4882a593Smuzhiyun #define DISK_PITER_REVERSE (1 << 0) /* iterate in the reverse direction */
288*4882a593Smuzhiyun #define DISK_PITER_INCL_EMPTY (1 << 1) /* include 0-sized parts */
289*4882a593Smuzhiyun #define DISK_PITER_INCL_PART0 (1 << 2) /* include partition 0 */
290*4882a593Smuzhiyun #define DISK_PITER_INCL_EMPTY_PART0 (1 << 3) /* include empty partition 0 */
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun struct disk_part_iter {
293*4882a593Smuzhiyun struct gendisk *disk;
294*4882a593Smuzhiyun struct hd_struct *part;
295*4882a593Smuzhiyun int idx;
296*4882a593Smuzhiyun unsigned int flags;
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun extern void disk_part_iter_init(struct disk_part_iter *piter,
300*4882a593Smuzhiyun struct gendisk *disk, unsigned int flags);
301*4882a593Smuzhiyun extern struct hd_struct *disk_part_iter_next(struct disk_part_iter *piter);
302*4882a593Smuzhiyun extern void disk_part_iter_exit(struct disk_part_iter *piter);
303*4882a593Smuzhiyun extern bool disk_has_partitions(struct gendisk *disk);
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun /* block/genhd.c */
306*4882a593Smuzhiyun extern void device_add_disk(struct device *parent, struct gendisk *disk,
307*4882a593Smuzhiyun const struct attribute_group **groups);
add_disk(struct gendisk * disk)308*4882a593Smuzhiyun static inline void add_disk(struct gendisk *disk)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun device_add_disk(NULL, disk, NULL);
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun extern void device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk);
add_disk_no_queue_reg(struct gendisk * disk)313*4882a593Smuzhiyun static inline void add_disk_no_queue_reg(struct gendisk *disk)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun device_add_disk_no_queue_reg(NULL, disk);
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun extern void del_gendisk(struct gendisk *gp);
319*4882a593Smuzhiyun extern struct gendisk *get_gendisk(dev_t dev, int *partno);
320*4882a593Smuzhiyun extern struct block_device *bdget_disk(struct gendisk *disk, int partno);
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun extern void set_device_ro(struct block_device *bdev, int flag);
323*4882a593Smuzhiyun extern void set_disk_ro(struct gendisk *disk, int flag);
324*4882a593Smuzhiyun
get_disk_ro(struct gendisk * disk)325*4882a593Smuzhiyun static inline int get_disk_ro(struct gendisk *disk)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun return disk->part0.policy;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun extern void disk_block_events(struct gendisk *disk);
331*4882a593Smuzhiyun extern void disk_unblock_events(struct gendisk *disk);
332*4882a593Smuzhiyun extern void disk_flush_events(struct gendisk *disk, unsigned int mask);
333*4882a593Smuzhiyun bool set_capacity_revalidate_and_notify(struct gendisk *disk, sector_t size,
334*4882a593Smuzhiyun bool update_bdev);
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /* drivers/char/random.c */
337*4882a593Smuzhiyun extern void add_disk_randomness(struct gendisk *disk) __latent_entropy;
338*4882a593Smuzhiyun extern void rand_initialize_disk(struct gendisk *disk);
339*4882a593Smuzhiyun
get_start_sect(struct block_device * bdev)340*4882a593Smuzhiyun static inline sector_t get_start_sect(struct block_device *bdev)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun return bdev->bd_part->start_sect;
343*4882a593Smuzhiyun }
get_capacity(struct gendisk * disk)344*4882a593Smuzhiyun static inline sector_t get_capacity(struct gendisk *disk)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun return disk->part0.nr_sects;
347*4882a593Smuzhiyun }
set_capacity(struct gendisk * disk,sector_t size)348*4882a593Smuzhiyun static inline void set_capacity(struct gendisk *disk, sector_t size)
349*4882a593Smuzhiyun {
350*4882a593Smuzhiyun disk->part0.nr_sects = size;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun int bdev_disk_changed(struct block_device *bdev, bool invalidate);
354*4882a593Smuzhiyun int blk_add_partitions(struct gendisk *disk, struct block_device *bdev);
355*4882a593Smuzhiyun int blk_drop_partitions(struct block_device *bdev);
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun extern struct gendisk *__alloc_disk_node(int minors, int node_id);
358*4882a593Smuzhiyun extern struct kobject *get_disk_and_module(struct gendisk *disk);
359*4882a593Smuzhiyun extern void put_disk(struct gendisk *disk);
360*4882a593Smuzhiyun extern void put_disk_and_module(struct gendisk *disk);
361*4882a593Smuzhiyun extern void blk_register_region(dev_t devt, unsigned long range,
362*4882a593Smuzhiyun struct module *module,
363*4882a593Smuzhiyun struct kobject *(*probe)(dev_t, int *, void *),
364*4882a593Smuzhiyun int (*lock)(dev_t, void *),
365*4882a593Smuzhiyun void *data);
366*4882a593Smuzhiyun extern void blk_unregister_region(dev_t devt, unsigned long range);
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun #define alloc_disk_node(minors, node_id) \
369*4882a593Smuzhiyun ({ \
370*4882a593Smuzhiyun static struct lock_class_key __key; \
371*4882a593Smuzhiyun const char *__name; \
372*4882a593Smuzhiyun struct gendisk *__disk; \
373*4882a593Smuzhiyun \
374*4882a593Smuzhiyun __name = "(gendisk_completion)"#minors"("#node_id")"; \
375*4882a593Smuzhiyun \
376*4882a593Smuzhiyun __disk = __alloc_disk_node(minors, node_id); \
377*4882a593Smuzhiyun \
378*4882a593Smuzhiyun if (__disk) \
379*4882a593Smuzhiyun lockdep_init_map(&__disk->lockdep_map, __name, &__key, 0); \
380*4882a593Smuzhiyun \
381*4882a593Smuzhiyun __disk; \
382*4882a593Smuzhiyun })
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun #define alloc_disk(minors) alloc_disk_node(minors, NUMA_NO_NODE)
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun int register_blkdev(unsigned int major, const char *name);
387*4882a593Smuzhiyun void unregister_blkdev(unsigned int major, const char *name);
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun void revalidate_disk_size(struct gendisk *disk, bool verbose);
390*4882a593Smuzhiyun bool bdev_check_media_change(struct block_device *bdev);
391*4882a593Smuzhiyun int __invalidate_device(struct block_device *bdev, bool kill_dirty);
392*4882a593Smuzhiyun void bd_set_nr_sectors(struct block_device *bdev, sector_t sectors);
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun /* for drivers/char/raw.c: */
395*4882a593Smuzhiyun int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long);
396*4882a593Smuzhiyun long compat_blkdev_ioctl(struct file *, unsigned, unsigned long);
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun #ifdef CONFIG_SYSFS
399*4882a593Smuzhiyun int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk);
400*4882a593Smuzhiyun void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk);
401*4882a593Smuzhiyun #else
bd_link_disk_holder(struct block_device * bdev,struct gendisk * disk)402*4882a593Smuzhiyun static inline int bd_link_disk_holder(struct block_device *bdev,
403*4882a593Smuzhiyun struct gendisk *disk)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun return 0;
406*4882a593Smuzhiyun }
bd_unlink_disk_holder(struct block_device * bdev,struct gendisk * disk)407*4882a593Smuzhiyun static inline void bd_unlink_disk_holder(struct block_device *bdev,
408*4882a593Smuzhiyun struct gendisk *disk)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun #endif /* CONFIG_SYSFS */
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun #ifdef CONFIG_BLOCK
414*4882a593Smuzhiyun void printk_all_partitions(void);
415*4882a593Smuzhiyun dev_t blk_lookup_devt(const char *name, int partno);
416*4882a593Smuzhiyun #else /* CONFIG_BLOCK */
printk_all_partitions(void)417*4882a593Smuzhiyun static inline void printk_all_partitions(void)
418*4882a593Smuzhiyun {
419*4882a593Smuzhiyun }
blk_lookup_devt(const char * name,int partno)420*4882a593Smuzhiyun static inline dev_t blk_lookup_devt(const char *name, int partno)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun dev_t devt = MKDEV(0, 0);
423*4882a593Smuzhiyun return devt;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun #endif /* CONFIG_BLOCK */
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun #endif /* _LINUX_GENHD_H */
428