Blame view
include/linux/genhd.h
22.4 KB
b24413180 License cleanup: ... |
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 6 7 8 9 10 11 |
#ifndef _LINUX_GENHD_H #define _LINUX_GENHD_H /* * genhd.h Copyright (C) 1992 Drew Eckhardt * Generic hard disk header file by * Drew Eckhardt * * <drew@colorado.edu> */ |
1da177e4c Linux-2.6.12-rc2 |
12 |
#include <linux/types.h> |
edfaa7c36 Driver core: conv... |
13 |
#include <linux/kdev_t.h> |
e71bf0d0e block: fix disk->... |
14 |
#include <linux/rcupdate.h> |
6d1d8050b block, partition:... |
15 |
#include <linux/slab.h> |
6c71013ec block: partition:... |
16 |
#include <linux/percpu-refcount.h> |
635797857 include/linux/gen... |
17 |
#include <linux/uuid.h> |
1da177e4c Linux-2.6.12-rc2 |
18 |
|
9361401eb [PATCH] BLOCK: Ma... |
19 |
#ifdef CONFIG_BLOCK |
548b10eb2 block: move __dev... |
20 |
#define dev_to_disk(device) container_of((device), struct gendisk, part0.__dev) |
ed9e19823 block: implement ... |
21 |
#define dev_to_part(device) container_of((device), struct hd_struct, __dev) |
548b10eb2 block: move __dev... |
22 |
#define disk_to_dev(disk) (&(disk)->part0.__dev) |
ed9e19823 block: implement ... |
23 |
#define part_to_dev(part) (&((part)->__dev)) |
edfaa7c36 Driver core: conv... |
24 |
|
edfaa7c36 Driver core: conv... |
25 26 27 |
extern struct device_type part_type; extern struct kobject *block_depr; extern struct class block_class; |
1da177e4c Linux-2.6.12-rc2 |
28 29 30 31 32 33 |
enum { /* These three have identical behaviour; use the second one if DOS FDISK gets confused about extended/logical partitions starting past cylinder 1023. */ DOS_EXTENDED_PARTITION = 5, LINUX_EXTENDED_PARTITION = 0x85, WIN98_EXTENDED_PARTITION = 0x0f, |
d18d7682c [PARTITION]: Add ... |
34 |
SUN_WHOLE_DISK = DOS_EXTENDED_PARTITION, |
1da177e4c Linux-2.6.12-rc2 |
35 |
LINUX_SWAP_PARTITION = 0x82, |
4419d1ac7 [PATCH] relax che... |
36 37 |
LINUX_DATA_PARTITION = 0x83, LINUX_LVM_PARTITION = 0x8e, |
1da177e4c Linux-2.6.12-rc2 |
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */ SOLARIS_X86_PARTITION = LINUX_SWAP_PARTITION, NEW_SOLARIS_X86_PARTITION = 0xbf, DM6_AUX1PARTITION = 0x51, /* no DDO: use xlated geom */ DM6_AUX3PARTITION = 0x53, /* no DDO: use xlated geom */ DM6_PARTITION = 0x54, /* has DDO: use xlated geom & offset */ EZD_PARTITION = 0x55, /* EZ-DRIVE */ FREEBSD_PARTITION = 0xa5, /* FreeBSD Partition ID */ OPENBSD_PARTITION = 0xa6, /* OpenBSD Partition ID */ NETBSD_PARTITION = 0xa9, /* NetBSD Partition ID */ BSDI_PARTITION = 0xb7, /* BSDI Partition ID */ MINIX_PARTITION = 0x81, /* Minix Partition ID */ UNIXWARE_PARTITION = 0x63, /* Same as GNU_HURD and SCO Unix */ }; |
689d6fac4 block: replace @e... |
55 |
#define DISK_MAX_PARTS 256 |
3e1a7ff8a block: allow disk... |
56 |
#define DISK_NAME_LEN 32 |
689d6fac4 block: replace @e... |
57 |
|
34186efc1 Include various p... |
58 59 60 61 62 |
#include <linux/major.h> #include <linux/device.h> #include <linux/smp.h> #include <linux/string.h> #include <linux/fs.h> |
8ce7ad7b2 genhd: send async... |
63 |
#include <linux/workqueue.h> |
34186efc1 Include various p... |
64 |
|
1da177e4c Linux-2.6.12-rc2 |
65 66 67 68 69 70 71 72 73 74 75 76 |
struct partition { unsigned char boot_ind; /* 0x80 - active */ unsigned char head; /* starting head */ unsigned char sector; /* starting sector */ unsigned char cyl; /* starting cylinder */ unsigned char sys_ind; /* What partition type */ unsigned char end_head; /* end head */ unsigned char end_sector; /* end sector */ unsigned char end_cyl; /* end cylinder */ __le32 start_sect; /* starting sector counting from 0 */ __le32 nr_sects; /* nr of sectors in partition */ } __attribute__((packed)); |
ea5c48ab2 Enhanced partitio... |
77 78 79 80 81 82 83 84 |
struct disk_stats { unsigned long sectors[2]; /* READs and WRITEs */ unsigned long ios[2]; unsigned long merges[2]; unsigned long ticks[2]; unsigned long io_ticks; unsigned long time_in_queue; }; |
6d1d8050b block, partition:... |
85 86 |
#define PARTITION_META_INFO_VOLNAMELTH 64 |
1ad7e8994 block: store part... |
87 88 89 90 |
/* * Enough for the string representation of any kind of UUID plus NULL. * EFI UUID is 36 characters. MSDOS UUID is 11 characters. */ |
635797857 include/linux/gen... |
91 |
#define PARTITION_META_INFO_UUIDLTH (UUID_STRING_LEN + 1) |
6d1d8050b block, partition:... |
92 93 |
struct partition_meta_info { |
1ad7e8994 block: store part... |
94 |
char uuid[PARTITION_META_INFO_UUIDLTH]; |
6d1d8050b block, partition:... |
95 96 |
u8 volname[PARTITION_META_INFO_VOLNAMELTH]; }; |
1da177e4c Linux-2.6.12-rc2 |
97 98 |
struct hd_struct { sector_t start_sect; |
c83f6bf98 block: add partit... |
99 100 101 102 103 |
/* * nr_sects is protected by sequence counter. One might extend a * partition while IO is happening to it and update of nr_sects * can be non-atomic on 32bit machines with 64bit sector_t. */ |
1da177e4c Linux-2.6.12-rc2 |
104 |
sector_t nr_sects; |
c83f6bf98 block: add partit... |
105 |
seqcount_t nr_sects_seq; |
c72758f33 block: Export I/O... |
106 |
sector_t alignment_offset; |
a1706ac4c Revert "block: Re... |
107 |
unsigned int discard_alignment; |
ed9e19823 block: implement ... |
108 |
struct device __dev; |
6a4d44c1f [PATCH] dm/md dep... |
109 |
struct kobject *holder_dir; |
1da177e4c Linux-2.6.12-rc2 |
110 |
int policy, partno; |
6d1d8050b block, partition:... |
111 |
struct partition_meta_info *info; |
c17bb4951 [PATCH] fault-inj... |
112 113 114 |
#ifdef CONFIG_FAIL_MAKE_REQUEST int make_it_fail; #endif |
ea5c48ab2 Enhanced partitio... |
115 |
unsigned long stamp; |
1e9bb8808 block: fix non-at... |
116 |
atomic_t in_flight[2]; |
ea5c48ab2 Enhanced partitio... |
117 |
#ifdef CONFIG_SMP |
43cf38eb5 percpu: add __per... |
118 |
struct disk_stats __percpu *dkstats; |
ea5c48ab2 Enhanced partitio... |
119 120 121 |
#else struct disk_stats dkstats; #endif |
6c71013ec block: partition:... |
122 |
struct percpu_ref ref; |
e71bf0d0e block: fix disk->... |
123 |
struct rcu_head rcu_head; |
1da177e4c Linux-2.6.12-rc2 |
124 125 126 |
}; #define GENHD_FL_REMOVABLE 1 |
97fedbbe1 Remove GENHD_FL_D... |
127 |
/* 2 is unused */ |
86ce18d7b genhd: expose AN ... |
128 |
#define GENHD_FL_MEDIA_CHANGE_NOTIFY 4 |
1da177e4c Linux-2.6.12-rc2 |
129 130 131 |
#define GENHD_FL_CD 8 #define GENHD_FL_UP 16 #define GENHD_FL_SUPPRESS_PARTITION_INFO 32 |
689d6fac4 block: replace @e... |
132 |
#define GENHD_FL_EXT_DEVT 64 /* allow extended devt */ |
db429e9ec partitions: add -... |
133 |
#define GENHD_FL_NATIVE_CAPACITY 128 |
d4dc210f6 block: don't bloc... |
134 |
#define GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE 256 |
d27769ec3 block: add GENHD_... |
135 |
#define GENHD_FL_NO_PART_SCAN 512 |
7a56fe8e2 block: introduce ... |
136 |
#define GENHD_FL_HIDDEN 1024 |
1da177e4c Linux-2.6.12-rc2 |
137 |
|
77ea887e4 implement in-kern... |
138 139 140 141 |
enum { DISK_EVENT_MEDIA_CHANGE = 1 << 0, /* media changed */ DISK_EVENT_EJECT_REQUEST = 1 << 1, /* eject requested */ }; |
540eed563 block: make parti... |
142 143 144 |
struct disk_part_tbl { struct rcu_head rcu_head; int len; |
4d2deb40b kernel: __rcu ann... |
145 146 |
struct hd_struct __rcu *last_lookup; struct hd_struct __rcu *part[]; |
540eed563 block: make parti... |
147 |
}; |
77ea887e4 implement in-kern... |
148 |
struct disk_events; |
99e6608c9 block: Add badblo... |
149 |
struct badblocks; |
77ea887e4 implement in-kern... |
150 |
|
25520d55c block: Inline blk... |
151 152 153 |
#if defined(CONFIG_BLK_DEV_INTEGRITY) struct blk_integrity { |
869ab90f0 block: constify s... |
154 155 156 157 158 |
const struct blk_integrity_profile *profile; unsigned char flags; unsigned char tuple_size; unsigned char interval_exp; unsigned char tag_size; |
25520d55c block: Inline blk... |
159 160 161 |
}; #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
1da177e4c Linux-2.6.12-rc2 |
162 |
struct gendisk { |
689d6fac4 block: replace @e... |
163 164 |
/* major, first_minor and minors are input parameters only, * don't use directly. Use disk_devt() and disk_max_parts(). |
f331c0296 block: don't depe... |
165 |
*/ |
1da177e4c Linux-2.6.12-rc2 |
166 167 168 169 |
int major; /* major number of driver */ int first_minor; int minors; /* maximum number of minors, =1 for * disks that can't be partitioned. */ |
f331c0296 block: don't depe... |
170 |
|
3e1a7ff8a block: allow disk... |
171 |
char disk_name[DISK_NAME_LEN]; /* name of major driver */ |
2c9ede55e switch device_get... |
172 |
char *(*devnode)(struct gendisk *gd, umode_t *mode); |
77ea887e4 implement in-kern... |
173 174 175 |
unsigned int events; /* supported events */ unsigned int async_events; /* async events, subset of all */ |
b5d0b9df0 block: introduce ... |
176 |
/* Array of pointers to partitions indexed by partno. |
e71bf0d0e block: fix disk->... |
177 178 179 180 |
* Protected with matching bdev lock but stat and other * non-critical accesses use RCU. Always access through * helpers. */ |
4d2deb40b kernel: __rcu ann... |
181 |
struct disk_part_tbl __rcu *part_tbl; |
b5d0b9df0 block: introduce ... |
182 |
struct hd_struct part0; |
e71bf0d0e block: fix disk->... |
183 |
|
83d5cde47 const: make block... |
184 |
const struct block_device_operations *fops; |
1da177e4c Linux-2.6.12-rc2 |
185 186 |
struct request_queue *queue; void *private_data; |
1da177e4c Linux-2.6.12-rc2 |
187 188 |
int flags; |
6a4d44c1f [PATCH] dm/md dep... |
189 |
struct kobject *slave_dir; |
1da177e4c Linux-2.6.12-rc2 |
190 191 |
struct timer_rand_state *random; |
1da177e4c Linux-2.6.12-rc2 |
192 |
atomic_t sync_io; /* RAID */ |
77ea887e4 implement in-kern... |
193 |
struct disk_events *ev; |
7ba1ba12e block: Block laye... |
194 |
#ifdef CONFIG_BLK_DEV_INTEGRITY |
aff34e192 block: Move integ... |
195 |
struct kobject integrity_kobj; |
25520d55c block: Inline blk... |
196 |
#endif /* CONFIG_BLK_DEV_INTEGRITY */ |
540eed563 block: make parti... |
197 |
int node_id; |
99e6608c9 block: Add badblo... |
198 |
struct badblocks *bb; |
1da177e4c Linux-2.6.12-rc2 |
199 |
}; |
310a2c101 block: misc updates |
200 201 |
static inline struct gendisk *part_to_disk(struct hd_struct *part) { |
548b10eb2 block: move __dev... |
202 203 204 205 206 207 |
if (likely(part)) { if (part->partno) return dev_to_disk(part_to_dev(part)->parent); else return dev_to_disk(part_to_dev(part)); } |
310a2c101 block: misc updates |
208 209 |
return NULL; } |
f331c0296 block: don't depe... |
210 211 |
static inline int disk_max_parts(struct gendisk *disk) { |
689d6fac4 block: replace @e... |
212 213 214 |
if (disk->flags & GENHD_FL_EXT_DEVT) return DISK_MAX_PARTS; return disk->minors; |
b5d0b9df0 block: introduce ... |
215 |
} |
d27769ec3 block: add GENHD_... |
216 |
static inline bool disk_part_scan_enabled(struct gendisk *disk) |
b5d0b9df0 block: introduce ... |
217 |
{ |
d27769ec3 block: add GENHD_... |
218 219 |
return disk_max_parts(disk) > 1 && !(disk->flags & GENHD_FL_NO_PART_SCAN); |
f331c0296 block: don't depe... |
220 221 222 223 |
} static inline dev_t disk_devt(struct gendisk *disk) { |
bece506fe block: don't look... |
224 |
return MKDEV(disk->major, disk->first_minor); |
f331c0296 block: don't depe... |
225 226 227 228 |
} static inline dev_t part_devt(struct hd_struct *part) { |
ed9e19823 block: implement ... |
229 |
return part_to_dev(part)->devt; |
f331c0296 block: don't depe... |
230 |
} |
5c21c3dde fs: guard_bio_eod... |
231 |
extern struct hd_struct *__disk_get_part(struct gendisk *disk, int partno); |
e71bf0d0e block: fix disk->... |
232 233 234 235 236 |
extern struct hd_struct *disk_get_part(struct gendisk *disk, int partno); static inline void disk_put_part(struct hd_struct *part) { if (likely(part)) |
ed9e19823 block: implement ... |
237 |
put_device(part_to_dev(part)); |
e71bf0d0e block: fix disk->... |
238 239 240 241 242 243 244 |
} /* * Smarter partition iterator without context limits. */ #define DISK_PITER_REVERSE (1 << 0) /* iterate in the reverse direction */ #define DISK_PITER_INCL_EMPTY (1 << 1) /* include 0-sized parts */ |
b5d0b9df0 block: introduce ... |
245 |
#define DISK_PITER_INCL_PART0 (1 << 2) /* include partition 0 */ |
71982a409 block: include em... |
246 |
#define DISK_PITER_INCL_EMPTY_PART0 (1 << 3) /* include empty partition 0 */ |
e71bf0d0e block: fix disk->... |
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
struct disk_part_iter { struct gendisk *disk; struct hd_struct *part; int idx; unsigned int flags; }; extern void disk_part_iter_init(struct disk_part_iter *piter, struct gendisk *disk, unsigned int flags); extern struct hd_struct *disk_part_iter_next(struct disk_part_iter *piter); extern void disk_part_iter_exit(struct disk_part_iter *piter); extern struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector); |
c99590591 block: fix diskst... |
262 |
/* |
1da177e4c Linux-2.6.12-rc2 |
263 264 |
* Macros to operate on percpu disk statistics: * |
c99590591 block: fix diskst... |
265 266 267 268 269 270 271 272 |
* {disk|part|all}_stat_{add|sub|inc|dec}() modify the stat counters * and should be called between disk_stat_lock() and * disk_stat_unlock(). * * part_stat_read() can be called at any time. * * part_stat_{add|set_all}() and {init|free}_part_stats are for * internal use only. |
1da177e4c Linux-2.6.12-rc2 |
273 274 |
*/ #ifdef CONFIG_SMP |
074a7aca7 block: move stats... |
275 276 |
#define part_stat_lock() ({ rcu_read_lock(); get_cpu(); }) #define part_stat_unlock() do { put_cpu(); rcu_read_unlock(); } while (0) |
ea5c48ab2 Enhanced partitio... |
277 |
|
074a7aca7 block: move stats... |
278 279 |
#define __part_stat_add(cpu, part, field, addnd) \ (per_cpu_ptr((part)->dkstats, (cpu))->field += (addnd)) |
ea5c48ab2 Enhanced partitio... |
280 281 282 |
#define part_stat_read(part, field) \ ({ \ |
074a7aca7 block: move stats... |
283 |
typeof((part)->dkstats->field) res = 0; \ |
7af92f875 genhd: overlappin... |
284 285 286 |
unsigned int _cpu; \ for_each_possible_cpu(_cpu) \ res += per_cpu_ptr((part)->dkstats, _cpu)->field; \ |
ea5c48ab2 Enhanced partitio... |
287 288 |
res; \ }) |
28f13702f block: avoid dupl... |
289 290 |
static inline void part_stat_set_all(struct hd_struct *part, int value) { |
ea5c48ab2 Enhanced partitio... |
291 |
int i; |
28f13702f block: avoid dupl... |
292 |
|
ea5c48ab2 Enhanced partitio... |
293 294 |
for_each_possible_cpu(i) memset(per_cpu_ptr(part->dkstats, i), value, |
28f13702f block: avoid dupl... |
295 |
sizeof(struct disk_stats)); |
ea5c48ab2 Enhanced partitio... |
296 |
} |
c99590591 block: fix diskst... |
297 |
|
074a7aca7 block: move stats... |
298 |
static inline int init_part_stats(struct hd_struct *part) |
ea5c48ab2 Enhanced partitio... |
299 |
{ |
074a7aca7 block: move stats... |
300 301 302 303 |
part->dkstats = alloc_percpu(struct disk_stats); if (!part->dkstats) return 0; return 1; |
1da177e4c Linux-2.6.12-rc2 |
304 |
} |
ea5c48ab2 Enhanced partitio... |
305 |
|
074a7aca7 block: move stats... |
306 |
static inline void free_part_stats(struct hd_struct *part) |
ea5c48ab2 Enhanced partitio... |
307 |
{ |
074a7aca7 block: move stats... |
308 |
free_percpu(part->dkstats); |
ea5c48ab2 Enhanced partitio... |
309 |
} |
074a7aca7 block: move stats... |
310 311 312 |
#else /* !CONFIG_SMP */ #define part_stat_lock() ({ rcu_read_lock(); 0; }) #define part_stat_unlock() rcu_read_unlock() |
c99590591 block: fix diskst... |
313 |
|
074a7aca7 block: move stats... |
314 315 |
#define __part_stat_add(cpu, part, field, addnd) \ ((part)->dkstats.field += addnd) |
1da177e4c Linux-2.6.12-rc2 |
316 |
|
074a7aca7 block: move stats... |
317 |
#define part_stat_read(part, field) ((part)->dkstats.field) |
1da177e4c Linux-2.6.12-rc2 |
318 |
|
074a7aca7 block: move stats... |
319 |
static inline void part_stat_set_all(struct hd_struct *part, int value) |
1da177e4c Linux-2.6.12-rc2 |
320 |
{ |
074a7aca7 block: move stats... |
321 |
memset(&part->dkstats, value, sizeof(struct disk_stats)); |
1da177e4c Linux-2.6.12-rc2 |
322 |
} |
ea5c48ab2 Enhanced partitio... |
323 324 325 |
static inline int init_part_stats(struct hd_struct *part) { |
ea5c48ab2 Enhanced partitio... |
326 327 328 329 330 |
return 1; } static inline void free_part_stats(struct hd_struct *part) { |
ea5c48ab2 Enhanced partitio... |
331 |
} |
074a7aca7 block: move stats... |
332 |
#endif /* CONFIG_SMP */ |
1da177e4c Linux-2.6.12-rc2 |
333 |
|
074a7aca7 block: move stats... |
334 335 336 337 338 339 |
#define part_stat_add(cpu, part, field, addnd) do { \ __part_stat_add((cpu), (part), field, addnd); \ if ((part)->partno) \ __part_stat_add((cpu), &part_to_disk((part))->part0, \ field, addnd); \ } while (0) |
ea5c48ab2 Enhanced partitio... |
340 |
|
074a7aca7 block: move stats... |
341 342 343 344 345 346 |
#define part_stat_dec(cpu, gendiskp, field) \ part_stat_add(cpu, gendiskp, field, -1) #define part_stat_inc(cpu, gendiskp, field) \ part_stat_add(cpu, gendiskp, field, 1) #define part_stat_sub(cpu, gendiskp, field, subnd) \ part_stat_add(cpu, gendiskp, field, -subnd) |
f299b7c7a blk-mq: provide i... |
347 |
void part_in_flight(struct request_queue *q, struct hd_struct *part, |
06beec871 blk-mq: fix sysfs... |
348 349 350 |
unsigned int inflight[2]); void part_in_flight_rw(struct request_queue *q, struct hd_struct *part, unsigned int inflight[2]); |
f299b7c7a blk-mq: provide i... |
351 352 353 354 |
void part_dec_in_flight(struct request_queue *q, struct hd_struct *part, int rw); void part_inc_in_flight(struct request_queue *q, struct hd_struct *part, int rw); |
1da177e4c Linux-2.6.12-rc2 |
355 |
|
6d1d8050b block, partition:... |
356 357 358 359 360 361 362 363 364 365 366 367 |
static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk) { if (disk) return kzalloc_node(sizeof(struct partition_meta_info), GFP_KERNEL, disk->node_id); return kzalloc(sizeof(struct partition_meta_info), GFP_KERNEL); } static inline void free_part_info(struct hd_struct *part) { kfree(part->info); } |
d39922864 block: genhd.h cl... |
368 |
/* block/blk-core.c */ |
d62e26b3f block: pass in qu... |
369 |
extern void part_round_stats(struct request_queue *q, int cpu, struct hd_struct *part); |
1da177e4c Linux-2.6.12-rc2 |
370 |
|
32ca163c9 block: genhd.h co... |
371 |
/* block/genhd.c */ |
e63a46bef block: introduce ... |
372 373 374 |
extern void device_add_disk(struct device *parent, struct gendisk *disk); static inline void add_disk(struct gendisk *disk) { |
52c44d93c block: remove ->d... |
375 |
device_add_disk(NULL, disk); |
e63a46bef block: introduce ... |
376 |
} |
f5ff07043 block: allow gend... |
377 378 379 380 381 |
extern void device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk); static inline void add_disk_no_queue_reg(struct gendisk *disk) { device_add_disk_no_queue_reg(NULL, disk); } |
e63a46bef block: introduce ... |
382 |
|
1da177e4c Linux-2.6.12-rc2 |
383 |
extern void del_gendisk(struct gendisk *gp); |
cf771cb5a block: make varia... |
384 |
extern struct gendisk *get_gendisk(dev_t dev, int *partno); |
f331c0296 block: don't depe... |
385 |
extern struct block_device *bdget_disk(struct gendisk *disk, int partno); |
1da177e4c Linux-2.6.12-rc2 |
386 387 388 |
extern void set_device_ro(struct block_device *bdev, int flag); extern void set_disk_ro(struct gendisk *disk, int flag); |
b7db9956e block: move polic... |
389 390 391 392 |
static inline int get_disk_ro(struct gendisk *disk) { return disk->part0.policy; } |
77ea887e4 implement in-kern... |
393 394 |
extern void disk_block_events(struct gendisk *disk); extern void disk_unblock_events(struct gendisk *disk); |
85ef06d1d block: flush MEDI... |
395 |
extern void disk_flush_events(struct gendisk *disk, unsigned int mask); |
77ea887e4 implement in-kern... |
396 |
extern unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask); |
1da177e4c Linux-2.6.12-rc2 |
397 |
/* drivers/char/random.c */ |
0766f788e latent_entropy: M... |
398 |
extern void add_disk_randomness(struct gendisk *disk) __latent_entropy; |
1da177e4c Linux-2.6.12-rc2 |
399 400 401 402 |
extern void rand_initialize_disk(struct gendisk *disk); static inline sector_t get_start_sect(struct block_device *bdev) { |
0762b8bde block: always set... |
403 |
return bdev->bd_part->start_sect; |
1da177e4c Linux-2.6.12-rc2 |
404 405 406 |
} static inline sector_t get_capacity(struct gendisk *disk) { |
80795aefb block: move capac... |
407 |
return disk->part0.nr_sects; |
1da177e4c Linux-2.6.12-rc2 |
408 409 410 |
} static inline void set_capacity(struct gendisk *disk, sector_t size) { |
80795aefb block: move capac... |
411 |
disk->part0.nr_sects = size; |
1da177e4c Linux-2.6.12-rc2 |
412 |
} |
1da177e4c Linux-2.6.12-rc2 |
413 |
#ifdef CONFIG_SOLARIS_X86_PARTITION |
b84d87963 [PARTITION] MSDOS... |
414 |
#define SOLARIS_X86_NUMSLICE 16 |
1da177e4c Linux-2.6.12-rc2 |
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 |
#define SOLARIS_X86_VTOC_SANE (0x600DDEEEUL) struct solaris_x86_slice { __le16 s_tag; /* ID tag of partition */ __le16 s_flag; /* permission flags */ __le32 s_start; /* start sector no of partition */ __le32 s_size; /* # of blocks in partition */ }; struct solaris_x86_vtoc { unsigned int v_bootinfo[3]; /* info needed by mboot (unsupported) */ __le32 v_sanity; /* to verify vtoc sanity */ __le32 v_version; /* layout version */ char v_volume[8]; /* volume name */ __le16 v_sectorsz; /* sector size in bytes */ __le16 v_nparts; /* number of partitions */ unsigned int v_reserved[10]; /* free space */ struct solaris_x86_slice v_slice[SOLARIS_X86_NUMSLICE]; /* slice headers */ unsigned int timestamp[SOLARIS_X86_NUMSLICE]; /* timestamp (unsupported) */ char v_asciilabel[128]; /* for compatibility */ }; #endif /* CONFIG_SOLARIS_X86_PARTITION */ #ifdef CONFIG_BSD_DISKLABEL /* * BSD disklabel support by Yossi Gottlieb <yogo@math.tau.ac.il> * updated by Marc Espie <Marc.Espie@openbsd.org> */ /* check against BSD src/sys/sys/disklabel.h for consistency */ #define BSD_DISKMAGIC (0x82564557UL) /* The disk magic number */ #define BSD_MAXPARTITIONS 16 #define OPENBSD_MAXPARTITIONS 16 #define BSD_FS_UNUSED 0 /* disklabel unused partition entry ID */ struct bsd_disklabel { __le32 d_magic; /* the magic number */ __s16 d_type; /* drive type */ __s16 d_subtype; /* controller/d_type specific */ char d_typename[16]; /* type name, e.g. "eagle" */ char d_packname[16]; /* pack identifier */ __u32 d_secsize; /* # of bytes per sector */ __u32 d_nsectors; /* # of data sectors per track */ __u32 d_ntracks; /* # of tracks per cylinder */ __u32 d_ncylinders; /* # of data cylinders per unit */ __u32 d_secpercyl; /* # of data sectors per cylinder */ __u32 d_secperunit; /* # of data sectors per unit */ __u16 d_sparespertrack; /* # of spare sectors per track */ __u16 d_sparespercyl; /* # of spare sectors per cylinder */ __u32 d_acylinders; /* # of alt. cylinders per unit */ __u16 d_rpm; /* rotational speed */ __u16 d_interleave; /* hardware sector interleave */ __u16 d_trackskew; /* sector 0 skew, per track */ __u16 d_cylskew; /* sector 0 skew, per cylinder */ __u32 d_headswitch; /* head switch time, usec */ __u32 d_trkseek; /* track-to-track seek, usec */ __u32 d_flags; /* generic flags */ #define NDDATA 5 __u32 d_drivedata[NDDATA]; /* drive-type specific information */ #define NSPARE 5 __u32 d_spare[NSPARE]; /* reserved for future use */ __le32 d_magic2; /* the magic number (again) */ __le16 d_checksum; /* xor of data incl. partitions */ /* filesystem and partition information: */ __le16 d_npartitions; /* number of partitions in following */ __le32 d_bbsize; /* size of boot area at sn0, bytes */ __le32 d_sbsize; /* max size of fs superblock, bytes */ struct bsd_partition { /* the partition table */ __le32 p_size; /* number of sectors in partition */ __le32 p_offset; /* starting sector */ __le32 p_fsize; /* filesystem basic fragment size */ __u8 p_fstype; /* filesystem type, see below */ __u8 p_frag; /* filesystem fragments per block */ __le16 p_cpg; /* filesystem cylinders per group */ } d_partitions[BSD_MAXPARTITIONS]; /* actually may be more */ }; #endif /* CONFIG_BSD_DISKLABEL */ #ifdef CONFIG_UNIXWARE_DISKLABEL /* * Unixware slices support by Andrzej Krzysztofowicz <ankry@mif.pg.gda.pl> * and Krzysztof G. Baranowski <kgb@knm.org.pl> */ #define UNIXWARE_DISKMAGIC (0xCA5E600DUL) /* The disk magic number */ #define UNIXWARE_DISKMAGIC2 (0x600DDEEEUL) /* The slice table magic nr */ #define UNIXWARE_NUMSLICE 16 #define UNIXWARE_FS_UNUSED 0 /* Unused slice entry ID */ struct unixware_slice { __le16 s_label; /* label */ __le16 s_flags; /* permission flags */ __le32 start_sect; /* starting sector */ __le32 nr_sects; /* number of sectors in slice */ }; struct unixware_disklabel { __le32 d_type; /* drive type */ __le32 d_magic; /* the magic number */ __le32 d_version; /* version number */ char d_serial[12]; /* serial number of the device */ __le32 d_ncylinders; /* # of data cylinders per device */ __le32 d_ntracks; /* # of tracks per cylinder */ __le32 d_nsectors; /* # of data sectors per track */ __le32 d_secsize; /* # of bytes per sector */ __le32 d_part_start; /* # of first sector of this partition */ __le32 d_unknown1[12]; /* ? */ __le32 d_alt_tbl; /* byte offset of alternate table */ __le32 d_alt_len; /* byte length of alternate table */ __le32 d_phys_cyl; /* # of physical cylinders per device */ __le32 d_phys_trk; /* # of physical tracks per cylinder */ __le32 d_phys_sec; /* # of physical sectors per track */ __le32 d_phys_bytes; /* # of physical bytes per sector */ __le32 d_unknown2; /* ? */ __le32 d_unknown3; /* ? */ __le32 d_pad[8]; /* pad */ struct unixware_vtoc { __le32 v_magic; /* the magic number */ __le32 v_version; /* version number */ char v_name[8]; /* volume name */ __le16 v_nslices; /* # of slices */ __le16 v_unknown1; /* ? */ __le32 v_reserved[10]; /* reserved */ struct unixware_slice v_slice[UNIXWARE_NUMSLICE]; /* slice headers */ } vtoc; }; /* 408 */ #endif /* CONFIG_UNIXWARE_DISKLABEL */ #ifdef CONFIG_MINIX_SUBPARTITION # define MINIX_NR_SUBPARTITIONS 4 #endif /* CONFIG_MINIX_SUBPARTITION */ |
d18d7682c [PARTITION]: Add ... |
554 555 556 |
#define ADDPART_FLAG_NONE 0 #define ADDPART_FLAG_RAID 1 #define ADDPART_FLAG_WHOLEDISK 2 |
bcce3de1b block: implement ... |
557 558 |
extern int blk_alloc_devt(struct hd_struct *part, dev_t *devt); extern void blk_free_devt(dev_t devt); |
cf771cb5a block: make varia... |
559 560 |
extern dev_t blk_lookup_devt(const char *name, int partno); extern char *disk_name (struct gendisk *hd, int partno, char *buf); |
1da177e4c Linux-2.6.12-rc2 |
561 |
|
540eed563 block: make parti... |
562 |
extern int disk_expand_part_tbl(struct gendisk *disk, int target); |
1da177e4c Linux-2.6.12-rc2 |
563 |
extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); |
fe316bf2d block: Fix NULL p... |
564 |
extern int invalidate_partitions(struct gendisk *disk, struct block_device *bdev); |
ba32929a9 block: make add_p... |
565 566 |
extern struct hd_struct * __must_check add_partition(struct gendisk *disk, int partno, sector_t start, |
6d1d8050b block, partition:... |
567 568 569 |
sector_t len, int flags, struct partition_meta_info *info); |
6c71013ec block: partition:... |
570 |
extern void __delete_partition(struct percpu_ref *); |
1da177e4c Linux-2.6.12-rc2 |
571 |
extern void delete_partition(struct gendisk *, int); |
dd2a345f8 Display all possi... |
572 |
extern void printk_all_partitions(void); |
1da177e4c Linux-2.6.12-rc2 |
573 |
|
1946089a1 [PATCH] NUMA awar... |
574 |
extern struct gendisk *alloc_disk_node(int minors, int node_id); |
1da177e4c Linux-2.6.12-rc2 |
575 576 577 |
extern struct gendisk *alloc_disk(int minors); extern struct kobject *get_disk(struct gendisk *disk); extern void put_disk(struct gendisk *disk); |
edfaa7c36 Driver core: conv... |
578 |
extern void blk_register_region(dev_t devt, unsigned long range, |
1da177e4c Linux-2.6.12-rc2 |
579 580 581 582 |
struct module *module, struct kobject *(*probe)(dev_t, int *, void *), int (*lock)(dev_t, void *), void *data); |
edfaa7c36 Driver core: conv... |
583 |
extern void blk_unregister_region(dev_t devt, unsigned long range); |
1da177e4c Linux-2.6.12-rc2 |
584 |
|
e56105214 block: unify sysf... |
585 586 |
extern ssize_t part_size_show(struct device *dev, struct device_attribute *attr, char *buf); |
074a7aca7 block: move stats... |
587 588 |
extern ssize_t part_stat_show(struct device *dev, struct device_attribute *attr, char *buf); |
316d315bf block: Seperate r... |
589 590 |
extern ssize_t part_inflight_show(struct device *dev, struct device_attribute *attr, char *buf); |
eddb2e26b block: kill GENHD... |
591 592 593 594 595 596 597 |
#ifdef CONFIG_FAIL_MAKE_REQUEST extern ssize_t part_fail_show(struct device *dev, struct device_attribute *attr, char *buf); extern ssize_t part_fail_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); #endif /* CONFIG_FAIL_MAKE_REQUEST */ |
e56105214 block: unify sysf... |
598 |
|
6c71013ec block: partition:... |
599 |
static inline int hd_ref_init(struct hd_struct *part) |
6c23a9681 block: add intern... |
600 |
{ |
6c71013ec block: partition:... |
601 602 603 604 |
if (percpu_ref_init(&part->ref, __delete_partition, 0, GFP_KERNEL)) return -ENOMEM; return 0; |
6c23a9681 block: add intern... |
605 606 607 608 |
} static inline void hd_struct_get(struct hd_struct *part) { |
6c71013ec block: partition:... |
609 |
percpu_ref_get(&part->ref); |
6c23a9681 block: add intern... |
610 611 612 613 |
} static inline int hd_struct_try_get(struct hd_struct *part) { |
6c71013ec block: partition:... |
614 |
return percpu_ref_tryget_live(&part->ref); |
6c23a9681 block: add intern... |
615 616 617 618 |
} static inline void hd_struct_put(struct hd_struct *part) { |
6c71013ec block: partition:... |
619 620 621 622 623 624 |
percpu_ref_put(&part->ref); } static inline void hd_struct_kill(struct hd_struct *part) { percpu_ref_kill(&part->ref); |
6c23a9681 block: add intern... |
625 |
} |
b54e5ed8f block: partition:... |
626 627 628 629 |
static inline void hd_free_part(struct hd_struct *part) { free_part_stats(part); free_part_info(part); |
6c71013ec block: partition:... |
630 |
percpu_ref_exit(&part->ref); |
b54e5ed8f block: partition:... |
631 |
} |
c83f6bf98 block: add partit... |
632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 |
/* * Any access of part->nr_sects which is not protected by partition * bd_mutex or gendisk bdev bd_mutex, should be done using this * accessor function. * * Code written along the lines of i_size_read() and i_size_write(). * CONFIG_PREEMPT case optimizes the case of UP kernel with preemption * on. */ static inline sector_t part_nr_sects_read(struct hd_struct *part) { #if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) sector_t nr_sects; unsigned seq; do { seq = read_seqcount_begin(&part->nr_sects_seq); nr_sects = part->nr_sects; } while (read_seqcount_retry(&part->nr_sects_seq, seq)); return nr_sects; #elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) sector_t nr_sects; preempt_disable(); nr_sects = part->nr_sects; preempt_enable(); return nr_sects; #else return part->nr_sects; #endif } /* * Should be called with mutex lock held (typically bd_mutex) of partition * to provide mutual exlusion among writers otherwise seqcount might be * left in wrong state leaving the readers spinning infinitely. */ static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) { #if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) write_seqcount_begin(&part->nr_sects_seq); part->nr_sects = size; write_seqcount_end(&part->nr_sects_seq); #elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) preempt_disable(); part->nr_sects = size; preempt_enable(); #else part->nr_sects = size; #endif } |
25520d55c block: Inline blk... |
682 683 684 |
#if defined(CONFIG_BLK_DEV_INTEGRITY) extern void blk_integrity_add(struct gendisk *); extern void blk_integrity_del(struct gendisk *); |
25520d55c block: Inline blk... |
685 686 687 |
#else /* CONFIG_BLK_DEV_INTEGRITY */ static inline void blk_integrity_add(struct gendisk *disk) { } static inline void blk_integrity_del(struct gendisk *disk) { } |
25520d55c block: Inline blk... |
688 |
#endif /* CONFIG_BLK_DEV_INTEGRITY */ |
87c1efbfe Fix compile/link ... |
689 690 691 |
#else /* CONFIG_BLOCK */ static inline void printk_all_partitions(void) { } |
cf771cb5a block: make varia... |
692 |
static inline dev_t blk_lookup_devt(const char *name, int partno) |
edfaa7c36 Driver core: conv... |
693 694 695 696 |
{ dev_t devt = MKDEV(0, 0); return devt; } |
87c1efbfe Fix compile/link ... |
697 |
#endif /* CONFIG_BLOCK */ |
9361401eb [PATCH] BLOCK: Ma... |
698 |
|
a8ae50ba9 Remove <linux/gen... |
699 |
#endif /* _LINUX_GENHD_H */ |