xref: /OK3568_Linux_fs/kernel/include/linux/genhd.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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