Branch data Line data Source code
1 : : /*
2 : : * gendisk handling
3 : : */
4 : :
5 : : #include <linux/module.h>
6 : : #include <linux/fs.h>
7 : : #include <linux/genhd.h>
8 : : #include <linux/kdev_t.h>
9 : : #include <linux/kernel.h>
10 : : #include <linux/blkdev.h>
11 : : #include <linux/init.h>
12 : : #include <linux/spinlock.h>
13 : : #include <linux/proc_fs.h>
14 : : #include <linux/seq_file.h>
15 : : #include <linux/slab.h>
16 : : #include <linux/kmod.h>
17 : : #include <linux/kobj_map.h>
18 : : #include <linux/mutex.h>
19 : : #include <linux/idr.h>
20 : : #include <linux/log2.h>
21 : : #include <linux/pm_runtime.h>
22 : :
23 : : #include "blk.h"
24 : :
25 : : static DEFINE_MUTEX(block_class_lock);
26 : : struct kobject *block_depr;
27 : :
28 : : /* for extended dynamic devt allocation, currently only one major is used */
29 : : #define NR_EXT_DEVT (1 << MINORBITS)
30 : :
31 : : /* For extended devt allocation. ext_devt_mutex prevents look up
32 : : * results from going away underneath its user.
33 : : */
34 : : static DEFINE_MUTEX(ext_devt_mutex);
35 : : static DEFINE_IDR(ext_devt_idr);
36 : :
37 : : static struct device_type disk_type;
38 : :
39 : : static void disk_check_events(struct disk_events *ev,
40 : : unsigned int *clearing_ptr);
41 : : static void disk_alloc_events(struct gendisk *disk);
42 : : static void disk_add_events(struct gendisk *disk);
43 : : static void disk_del_events(struct gendisk *disk);
44 : : static void disk_release_events(struct gendisk *disk);
45 : :
46 : : /**
47 : : * disk_get_part - get partition
48 : : * @disk: disk to look partition from
49 : : * @partno: partition number
50 : : *
51 : : * Look for partition @partno from @disk. If found, increment
52 : : * reference count and return it.
53 : : *
54 : : * CONTEXT:
55 : : * Don't care.
56 : : *
57 : : * RETURNS:
58 : : * Pointer to the found partition on success, NULL if not found.
59 : : */
60 : 0 : struct hd_struct *disk_get_part(struct gendisk *disk, int partno)
61 : : {
62 : : struct hd_struct *part = NULL;
63 : : struct disk_part_tbl *ptbl;
64 : :
65 [ # # ]: 0 : if (unlikely(partno < 0))
66 : : return NULL;
67 : :
68 : : rcu_read_lock();
69 : :
70 : 0 : ptbl = rcu_dereference(disk->part_tbl);
71 [ # # ]: 0 : if (likely(partno < ptbl->len)) {
72 : 0 : part = rcu_dereference(ptbl->part[partno]);
73 [ # # ]: 0 : if (part)
74 : 0 : get_device(part_to_dev(part));
75 : : }
76 : :
77 : : rcu_read_unlock();
78 : :
79 : 0 : return part;
80 : : }
81 : : EXPORT_SYMBOL_GPL(disk_get_part);
82 : :
83 : : /**
84 : : * disk_part_iter_init - initialize partition iterator
85 : : * @piter: iterator to initialize
86 : : * @disk: disk to iterate over
87 : : * @flags: DISK_PITER_* flags
88 : : *
89 : : * Initialize @piter so that it iterates over partitions of @disk.
90 : : *
91 : : * CONTEXT:
92 : : * Don't care.
93 : : */
94 : 0 : void disk_part_iter_init(struct disk_part_iter *piter, struct gendisk *disk,
95 : : unsigned int flags)
96 : : {
97 : : struct disk_part_tbl *ptbl;
98 : :
99 : : rcu_read_lock();
100 : 18 : ptbl = rcu_dereference(disk->part_tbl);
101 : :
102 : 18 : piter->disk = disk;
103 : 18 : piter->part = NULL;
104 : :
105 [ # # ]: 0 : if (flags & DISK_PITER_REVERSE)
106 : 0 : piter->idx = ptbl->len - 1;
107 [ # # ]: 0 : else if (flags & (DISK_PITER_INCL_PART0 | DISK_PITER_INCL_EMPTY_PART0))
108 : 0 : piter->idx = 0;
109 : : else
110 : 0 : piter->idx = 1;
111 : :
112 : 18 : piter->flags = flags;
113 : :
114 : : rcu_read_unlock();
115 : 0 : }
116 : : EXPORT_SYMBOL_GPL(disk_part_iter_init);
117 : :
118 : : /**
119 : : * disk_part_iter_next - proceed iterator to the next partition and return it
120 : : * @piter: iterator of interest
121 : : *
122 : : * Proceed @piter to the next partition and return it.
123 : : *
124 : : * CONTEXT:
125 : : * Don't care.
126 : : */
127 : 0 : struct hd_struct *disk_part_iter_next(struct disk_part_iter *piter)
128 : : {
129 : : struct disk_part_tbl *ptbl;
130 : : int inc, end;
131 : :
132 : : /* put the last partition */
133 : 40 : disk_put_part(piter->part);
134 : 40 : piter->part = NULL;
135 : :
136 : : /* get part_tbl */
137 : : rcu_read_lock();
138 : 40 : ptbl = rcu_dereference(piter->disk->part_tbl);
139 : :
140 : : /* determine iteration parameters */
141 [ - + ]: 40 : if (piter->flags & DISK_PITER_REVERSE) {
142 : : inc = -1;
143 [ # # ]: 40 : if (piter->flags & (DISK_PITER_INCL_PART0 |
144 : : DISK_PITER_INCL_EMPTY_PART0))
145 : : end = -1;
146 : : else
147 : : end = 0;
148 : : } else {
149 : : inc = 1;
150 : 40 : end = ptbl->len;
151 : : }
152 : :
153 : : /* iterate to the next partition */
154 [ + + ]: 40 : for (; piter->idx != end; piter->idx += inc) {
155 : : struct hd_struct *part;
156 : :
157 : 22 : part = rcu_dereference(ptbl->part[piter->idx]);
158 [ + - ]: 22 : if (!part)
159 : 40 : continue;
160 [ - + ][ # # ]: 22 : if (!part_nr_sects_read(part) &&
161 [ # # ]: 0 : !(piter->flags & DISK_PITER_INCL_EMPTY) &&
162 [ # # ]: 0 : !(piter->flags & DISK_PITER_INCL_EMPTY_PART0 &&
163 : 0 : piter->idx == 0))
164 : 0 : continue;
165 : :
166 : 22 : get_device(part_to_dev(part));
167 : 22 : piter->part = part;
168 : 22 : piter->idx += inc;
169 : 22 : break;
170 : : }
171 : :
172 : : rcu_read_unlock();
173 : :
174 : 40 : return piter->part;
175 : : }
176 : : EXPORT_SYMBOL_GPL(disk_part_iter_next);
177 : :
178 : : /**
179 : : * disk_part_iter_exit - finish up partition iteration
180 : : * @piter: iter of interest
181 : : *
182 : : * Called when iteration is over. Cleans up @piter.
183 : : *
184 : : * CONTEXT:
185 : : * Don't care.
186 : : */
187 : 0 : void disk_part_iter_exit(struct disk_part_iter *piter)
188 : : {
189 : 18 : disk_put_part(piter->part);
190 : 0 : piter->part = NULL;
191 : 0 : }
192 : : EXPORT_SYMBOL_GPL(disk_part_iter_exit);
193 : :
194 : : static inline int sector_in_part(struct hd_struct *part, sector_t sector)
195 : : {
196 [ + ][ - + ]: 792370 : return part->start_sect <= sector &&
[ # # ][ # # ]
197 : 396235 : sector < part->start_sect + part_nr_sects_read(part);
198 : : }
199 : :
200 : : /**
201 : : * disk_map_sector_rcu - map sector to partition
202 : : * @disk: gendisk of interest
203 : : * @sector: sector to map
204 : : *
205 : : * Find out which partition @sector maps to on @disk. This is
206 : : * primarily used for stats accounting.
207 : : *
208 : : * CONTEXT:
209 : : * RCU read locked. The returned partition pointer is valid only
210 : : * while preemption is disabled.
211 : : *
212 : : * RETURNS:
213 : : * Found partition on success, part0 is returned if no partition matches
214 : : */
215 : 0 : struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
216 : : {
217 : : struct disk_part_tbl *ptbl;
218 : : struct hd_struct *part;
219 : : int i;
220 : :
221 : 396227 : ptbl = rcu_dereference(disk->part_tbl);
222 : :
223 : 396227 : part = rcu_dereference(ptbl->last_lookup);
224 [ + + ][ + ]: 792404 : if (part && sector_in_part(part, sector))
225 : : return part;
226 : :
227 [ # # ]: 0 : for (i = 1; i < ptbl->len; i++) {
228 : 0 : part = rcu_dereference(ptbl->part[i]);
229 : :
230 [ # # ][ # # ]: 0 : if (part && sector_in_part(part, sector)) {
231 : 0 : rcu_assign_pointer(ptbl->last_lookup, part);
232 : 0 : return part;
233 : : }
234 : : }
235 : 0 : return &disk->part0;
236 : : }
237 : : EXPORT_SYMBOL_GPL(disk_map_sector_rcu);
238 : :
239 : : /*
240 : : * Can be deleted altogether. Later.
241 : : *
242 : : */
243 : : static struct blk_major_name {
244 : : struct blk_major_name *next;
245 : : int major;
246 : : char name[16];
247 : : } *major_names[BLKDEV_MAJOR_HASH_SIZE];
248 : :
249 : : /* index in the above - for now: assume no multimajor ranges */
250 : : static inline int major_to_index(unsigned major)
251 : : {
252 : 0 : return major % BLKDEV_MAJOR_HASH_SIZE;
253 : : }
254 : :
255 : : #ifdef CONFIG_PROC_FS
256 : 0 : void blkdev_show(struct seq_file *seqf, off_t offset)
257 : : {
258 : : struct blk_major_name *dp;
259 : :
260 [ + - ]: 255 : if (offset < BLKDEV_MAJOR_HASH_SIZE) {
261 : 255 : mutex_lock(&block_class_lock);
262 [ + + ]: 532 : for (dp = major_names[offset]; dp; dp = dp->next)
263 : 22 : seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
264 : 255 : mutex_unlock(&block_class_lock);
265 : : }
266 : 255 : }
267 : : #endif /* CONFIG_PROC_FS */
268 : :
269 : : /**
270 : : * register_blkdev - register a new block device
271 : : *
272 : : * @major: the requested major device number [1..255]. If @major=0, try to
273 : : * allocate any unused major number.
274 : : * @name: the name of the new block device as a zero terminated string
275 : : *
276 : : * The @name must be unique within the system.
277 : : *
278 : : * The return value depends on the @major input parameter.
279 : : * - if a major device number was requested in range [1..255] then the
280 : : * function returns zero on success, or a negative error code
281 : : * - if any unused major number was requested with @major=0 parameter
282 : : * then the return value is the allocated major number in range
283 : : * [1..255] or a negative error code otherwise
284 : : */
285 : 0 : int register_blkdev(unsigned int major, const char *name)
286 : : {
287 : : struct blk_major_name **n, *p;
288 : : int index, ret = 0;
289 : :
290 : 0 : mutex_lock(&block_class_lock);
291 : :
292 : : /* temporary */
293 [ # # ]: 0 : if (major == 0) {
294 [ # # ]: 0 : for (index = ARRAY_SIZE(major_names)-1; index > 0; index--) {
295 [ # # ]: 0 : if (major_names[index] == NULL)
296 : : break;
297 : : }
298 : :
299 [ # # ]: 0 : if (index == 0) {
300 : 0 : printk("register_blkdev: failed to get major for %s\n",
301 : : name);
302 : : ret = -EBUSY;
303 : 0 : goto out;
304 : : }
305 : 0 : major = index;
306 : : ret = major;
307 : : }
308 : :
309 : : p = kmalloc(sizeof(struct blk_major_name), GFP_KERNEL);
310 [ # # ]: 0 : if (p == NULL) {
311 : : ret = -ENOMEM;
312 : : goto out;
313 : : }
314 : :
315 : 0 : p->major = major;
316 : 0 : strlcpy(p->name, name, sizeof(p->name));
317 : 0 : p->next = NULL;
318 : : index = major_to_index(major);
319 : :
320 [ # # ]: 0 : for (n = &major_names[index]; *n; n = &(*n)->next) {
321 [ # # ]: 0 : if ((*n)->major == major)
322 : : break;
323 : : }
324 [ # # ]: 0 : if (!*n)
325 : 0 : *n = p;
326 : : else
327 : : ret = -EBUSY;
328 : :
329 [ # # ]: 0 : if (ret < 0) {
330 : 0 : printk("register_blkdev: cannot get major %d for %s\n",
331 : : major, name);
332 : 0 : kfree(p);
333 : : }
334 : : out:
335 : 0 : mutex_unlock(&block_class_lock);
336 : 0 : return ret;
337 : : }
338 : :
339 : : EXPORT_SYMBOL(register_blkdev);
340 : :
341 : 0 : void unregister_blkdev(unsigned int major, const char *name)
342 : : {
343 : : struct blk_major_name **n;
344 : : struct blk_major_name *p = NULL;
345 : : int index = major_to_index(major);
346 : :
347 : 0 : mutex_lock(&block_class_lock);
348 [ # # ]: 0 : for (n = &major_names[index]; *n; n = &(*n)->next)
349 [ # # ]: 0 : if ((*n)->major == major)
350 : : break;
351 [ # # ][ # # ]: 0 : if (!*n || strcmp((*n)->name, name)) {
352 : 0 : WARN_ON(1);
353 : : } else {
354 : : p = *n;
355 : 0 : *n = p->next;
356 : : }
357 : 0 : mutex_unlock(&block_class_lock);
358 : 0 : kfree(p);
359 : 0 : }
360 : :
361 : : EXPORT_SYMBOL(unregister_blkdev);
362 : :
363 : : static struct kobj_map *bdev_map;
364 : :
365 : : /**
366 : : * blk_mangle_minor - scatter minor numbers apart
367 : : * @minor: minor number to mangle
368 : : *
369 : : * Scatter consecutively allocated @minor number apart if MANGLE_DEVT
370 : : * is enabled. Mangling twice gives the original value.
371 : : *
372 : : * RETURNS:
373 : : * Mangled value.
374 : : *
375 : : * CONTEXT:
376 : : * Don't care.
377 : : */
378 : : static int blk_mangle_minor(int minor)
379 : : {
380 : : #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
381 : : int i;
382 : :
383 : : for (i = 0; i < MINORBITS / 2; i++) {
384 : : int low = minor & (1 << i);
385 : : int high = minor & (1 << (MINORBITS - 1 - i));
386 : : int distance = MINORBITS - 1 - 2 * i;
387 : :
388 : : minor ^= low | high; /* clear both bits */
389 : : low <<= distance; /* swap the positions */
390 : : high >>= distance;
391 : : minor |= low | high; /* and set */
392 : : }
393 : : #endif
394 : : return minor;
395 : : }
396 : :
397 : : /**
398 : : * blk_alloc_devt - allocate a dev_t for a partition
399 : : * @part: partition to allocate dev_t for
400 : : * @devt: out parameter for resulting dev_t
401 : : *
402 : : * Allocate a dev_t for block device.
403 : : *
404 : : * RETURNS:
405 : : * 0 on success, allocated dev_t is returned in *@devt. -errno on
406 : : * failure.
407 : : *
408 : : * CONTEXT:
409 : : * Might sleep.
410 : : */
411 : 0 : int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
412 : : {
413 : : struct gendisk *disk = part_to_disk(part);
414 : : int idx;
415 : :
416 : : /* in consecutive minor range? */
417 [ # # ]: 0 : if (part->partno < disk->minors) {
418 : 0 : *devt = MKDEV(disk->major, disk->first_minor + part->partno);
419 : 0 : return 0;
420 : : }
421 : :
422 : : /* allocate ext devt */
423 : 0 : mutex_lock(&ext_devt_mutex);
424 : 0 : idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_KERNEL);
425 : 0 : mutex_unlock(&ext_devt_mutex);
426 [ # # ]: 0 : if (idx < 0)
427 [ # # ]: 0 : return idx == -ENOSPC ? -EBUSY : idx;
428 : :
429 : 0 : *devt = MKDEV(BLOCK_EXT_MAJOR, blk_mangle_minor(idx));
430 : 0 : return 0;
431 : : }
432 : :
433 : : /**
434 : : * blk_free_devt - free a dev_t
435 : : * @devt: dev_t to free
436 : : *
437 : : * Free @devt which was allocated using blk_alloc_devt().
438 : : *
439 : : * CONTEXT:
440 : : * Might sleep.
441 : : */
442 : 0 : void blk_free_devt(dev_t devt)
443 : : {
444 : : might_sleep();
445 : :
446 [ # # ]: 0 : if (devt == MKDEV(0, 0))
447 : 0 : return;
448 : :
449 [ # # ]: 0 : if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
450 : 0 : mutex_lock(&ext_devt_mutex);
451 : 0 : idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
452 : 0 : mutex_unlock(&ext_devt_mutex);
453 : : }
454 : : }
455 : :
456 : 0 : static char *bdevt_str(dev_t devt, char *buf)
457 : : {
458 [ # # ][ # # ]: 0 : if (MAJOR(devt) <= 0xff && MINOR(devt) <= 0xff) {
459 : : char tbuf[BDEVT_SIZE];
460 : 0 : snprintf(tbuf, BDEVT_SIZE, "%02x%02x", MAJOR(devt), MINOR(devt));
461 : 0 : snprintf(buf, BDEVT_SIZE, "%-9s", tbuf);
462 : : } else
463 : 0 : snprintf(buf, BDEVT_SIZE, "%03x:%05x", MAJOR(devt), MINOR(devt));
464 : :
465 : 0 : return buf;
466 : : }
467 : :
468 : : /*
469 : : * Register device numbers dev..(dev+range-1)
470 : : * range must be nonzero
471 : : * The hash chain is sorted on range, so that subranges can override.
472 : : */
473 : 0 : void blk_register_region(dev_t devt, unsigned long range, struct module *module,
474 : : struct kobject *(*probe)(dev_t, int *, void *),
475 : : int (*lock)(dev_t, void *), void *data)
476 : : {
477 : 0 : kobj_map(bdev_map, devt, range, module, probe, lock, data);
478 : 0 : }
479 : :
480 : : EXPORT_SYMBOL(blk_register_region);
481 : :
482 : 0 : void blk_unregister_region(dev_t devt, unsigned long range)
483 : : {
484 : 0 : kobj_unmap(bdev_map, devt, range);
485 : 0 : }
486 : :
487 : : EXPORT_SYMBOL(blk_unregister_region);
488 : :
489 : 0 : static struct kobject *exact_match(dev_t devt, int *partno, void *data)
490 : : {
491 : : struct gendisk *p = data;
492 : :
493 : 276 : return &disk_to_dev(p)->kobj;
494 : : }
495 : :
496 : 0 : static int exact_lock(dev_t devt, void *data)
497 : : {
498 : : struct gendisk *p = data;
499 : :
500 [ + - ]: 276 : if (!get_disk(p))
501 : : return -1;
502 : 276 : return 0;
503 : : }
504 : :
505 : 0 : static void register_disk(struct gendisk *disk)
506 : : {
507 : 0 : struct device *ddev = disk_to_dev(disk);
508 : : struct block_device *bdev;
509 : : struct disk_part_iter piter;
510 : : struct hd_struct *part;
511 : : int err;
512 : :
513 : 0 : ddev->parent = disk->driverfs_dev;
514 : :
515 : 0 : dev_set_name(ddev, "%s", disk->disk_name);
516 : :
517 : : /* delay uevents, until we scanned partition table */
518 : : dev_set_uevent_suppress(ddev, 1);
519 : :
520 [ # # ]: 0 : if (device_add(ddev))
521 : 0 : return;
522 : : if (!sysfs_deprecated) {
523 : 0 : err = sysfs_create_link(block_depr, &ddev->kobj,
524 : 0 : kobject_name(&ddev->kobj));
525 [ # # ]: 0 : if (err) {
526 : 0 : device_del(ddev);
527 : 0 : return;
528 : : }
529 : : }
530 : :
531 : : /*
532 : : * avoid probable deadlock caused by allocating memory with
533 : : * GFP_KERNEL in runtime_resume callback of its all ancestor
534 : : * devices
535 : : */
536 : : pm_runtime_set_memalloc_noio(ddev, true);
537 : :
538 : 0 : disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj);
539 : 0 : disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj);
540 : :
541 : : /* No minors to use for partitions */
542 [ # # ]: 0 : if (!disk_part_scan_enabled(disk))
543 : : goto exit;
544 : :
545 : : /* No such device (e.g., media were just removed) */
546 [ # # ]: 0 : if (!get_capacity(disk))
547 : : goto exit;
548 : :
549 : 0 : bdev = bdget_disk(disk, 0);
550 [ # # ]: 0 : if (!bdev)
551 : : goto exit;
552 : :
553 : 0 : bdev->bd_invalidated = 1;
554 : 0 : err = blkdev_get(bdev, FMODE_READ, NULL);
555 [ # # ]: 0 : if (err < 0)
556 : : goto exit;
557 : 0 : blkdev_put(bdev, FMODE_READ);
558 : :
559 : : exit:
560 : : /* announce disk after possible partitions are created */
561 : : dev_set_uevent_suppress(ddev, 0);
562 : 0 : kobject_uevent(&ddev->kobj, KOBJ_ADD);
563 : :
564 : : /* announce possible partitions */
565 : : disk_part_iter_init(&piter, disk, 0);
566 [ # # ]: 0 : while ((part = disk_part_iter_next(&piter)))
567 : 0 : kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);
568 : : disk_part_iter_exit(&piter);
569 : : }
570 : :
571 : : /**
572 : : * add_disk - add partitioning information to kernel list
573 : : * @disk: per-device partitioning information
574 : : *
575 : : * This function registers the partitioning information in @disk
576 : : * with the kernel.
577 : : *
578 : : * FIXME: error handling
579 : : */
580 : 0 : void add_disk(struct gendisk *disk)
581 : : {
582 : : struct backing_dev_info *bdi;
583 : : dev_t devt;
584 : : int retval;
585 : :
586 : : /* minors == 0 indicates to use ext devt from part0 and should
587 : : * be accompanied with EXT_DEVT flag. Make sure all
588 : : * parameters make sense.
589 : : */
590 [ # # ][ # # ]: 0 : WARN_ON(disk->minors && !(disk->major || disk->first_minor));
[ # # ][ # # ]
591 [ # # ][ # # ]: 0 : WARN_ON(!disk->minors && !(disk->flags & GENHD_FL_EXT_DEVT));
[ # # ]
592 : :
593 : 0 : disk->flags |= GENHD_FL_UP;
594 : :
595 : 0 : retval = blk_alloc_devt(&disk->part0, &devt);
596 [ # # ]: 0 : if (retval) {
597 : 0 : WARN_ON(1);
598 : 0 : return;
599 : : }
600 : 0 : disk_to_dev(disk)->devt = devt;
601 : :
602 : : /* ->major and ->first_minor aren't supposed to be
603 : : * dereferenced from here on, but set them just in case.
604 : : */
605 : 0 : disk->major = MAJOR(devt);
606 : 0 : disk->first_minor = MINOR(devt);
607 : :
608 : 0 : disk_alloc_events(disk);
609 : :
610 : : /* Register BDI before referencing it from bdev */
611 : 0 : bdi = &disk->queue->backing_dev_info;
612 : 0 : bdi_register_dev(bdi, disk_devt(disk));
613 : :
614 : 0 : blk_register_region(disk_devt(disk), disk->minors, NULL,
615 : : exact_match, exact_lock, disk);
616 : 0 : register_disk(disk);
617 : 0 : blk_register_queue(disk);
618 : :
619 : : /*
620 : : * Take an extra ref on queue which will be put on disk_release()
621 : : * so that it sticks around as long as @disk is there.
622 : : */
623 [ # # ][ # # ]: 0 : WARN_ON_ONCE(!blk_get_queue(disk->queue));
[ # # ]
624 : :
625 : 0 : retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
626 : : "bdi");
627 [ # # ]: 0 : WARN_ON(retval);
628 : :
629 : 0 : disk_add_events(disk);
630 : : }
631 : : EXPORT_SYMBOL(add_disk);
632 : :
633 : 0 : void del_gendisk(struct gendisk *disk)
634 : : {
635 : : struct disk_part_iter piter;
636 : : struct hd_struct *part;
637 : :
638 : 0 : disk_del_events(disk);
639 : :
640 : : /* invalidate stuff */
641 : : disk_part_iter_init(&piter, disk,
642 : : DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE);
643 [ # # ]: 0 : while ((part = disk_part_iter_next(&piter))) {
644 : 0 : invalidate_partition(disk, part->partno);
645 : 0 : delete_partition(disk, part->partno);
646 : : }
647 : : disk_part_iter_exit(&piter);
648 : :
649 : 0 : invalidate_partition(disk, 0);
650 : : set_capacity(disk, 0);
651 : 0 : disk->flags &= ~GENHD_FL_UP;
652 : :
653 : 0 : sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
654 : 0 : bdi_unregister(&disk->queue->backing_dev_info);
655 : 0 : blk_unregister_queue(disk);
656 : 0 : blk_unregister_region(disk_devt(disk), disk->minors);
657 : :
658 : : part_stat_set_all(&disk->part0, 0);
659 : 0 : disk->part0.stamp = 0;
660 : :
661 : 0 : kobject_put(disk->part0.holder_dir);
662 : 0 : kobject_put(disk->slave_dir);
663 : 0 : disk->driverfs_dev = NULL;
664 : : if (!sysfs_deprecated)
665 : 0 : sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
666 : : pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
667 : 0 : device_del(disk_to_dev(disk));
668 : 0 : blk_free_devt(disk_to_dev(disk)->devt);
669 : 0 : }
670 : : EXPORT_SYMBOL(del_gendisk);
671 : :
672 : : /**
673 : : * get_gendisk - get partitioning information for a given device
674 : : * @devt: device to get partitioning information for
675 : : * @partno: returned partition index
676 : : *
677 : : * This function gets the structure containing partitioning
678 : : * information for the given device @devt.
679 : : */
680 : 0 : struct gendisk *get_gendisk(dev_t devt, int *partno)
681 : : {
682 : : struct gendisk *disk = NULL;
683 : :
684 [ + - ]: 276 : if (MAJOR(devt) != BLOCK_EXT_MAJOR) {
685 : : struct kobject *kobj;
686 : :
687 : 276 : kobj = kobj_lookup(bdev_map, devt, partno);
688 [ + - ]: 276 : if (kobj)
689 : 276 : disk = dev_to_disk(kobj_to_dev(kobj));
690 : : } else {
691 : : struct hd_struct *part;
692 : :
693 : 0 : mutex_lock(&ext_devt_mutex);
694 : 0 : part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
695 [ # # ][ # # ]: 0 : if (part && get_disk(part_to_disk(part))) {
696 : 0 : *partno = part->partno;
697 : : disk = part_to_disk(part);
698 : : }
699 : 0 : mutex_unlock(&ext_devt_mutex);
700 : : }
701 : :
702 : 276 : return disk;
703 : : }
704 : : EXPORT_SYMBOL(get_gendisk);
705 : :
706 : : /**
707 : : * bdget_disk - do bdget() by gendisk and partition number
708 : : * @disk: gendisk of interest
709 : : * @partno: partition number
710 : : *
711 : : * Find partition @partno from @disk, do bdget() on it.
712 : : *
713 : : * CONTEXT:
714 : : * Don't care.
715 : : *
716 : : * RETURNS:
717 : : * Resulting block_device on success, NULL on failure.
718 : : */
719 : 0 : struct block_device *bdget_disk(struct gendisk *disk, int partno)
720 : : {
721 : 0 : struct hd_struct *part;
722 : : struct block_device *bdev = NULL;
723 : :
724 : 0 : part = disk_get_part(disk, partno);
725 [ # # ]: 0 : if (part)
726 : 0 : bdev = bdget(part_devt(part));
727 : : disk_put_part(part);
728 : :
729 : 0 : return bdev;
730 : : }
731 : : EXPORT_SYMBOL(bdget_disk);
732 : :
733 : : /*
734 : : * print a full list of all partitions - intended for places where the root
735 : : * filesystem can't be mounted and thus to give the victim some idea of what
736 : : * went wrong
737 : : */
738 : 0 : void __init printk_all_partitions(void)
739 : : {
740 : : struct class_dev_iter iter;
741 : : struct device *dev;
742 : :
743 : 0 : class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
744 [ # # ]: 0 : while ((dev = class_dev_iter_next(&iter))) {
745 : 0 : struct gendisk *disk = dev_to_disk(dev);
746 : : struct disk_part_iter piter;
747 : 0 : struct hd_struct *part;
748 : : char name_buf[BDEVNAME_SIZE];
749 : : char devt_buf[BDEVT_SIZE];
750 : :
751 : : /*
752 : : * Don't show empty devices or things that have been
753 : : * suppressed
754 : : */
755 [ # # ][ # # ]: 0 : if (get_capacity(disk) == 0 ||
756 : 0 : (disk->flags & GENHD_FL_SUPPRESS_PARTITION_INFO))
757 : 0 : continue;
758 : :
759 : : /*
760 : : * Note, unlike /proc/partitions, I am showing the
761 : : * numbers in hex - the same format as the root=
762 : : * option takes.
763 : : */
764 : : disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0);
765 [ # # ]: 0 : while ((part = disk_part_iter_next(&piter))) {
766 : 0 : bool is_part0 = part == &disk->part0;
767 : :
768 [ # # ][ # # ]: 0 : printk("%s%s %10llu %s %s", is_part0 ? "" : " ",
769 : : bdevt_str(part_devt(part), devt_buf),
770 : : (unsigned long long)part_nr_sects_read(part) >> 1
771 : : , disk_name(disk, part->partno, name_buf),
772 : 0 : part->info ? part->info->uuid : "");
773 [ # # ]: 0 : if (is_part0) {
774 [ # # ][ # # ]: 0 : if (disk->driverfs_dev != NULL &&
775 : 0 : disk->driverfs_dev->driver != NULL)
776 : 0 : printk(" driver: %s\n",
777 : : disk->driverfs_dev->driver->name);
778 : : else
779 : 0 : printk(" (driver?)\n");
780 : : } else
781 : 0 : printk("\n");
782 : : }
783 : : disk_part_iter_exit(&piter);
784 : : }
785 : 0 : class_dev_iter_exit(&iter);
786 : 0 : }
787 : :
788 : : #ifdef CONFIG_PROC_FS
789 : : /* iterator */
790 : 0 : static void *disk_seqf_start(struct seq_file *seqf, loff_t *pos)
791 : : {
792 : 4 : loff_t skip = *pos;
793 : : struct class_dev_iter *iter;
794 : : struct device *dev;
795 : :
796 : : iter = kmalloc(sizeof(*iter), GFP_KERNEL);
797 [ + - ]: 4 : if (!iter)
798 : : return ERR_PTR(-ENOMEM);
799 : :
800 : 4 : seqf->private = iter;
801 : 4 : class_dev_iter_init(iter, &block_class, NULL, &disk_type);
802 : : do {
803 : 38 : dev = class_dev_iter_next(iter);
804 [ + ]: 38 : if (!dev)
805 : : return NULL;
806 [ + + ]: 40 : } while (skip--);
807 : :
808 : 2 : return dev_to_disk(dev);
809 : : }
810 : :
811 : 0 : static void *disk_seqf_next(struct seq_file *seqf, void *v, loff_t *pos)
812 : : {
813 : : struct device *dev;
814 : :
815 : 34 : (*pos)++;
816 : 34 : dev = class_dev_iter_next(seqf->private);
817 [ + + ]: 34 : if (dev)
818 : 32 : return dev_to_disk(dev);
819 : :
820 : : return NULL;
821 : : }
822 : :
823 : 0 : static void disk_seqf_stop(struct seq_file *seqf, void *v)
824 : : {
825 : 4 : struct class_dev_iter *iter = seqf->private;
826 : :
827 : : /* stop is called even after start failed :-( */
828 [ + - ]: 4 : if (iter) {
829 : 4 : class_dev_iter_exit(iter);
830 : 4 : kfree(iter);
831 : : }
832 : 0 : }
833 : :
834 : 0 : static void *show_partition_start(struct seq_file *seqf, loff_t *pos)
835 : : {
836 : : void *p;
837 : :
838 : 2 : p = disk_seqf_start(seqf, pos);
839 [ + + ][ + - ]: 2 : if (!IS_ERR_OR_NULL(p) && !*pos)
840 : 1 : seq_puts(seqf, "major minor #blocks name\n\n");
841 : 0 : return p;
842 : : }
843 : :
844 : 0 : static int show_partition(struct seq_file *seqf, void *v)
845 : : {
846 : 34 : struct gendisk *sgp = v;
847 : : struct disk_part_iter piter;
848 : 3 : struct hd_struct *part;
849 : : char buf[BDEVNAME_SIZE];
850 : :
851 : : /* Don't show non-partitionable removeable devices or empty devices */
852 [ + - ][ - + ]: 34 : if (!get_capacity(sgp) || (!disk_max_parts(sgp) &&
[ # # ]
853 : 0 : (sgp->flags & GENHD_FL_REMOVABLE)))
854 : : return 0;
855 [ + + ]: 17 : if (sgp->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)
856 : : return 0;
857 : :
858 : : /* show the full disk and all non-0 size partitions of it */
859 : : disk_part_iter_init(&piter, sgp, DISK_PITER_INCL_PART0);
860 [ + + ]: 4 : while ((part = disk_part_iter_next(&piter)))
861 : 6 : seq_printf(seqf, "%4d %7d %10llu %s\n",
862 : : MAJOR(part_devt(part)), MINOR(part_devt(part)),
863 : : (unsigned long long)part_nr_sects_read(part) >> 1,
864 : : disk_name(sgp, part->partno, buf));
865 : : disk_part_iter_exit(&piter);
866 : :
867 : 1 : return 0;
868 : : }
869 : :
870 : : static const struct seq_operations partitions_op = {
871 : : .start = show_partition_start,
872 : : .next = disk_seqf_next,
873 : : .stop = disk_seqf_stop,
874 : : .show = show_partition
875 : : };
876 : :
877 : 0 : static int partitions_open(struct inode *inode, struct file *file)
878 : : {
879 : 1 : return seq_open(file, &partitions_op);
880 : : }
881 : :
882 : : static const struct file_operations proc_partitions_operations = {
883 : : .open = partitions_open,
884 : : .read = seq_read,
885 : : .llseek = seq_lseek,
886 : : .release = seq_release,
887 : : };
888 : : #endif
889 : :
890 : :
891 : 0 : static struct kobject *base_probe(dev_t devt, int *partno, void *data)
892 : : {
893 [ # # ]: 0 : if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0)
894 : : /* Make old-style 2.4 aliases work */
895 : 0 : request_module("block-major-%d", MAJOR(devt));
896 : 0 : return NULL;
897 : : }
898 : :
899 : 0 : static int __init genhd_device_init(void)
900 : : {
901 : : int error;
902 : :
903 : 0 : block_class.dev_kobj = sysfs_dev_block_kobj;
904 : 0 : error = class_register(&block_class);
905 [ # # ]: 0 : if (unlikely(error))
906 : : return error;
907 : 0 : bdev_map = kobj_map_init(base_probe, &block_class_lock);
908 : 0 : blk_dev_init();
909 : :
910 : 0 : register_blkdev(BLOCK_EXT_MAJOR, "blkext");
911 : :
912 : : /* create top-level block dir */
913 : : if (!sysfs_deprecated)
914 : 0 : block_depr = kobject_create_and_add("block", NULL);
915 : 0 : return 0;
916 : : }
917 : :
918 : : subsys_initcall(genhd_device_init);
919 : :
920 : 0 : static ssize_t disk_range_show(struct device *dev,
921 : : struct device_attribute *attr, char *buf)
922 : : {
923 : : struct gendisk *disk = dev_to_disk(dev);
924 : :
925 : 0 : return sprintf(buf, "%d\n", disk->minors);
926 : : }
927 : :
928 : 0 : static ssize_t disk_ext_range_show(struct device *dev,
929 : : struct device_attribute *attr, char *buf)
930 : : {
931 : 0 : struct gendisk *disk = dev_to_disk(dev);
932 : :
933 : 0 : return sprintf(buf, "%d\n", disk_max_parts(disk));
934 : : }
935 : :
936 : 0 : static ssize_t disk_removable_show(struct device *dev,
937 : : struct device_attribute *attr, char *buf)
938 : : {
939 : : struct gendisk *disk = dev_to_disk(dev);
940 : :
941 : 0 : return sprintf(buf, "%d\n",
942 : 0 : (disk->flags & GENHD_FL_REMOVABLE ? 1 : 0));
943 : : }
944 : :
945 : 0 : static ssize_t disk_ro_show(struct device *dev,
946 : : struct device_attribute *attr, char *buf)
947 : : {
948 : 0 : struct gendisk *disk = dev_to_disk(dev);
949 : :
950 : 0 : return sprintf(buf, "%d\n", get_disk_ro(disk) ? 1 : 0);
951 : : }
952 : :
953 : 0 : static ssize_t disk_capability_show(struct device *dev,
954 : : struct device_attribute *attr, char *buf)
955 : : {
956 : : struct gendisk *disk = dev_to_disk(dev);
957 : :
958 : 0 : return sprintf(buf, "%x\n", disk->flags);
959 : : }
960 : :
961 : 0 : static ssize_t disk_alignment_offset_show(struct device *dev,
962 : : struct device_attribute *attr,
963 : : char *buf)
964 : : {
965 : : struct gendisk *disk = dev_to_disk(dev);
966 : :
967 : 0 : return sprintf(buf, "%d\n", queue_alignment_offset(disk->queue));
968 : : }
969 : :
970 : 0 : static ssize_t disk_discard_alignment_show(struct device *dev,
971 : : struct device_attribute *attr,
972 : : char *buf)
973 : : {
974 : : struct gendisk *disk = dev_to_disk(dev);
975 : :
976 : 0 : return sprintf(buf, "%d\n", queue_discard_alignment(disk->queue));
977 : : }
978 : :
979 : : static DEVICE_ATTR(range, S_IRUGO, disk_range_show, NULL);
980 : : static DEVICE_ATTR(ext_range, S_IRUGO, disk_ext_range_show, NULL);
981 : : static DEVICE_ATTR(removable, S_IRUGO, disk_removable_show, NULL);
982 : : static DEVICE_ATTR(ro, S_IRUGO, disk_ro_show, NULL);
983 : : static DEVICE_ATTR(size, S_IRUGO, part_size_show, NULL);
984 : : static DEVICE_ATTR(alignment_offset, S_IRUGO, disk_alignment_offset_show, NULL);
985 : : static DEVICE_ATTR(discard_alignment, S_IRUGO, disk_discard_alignment_show,
986 : : NULL);
987 : : static DEVICE_ATTR(capability, S_IRUGO, disk_capability_show, NULL);
988 : : static DEVICE_ATTR(stat, S_IRUGO, part_stat_show, NULL);
989 : : static DEVICE_ATTR(inflight, S_IRUGO, part_inflight_show, NULL);
990 : : #ifdef CONFIG_FAIL_MAKE_REQUEST
991 : : static struct device_attribute dev_attr_fail =
992 : : __ATTR(make-it-fail, S_IRUGO|S_IWUSR, part_fail_show, part_fail_store);
993 : : #endif
994 : : #ifdef CONFIG_FAIL_IO_TIMEOUT
995 : : static struct device_attribute dev_attr_fail_timeout =
996 : : __ATTR(io-timeout-fail, S_IRUGO|S_IWUSR, part_timeout_show,
997 : : part_timeout_store);
998 : : #endif
999 : :
1000 : : static struct attribute *disk_attrs[] = {
1001 : : &dev_attr_range.attr,
1002 : : &dev_attr_ext_range.attr,
1003 : : &dev_attr_removable.attr,
1004 : : &dev_attr_ro.attr,
1005 : : &dev_attr_size.attr,
1006 : : &dev_attr_alignment_offset.attr,
1007 : : &dev_attr_discard_alignment.attr,
1008 : : &dev_attr_capability.attr,
1009 : : &dev_attr_stat.attr,
1010 : : &dev_attr_inflight.attr,
1011 : : #ifdef CONFIG_FAIL_MAKE_REQUEST
1012 : : &dev_attr_fail.attr,
1013 : : #endif
1014 : : #ifdef CONFIG_FAIL_IO_TIMEOUT
1015 : : &dev_attr_fail_timeout.attr,
1016 : : #endif
1017 : : NULL
1018 : : };
1019 : :
1020 : : static struct attribute_group disk_attr_group = {
1021 : : .attrs = disk_attrs,
1022 : : };
1023 : :
1024 : : static const struct attribute_group *disk_attr_groups[] = {
1025 : : &disk_attr_group,
1026 : : NULL
1027 : : };
1028 : :
1029 : : /**
1030 : : * disk_replace_part_tbl - replace disk->part_tbl in RCU-safe way
1031 : : * @disk: disk to replace part_tbl for
1032 : : * @new_ptbl: new part_tbl to install
1033 : : *
1034 : : * Replace disk->part_tbl with @new_ptbl in RCU-safe way. The
1035 : : * original ptbl is freed using RCU callback.
1036 : : *
1037 : : * LOCKING:
1038 : : * Matching bd_mutx locked.
1039 : : */
1040 : 0 : static void disk_replace_part_tbl(struct gendisk *disk,
1041 : : struct disk_part_tbl *new_ptbl)
1042 : : {
1043 : 0 : struct disk_part_tbl *old_ptbl = disk->part_tbl;
1044 : :
1045 : 0 : rcu_assign_pointer(disk->part_tbl, new_ptbl);
1046 : :
1047 [ # # ]: 0 : if (old_ptbl) {
1048 : 0 : rcu_assign_pointer(old_ptbl->last_lookup, NULL);
1049 : 0 : kfree_rcu(old_ptbl, rcu_head);
1050 : : }
1051 : 0 : }
1052 : :
1053 : : /**
1054 : : * disk_expand_part_tbl - expand disk->part_tbl
1055 : : * @disk: disk to expand part_tbl for
1056 : : * @partno: expand such that this partno can fit in
1057 : : *
1058 : : * Expand disk->part_tbl such that @partno can fit in. disk->part_tbl
1059 : : * uses RCU to allow unlocked dereferencing for stats and other stuff.
1060 : : *
1061 : : * LOCKING:
1062 : : * Matching bd_mutex locked, might sleep.
1063 : : *
1064 : : * RETURNS:
1065 : : * 0 on success, -errno on failure.
1066 : : */
1067 : 0 : int disk_expand_part_tbl(struct gendisk *disk, int partno)
1068 : : {
1069 : 0 : struct disk_part_tbl *old_ptbl = disk->part_tbl;
1070 : : struct disk_part_tbl *new_ptbl;
1071 [ # # ]: 0 : int len = old_ptbl ? old_ptbl->len : 0;
1072 : 0 : int target = partno + 1;
1073 : : size_t size;
1074 : : int i;
1075 : :
1076 : : /* disk_max_parts() is zero during initialization, ignore if so */
1077 [ # # ][ # # ]: 0 : if (disk_max_parts(disk) && target > disk_max_parts(disk))
1078 : : return -EINVAL;
1079 : :
1080 [ # # ]: 0 : if (target <= len)
1081 : : return 0;
1082 : :
1083 : 0 : size = sizeof(*new_ptbl) + target * sizeof(new_ptbl->part[0]);
1084 : : new_ptbl = kzalloc_node(size, GFP_KERNEL, disk->node_id);
1085 [ # # ]: 0 : if (!new_ptbl)
1086 : : return -ENOMEM;
1087 : :
1088 : 0 : new_ptbl->len = target;
1089 : :
1090 [ # # ]: 0 : for (i = 0; i < len; i++)
1091 : 0 : rcu_assign_pointer(new_ptbl->part[i], old_ptbl->part[i]);
1092 : :
1093 : 0 : disk_replace_part_tbl(disk, new_ptbl);
1094 : 0 : return 0;
1095 : : }
1096 : :
1097 : 0 : static void disk_release(struct device *dev)
1098 : : {
1099 : 0 : struct gendisk *disk = dev_to_disk(dev);
1100 : :
1101 : 0 : disk_release_events(disk);
1102 : 0 : kfree(disk->random);
1103 : 0 : disk_replace_part_tbl(disk, NULL);
1104 : 0 : free_part_stats(&disk->part0);
1105 : : free_part_info(&disk->part0);
1106 [ # # ]: 0 : if (disk->queue)
1107 : 0 : blk_put_queue(disk->queue);
1108 : 0 : kfree(disk);
1109 : 0 : }
1110 : :
1111 : 0 : static int disk_uevent(struct device *dev, struct kobj_uevent_env *env)
1112 : : {
1113 : 0 : struct gendisk *disk = dev_to_disk(dev);
1114 : : struct disk_part_iter piter;
1115 : : struct hd_struct *part;
1116 : : int cnt = 0;
1117 : :
1118 : : disk_part_iter_init(&piter, disk, 0);
1119 [ # # ]: 0 : while((part = disk_part_iter_next(&piter)))
1120 : 0 : cnt++;
1121 : : disk_part_iter_exit(&piter);
1122 : 0 : add_uevent_var(env, "NPARTS=%u", cnt);
1123 : 0 : return 0;
1124 : : }
1125 : :
1126 : : struct class block_class = {
1127 : : .name = "block",
1128 : : };
1129 : :
1130 : 0 : static char *block_devnode(struct device *dev, umode_t *mode,
1131 : : kuid_t *uid, kgid_t *gid)
1132 : : {
1133 : 0 : struct gendisk *disk = dev_to_disk(dev);
1134 : :
1135 [ # # ]: 0 : if (disk->devnode)
1136 : 0 : return disk->devnode(disk, mode);
1137 : : return NULL;
1138 : : }
1139 : :
1140 : : static struct device_type disk_type = {
1141 : : .name = "disk",
1142 : : .groups = disk_attr_groups,
1143 : : .release = disk_release,
1144 : : .devnode = block_devnode,
1145 : : .uevent = disk_uevent,
1146 : : };
1147 : :
1148 : : #ifdef CONFIG_PROC_FS
1149 : : /*
1150 : : * aggregate disk stat collector. Uses the same stats that the sysfs
1151 : : * entries do, above, but makes them available through one seq_file.
1152 : : *
1153 : : * The output looks suspiciously like /proc/partitions with a bunch of
1154 : : * extra fields.
1155 : : */
1156 : 0 : static int diskstats_show(struct seq_file *seqf, void *v)
1157 : : {
1158 : : struct gendisk *gp = v;
1159 : : struct disk_part_iter piter;
1160 : 19 : struct hd_struct *hd;
1161 : : char buf[BDEVNAME_SIZE];
1162 : : int cpu;
1163 : :
1164 : : /*
1165 : : if (&disk_to_dev(gp)->kobj.entry == block_class.devices.next)
1166 : : seq_puts(seqf, "major minor name"
1167 : : " rio rmerge rsect ruse wio wmerge "
1168 : : "wsect wuse running use aveq"
1169 : : "\n\n");
1170 : : */
1171 : :
1172 : : disk_part_iter_init(&piter, gp, DISK_PITER_INCL_EMPTY_PART0);
1173 [ + + ]: 36 : while ((hd = disk_part_iter_next(&piter))) {
1174 : 19 : cpu = part_stat_lock();
1175 : 19 : part_round_stats(cpu, hd);
1176 : 19 : part_stat_unlock();
1177 : 95 : seq_printf(seqf, "%4d %7d %s %lu %lu %lu "
1178 : : "%u %lu %lu %lu %u %u %u %u\n",
1179 : : MAJOR(part_devt(hd)), MINOR(part_devt(hd)),
1180 : : disk_name(gp, hd->partno, buf),
1181 [ + + ]: 133 : part_stat_read(hd, ios[READ]),
1182 [ + + ]: 114 : part_stat_read(hd, merges[READ]),
1183 [ + + ]: 114 : part_stat_read(hd, sectors[READ]),
1184 [ + + ]: 114 : jiffies_to_msecs(part_stat_read(hd, ticks[READ])),
1185 [ + + ]: 133 : part_stat_read(hd, ios[WRITE]),
1186 [ + + ]: 114 : part_stat_read(hd, merges[WRITE]),
1187 [ + + ]: 114 : part_stat_read(hd, sectors[WRITE]),
1188 [ + + ]: 114 : jiffies_to_msecs(part_stat_read(hd, ticks[WRITE])),
1189 : : part_in_flight(hd),
1190 [ + + ]: 133 : jiffies_to_msecs(part_stat_read(hd, io_ticks)),
1191 [ + + ]: 133 : jiffies_to_msecs(part_stat_read(hd, time_in_queue))
1192 : : );
1193 : : }
1194 : : disk_part_iter_exit(&piter);
1195 : :
1196 : 17 : return 0;
1197 : : }
1198 : :
1199 : : static const struct seq_operations diskstats_op = {
1200 : : .start = disk_seqf_start,
1201 : : .next = disk_seqf_next,
1202 : : .stop = disk_seqf_stop,
1203 : : .show = diskstats_show
1204 : : };
1205 : :
1206 : 0 : static int diskstats_open(struct inode *inode, struct file *file)
1207 : : {
1208 : 1 : return seq_open(file, &diskstats_op);
1209 : : }
1210 : :
1211 : : static const struct file_operations proc_diskstats_operations = {
1212 : : .open = diskstats_open,
1213 : : .read = seq_read,
1214 : : .llseek = seq_lseek,
1215 : : .release = seq_release,
1216 : : };
1217 : :
1218 : 0 : static int __init proc_genhd_init(void)
1219 : : {
1220 : : proc_create("diskstats", 0, NULL, &proc_diskstats_operations);
1221 : : proc_create("partitions", 0, NULL, &proc_partitions_operations);
1222 : 0 : return 0;
1223 : : }
1224 : : module_init(proc_genhd_init);
1225 : : #endif /* CONFIG_PROC_FS */
1226 : :
1227 : 0 : dev_t blk_lookup_devt(const char *name, int partno)
1228 : : {
1229 : : dev_t devt = MKDEV(0, 0);
1230 : : struct class_dev_iter iter;
1231 : : struct device *dev;
1232 : :
1233 : 0 : class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
1234 [ # # ]: 0 : while ((dev = class_dev_iter_next(&iter))) {
1235 : 0 : struct gendisk *disk = dev_to_disk(dev);
1236 : 0 : struct hd_struct *part;
1237 : :
1238 [ # # ]: 0 : if (strcmp(dev_name(dev), name))
1239 : 0 : continue;
1240 : :
1241 [ # # ]: 0 : if (partno < disk->minors) {
1242 : : /* We need to return the right devno, even
1243 : : * if the partition doesn't exist yet.
1244 : : */
1245 : 0 : devt = MKDEV(MAJOR(dev->devt),
1246 : : MINOR(dev->devt) + partno);
1247 : 0 : break;
1248 : : }
1249 : 0 : part = disk_get_part(disk, partno);
1250 [ # # ]: 0 : if (part) {
1251 : : devt = part_devt(part);
1252 : : disk_put_part(part);
1253 : : break;
1254 : : }
1255 : : disk_put_part(part);
1256 : : }
1257 : 0 : class_dev_iter_exit(&iter);
1258 : 0 : return devt;
1259 : : }
1260 : : EXPORT_SYMBOL(blk_lookup_devt);
1261 : :
1262 : 0 : struct gendisk *alloc_disk(int minors)
1263 : : {
1264 : 0 : return alloc_disk_node(minors, NUMA_NO_NODE);
1265 : : }
1266 : : EXPORT_SYMBOL(alloc_disk);
1267 : :
1268 : 0 : struct gendisk *alloc_disk_node(int minors, int node_id)
1269 : : {
1270 : : struct gendisk *disk;
1271 : :
1272 : : disk = kzalloc_node(sizeof(struct gendisk), GFP_KERNEL, node_id);
1273 [ # # ]: 0 : if (disk) {
1274 [ # # ]: 0 : if (!init_part_stats(&disk->part0)) {
1275 : 0 : kfree(disk);
1276 : 0 : return NULL;
1277 : : }
1278 : 0 : disk->node_id = node_id;
1279 [ # # ]: 0 : if (disk_expand_part_tbl(disk, 0)) {
1280 : : free_part_stats(&disk->part0);
1281 : 0 : kfree(disk);
1282 : 0 : return NULL;
1283 : : }
1284 : 0 : disk->part_tbl->part[0] = &disk->part0;
1285 : :
1286 : : /*
1287 : : * set_capacity() and get_capacity() currently don't use
1288 : : * seqcounter to read/update the part0->nr_sects. Still init
1289 : : * the counter as we can read the sectors in IO submission
1290 : : * patch using seqence counters.
1291 : : *
1292 : : * TODO: Ideally set_capacity() and get_capacity() should be
1293 : : * converted to make use of bd_mutex and sequence counters.
1294 : : */
1295 : : seqcount_init(&disk->part0.nr_sects_seq);
1296 : : hd_ref_init(&disk->part0);
1297 : :
1298 : 0 : disk->minors = minors;
1299 : 0 : rand_initialize_disk(disk);
1300 : 0 : disk_to_dev(disk)->class = &block_class;
1301 : 0 : disk_to_dev(disk)->type = &disk_type;
1302 : 0 : device_initialize(disk_to_dev(disk));
1303 : : }
1304 : 0 : return disk;
1305 : : }
1306 : : EXPORT_SYMBOL(alloc_disk_node);
1307 : :
1308 : 0 : struct kobject *get_disk(struct gendisk *disk)
1309 : : {
1310 : : struct module *owner;
1311 : : struct kobject *kobj;
1312 : :
1313 [ + - ]: 276 : if (!disk->fops)
1314 : : return NULL;
1315 : 276 : owner = disk->fops->owner;
1316 [ - + ][ # # ]: 276 : if (owner && !try_module_get(owner))
1317 : : return NULL;
1318 : 276 : kobj = kobject_get(&disk_to_dev(disk)->kobj);
1319 [ - + ]: 276 : if (kobj == NULL) {
1320 : 0 : module_put(owner);
1321 : 0 : return NULL;
1322 : : }
1323 : : return kobj;
1324 : :
1325 : : }
1326 : :
1327 : : EXPORT_SYMBOL(get_disk);
1328 : :
1329 : 0 : void put_disk(struct gendisk *disk)
1330 : : {
1331 [ + - ]: 276 : if (disk)
1332 : 276 : kobject_put(&disk_to_dev(disk)->kobj);
1333 : 0 : }
1334 : :
1335 : : EXPORT_SYMBOL(put_disk);
1336 : :
1337 : 0 : static void set_disk_ro_uevent(struct gendisk *gd, int ro)
1338 : : {
1339 : 0 : char event[] = "DISK_RO=1";
1340 : 0 : char *envp[] = { event, NULL };
1341 : :
1342 [ # # ]: 0 : if (!ro)
1343 : 0 : event[8] = '0';
1344 : 0 : kobject_uevent_env(&disk_to_dev(gd)->kobj, KOBJ_CHANGE, envp);
1345 : 0 : }
1346 : :
1347 : 0 : void set_device_ro(struct block_device *bdev, int flag)
1348 : : {
1349 : 0 : bdev->bd_part->policy = flag;
1350 : 0 : }
1351 : :
1352 : : EXPORT_SYMBOL(set_device_ro);
1353 : :
1354 : 0 : void set_disk_ro(struct gendisk *disk, int flag)
1355 : : {
1356 : : struct disk_part_iter piter;
1357 : : struct hd_struct *part;
1358 : :
1359 [ # # ]: 0 : if (disk->part0.policy != flag) {
1360 : 0 : set_disk_ro_uevent(disk, flag);
1361 : 0 : disk->part0.policy = flag;
1362 : : }
1363 : :
1364 : : disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY);
1365 [ # # ]: 0 : while ((part = disk_part_iter_next(&piter)))
1366 : 0 : part->policy = flag;
1367 : : disk_part_iter_exit(&piter);
1368 : 0 : }
1369 : :
1370 : : EXPORT_SYMBOL(set_disk_ro);
1371 : :
1372 : 0 : int bdev_read_only(struct block_device *bdev)
1373 : : {
1374 [ + - ]: 4 : if (!bdev)
1375 : : return 0;
1376 : 4 : return bdev->bd_part->policy;
1377 : : }
1378 : :
1379 : : EXPORT_SYMBOL(bdev_read_only);
1380 : :
1381 : 0 : int invalidate_partition(struct gendisk *disk, int partno)
1382 : : {
1383 : : int res = 0;
1384 : 0 : struct block_device *bdev = bdget_disk(disk, partno);
1385 [ # # ]: 0 : if (bdev) {
1386 : 0 : fsync_bdev(bdev);
1387 : 0 : res = __invalidate_device(bdev, true);
1388 : 0 : bdput(bdev);
1389 : : }
1390 : 0 : return res;
1391 : : }
1392 : :
1393 : : EXPORT_SYMBOL(invalidate_partition);
1394 : :
1395 : : /*
1396 : : * Disk events - monitor disk events like media change and eject request.
1397 : : */
1398 : : struct disk_events {
1399 : : struct list_head node; /* all disk_event's */
1400 : : struct gendisk *disk; /* the associated disk */
1401 : : spinlock_t lock;
1402 : :
1403 : : struct mutex block_mutex; /* protects blocking */
1404 : : int block; /* event blocking depth */
1405 : : unsigned int pending; /* events already sent out */
1406 : : unsigned int clearing; /* events being cleared */
1407 : :
1408 : : long poll_msecs; /* interval, -1 for default */
1409 : : struct delayed_work dwork;
1410 : : };
1411 : :
1412 : : static const char *disk_events_strs[] = {
1413 : : [ilog2(DISK_EVENT_MEDIA_CHANGE)] = "media_change",
1414 : : [ilog2(DISK_EVENT_EJECT_REQUEST)] = "eject_request",
1415 : : };
1416 : :
1417 : : static char *disk_uevents[] = {
1418 : : [ilog2(DISK_EVENT_MEDIA_CHANGE)] = "DISK_MEDIA_CHANGE=1",
1419 : : [ilog2(DISK_EVENT_EJECT_REQUEST)] = "DISK_EJECT_REQUEST=1",
1420 : : };
1421 : :
1422 : : /* list of all disk_events */
1423 : : static DEFINE_MUTEX(disk_events_mutex);
1424 : : static LIST_HEAD(disk_events);
1425 : :
1426 : : /* disable in-kernel polling by default */
1427 : : static unsigned long disk_events_dfl_poll_msecs = 0;
1428 : :
1429 : 0 : static unsigned long disk_events_poll_jiffies(struct gendisk *disk)
1430 : : {
1431 : 39093 : struct disk_events *ev = disk->ev;
1432 : : long intv_msecs = 0;
1433 : :
1434 : : /*
1435 : : * If device-specific poll interval is set, always use it. If
1436 : : * the default is being used, poll iff there are events which
1437 : : * can't be monitored asynchronously.
1438 : : */
1439 [ - + ]: 39093 : if (ev->poll_msecs >= 0)
1440 : : intv_msecs = ev->poll_msecs;
1441 [ # # ]: 0 : else if (disk->events & ~disk->async_events)
1442 : 0 : intv_msecs = disk_events_dfl_poll_msecs;
1443 : :
1444 : 39093 : return msecs_to_jiffies(intv_msecs);
1445 : : }
1446 : :
1447 : : /**
1448 : : * disk_block_events - block and flush disk event checking
1449 : : * @disk: disk to block events for
1450 : : *
1451 : : * On return from this function, it is guaranteed that event checking
1452 : : * isn't in progress and won't happen until unblocked by
1453 : : * disk_unblock_events(). Events blocking is counted and the actual
1454 : : * unblocking happens after the matching number of unblocks are done.
1455 : : *
1456 : : * Note that this intentionally does not block event checking from
1457 : : * disk_clear_events().
1458 : : *
1459 : : * CONTEXT:
1460 : : * Might sleep.
1461 : : */
1462 : 0 : void disk_block_events(struct gendisk *disk)
1463 : : {
1464 : 276 : struct disk_events *ev = disk->ev;
1465 : : unsigned long flags;
1466 : : bool cancel;
1467 : :
1468 [ + - ]: 276 : if (!ev)
1469 : 276 : return;
1470 : :
1471 : : /*
1472 : : * Outer mutex ensures that the first blocker completes canceling
1473 : : * the event work before further blockers are allowed to finish.
1474 : : */
1475 : 276 : mutex_lock(&ev->block_mutex);
1476 : :
1477 : 276 : spin_lock_irqsave(&ev->lock, flags);
1478 : 276 : cancel = !ev->block++;
1479 : : spin_unlock_irqrestore(&ev->lock, flags);
1480 : :
1481 [ + - ]: 276 : if (cancel)
1482 : 276 : cancel_delayed_work_sync(&disk->ev->dwork);
1483 : :
1484 : 276 : mutex_unlock(&ev->block_mutex);
1485 : : }
1486 : :
1487 : 0 : static void __disk_unblock_events(struct gendisk *disk, bool check_now)
1488 : : {
1489 : 276 : struct disk_events *ev = disk->ev;
1490 : : unsigned long intv;
1491 : : unsigned long flags;
1492 : :
1493 : 276 : spin_lock_irqsave(&ev->lock, flags);
1494 : :
1495 [ - + ][ # # ]: 276 : if (WARN_ON_ONCE(ev->block <= 0))
[ # # ][ + - ]
1496 : : goto out_unlock;
1497 : :
1498 [ + - ]: 276 : if (--ev->block)
1499 : : goto out_unlock;
1500 : :
1501 : : /*
1502 : : * Not exactly a latency critical operation, set poll timer
1503 : : * slack to 25% and kick event check.
1504 : : */
1505 : 276 : intv = disk_events_poll_jiffies(disk);
1506 : 276 : set_timer_slack(&ev->dwork.timer, intv / 4);
1507 [ - + ]: 276 : if (check_now)
1508 : 0 : queue_delayed_work(system_freezable_power_efficient_wq,
1509 : : &ev->dwork, 0);
1510 [ + - ]: 276 : else if (intv)
1511 : 276 : queue_delayed_work(system_freezable_power_efficient_wq,
1512 : : &ev->dwork, intv);
1513 : : out_unlock:
1514 : : spin_unlock_irqrestore(&ev->lock, flags);
1515 : 276 : }
1516 : :
1517 : : /**
1518 : : * disk_unblock_events - unblock disk event checking
1519 : : * @disk: disk to unblock events for
1520 : : *
1521 : : * Undo disk_block_events(). When the block count reaches zero, it
1522 : : * starts events polling if configured.
1523 : : *
1524 : : * CONTEXT:
1525 : : * Don't care. Safe to call from irq context.
1526 : : */
1527 : 0 : void disk_unblock_events(struct gendisk *disk)
1528 : : {
1529 [ + - ]: 276 : if (disk->ev)
1530 : 276 : __disk_unblock_events(disk, false);
1531 : 0 : }
1532 : :
1533 : : /**
1534 : : * disk_flush_events - schedule immediate event checking and flushing
1535 : : * @disk: disk to check and flush events for
1536 : : * @mask: events to flush
1537 : : *
1538 : : * Schedule immediate event checking on @disk if not blocked. Events in
1539 : : * @mask are scheduled to be cleared from the driver. Note that this
1540 : : * doesn't clear the events from @disk->ev.
1541 : : *
1542 : : * CONTEXT:
1543 : : * If @mask is non-zero must be called with bdev->bd_mutex held.
1544 : : */
1545 : 0 : void disk_flush_events(struct gendisk *disk, unsigned int mask)
1546 : : {
1547 : 276 : struct disk_events *ev = disk->ev;
1548 : :
1549 [ + - ]: 276 : if (!ev)
1550 : 276 : return;
1551 : :
1552 : : spin_lock_irq(&ev->lock);
1553 : 276 : ev->clearing |= mask;
1554 [ + - ]: 276 : if (!ev->block)
1555 : 276 : mod_delayed_work(system_freezable_power_efficient_wq,
1556 : : &ev->dwork, 0);
1557 : : spin_unlock_irq(&ev->lock);
1558 : : }
1559 : :
1560 : : /**
1561 : : * disk_clear_events - synchronously check, clear and return pending events
1562 : : * @disk: disk to fetch and clear events from
1563 : : * @mask: mask of events to be fetched and clearted
1564 : : *
1565 : : * Disk events are synchronously checked and pending events in @mask
1566 : : * are cleared and returned. This ignores the block count.
1567 : : *
1568 : : * CONTEXT:
1569 : : * Might sleep.
1570 : : */
1571 : 0 : unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask)
1572 : : {
1573 : 0 : const struct block_device_operations *bdops = disk->fops;
1574 : 0 : struct disk_events *ev = disk->ev;
1575 : : unsigned int pending;
1576 : 0 : unsigned int clearing = mask;
1577 : :
1578 [ # # ]: 0 : if (!ev) {
1579 : : /* for drivers still using the old ->media_changed method */
1580 [ # # ][ # # ]: 0 : if ((mask & DISK_EVENT_MEDIA_CHANGE) &&
1581 [ # # ]: 0 : bdops->media_changed && bdops->media_changed(disk))
1582 : : return DISK_EVENT_MEDIA_CHANGE;
1583 : : return 0;
1584 : : }
1585 : :
1586 : 0 : disk_block_events(disk);
1587 : :
1588 : : /*
1589 : : * store the union of mask and ev->clearing on the stack so that the
1590 : : * race with disk_flush_events does not cause ambiguity (ev->clearing
1591 : : * can still be modified even if events are blocked).
1592 : : */
1593 : : spin_lock_irq(&ev->lock);
1594 : 0 : clearing |= ev->clearing;
1595 : 0 : ev->clearing = 0;
1596 : : spin_unlock_irq(&ev->lock);
1597 : :
1598 : 0 : disk_check_events(ev, &clearing);
1599 : : /*
1600 : : * if ev->clearing is not 0, the disk_flush_events got called in the
1601 : : * middle of this function, so we want to run the workfn without delay.
1602 : : */
1603 : 0 : __disk_unblock_events(disk, ev->clearing ? true : false);
1604 : :
1605 : : /* then, fetch and clear pending events */
1606 : : spin_lock_irq(&ev->lock);
1607 : 0 : pending = ev->pending & mask;
1608 : 0 : ev->pending &= ~mask;
1609 : : spin_unlock_irq(&ev->lock);
1610 [ # # ][ # # ]: 0 : WARN_ON_ONCE(clearing & mask);
[ # # ]
1611 : :
1612 : 0 : return pending;
1613 : : }
1614 : :
1615 : : /*
1616 : : * Separate this part out so that a different pointer for clearing_ptr can be
1617 : : * passed in for disk_clear_events.
1618 : : */
1619 : 0 : static void disk_events_workfn(struct work_struct *work)
1620 : : {
1621 : : struct delayed_work *dwork = to_delayed_work(work);
1622 : 38818 : struct disk_events *ev = container_of(dwork, struct disk_events, dwork);
1623 : :
1624 : 38818 : disk_check_events(ev, &ev->clearing);
1625 : 38817 : }
1626 : :
1627 : 0 : static void disk_check_events(struct disk_events *ev,
1628 : : unsigned int *clearing_ptr)
1629 : : {
1630 : 38818 : struct gendisk *disk = ev->disk;
1631 : 38818 : char *envp[ARRAY_SIZE(disk_uevents) + 1] = { };
1632 : 38818 : unsigned int clearing = *clearing_ptr;
1633 : : unsigned int events;
1634 : : unsigned long intv;
1635 : : int nr_events = 0, i;
1636 : :
1637 : : /* check events */
1638 : 38818 : events = disk->fops->check_events(disk, clearing);
1639 : :
1640 : : /* accumulate pending events and schedule next poll if necessary */
1641 : : spin_lock_irq(&ev->lock);
1642 : :
1643 : 38817 : events &= ~ev->pending;
1644 : 38817 : ev->pending |= events;
1645 : 38817 : *clearing_ptr &= ~clearing;
1646 : :
1647 : 38817 : intv = disk_events_poll_jiffies(disk);
1648 [ + + ][ + - ]: 38817 : if (!ev->block && intv)
1649 : 38815 : queue_delayed_work(system_freezable_power_efficient_wq,
1650 : : &ev->dwork, intv);
1651 : :
1652 : : spin_unlock_irq(&ev->lock);
1653 : :
1654 : : /*
1655 : : * Tell userland about new events. Only the events listed in
1656 : : * @disk->events are reported. Unlisted events are processed the
1657 : : * same internally but never get reported to userland.
1658 : : */
1659 [ + + ]: 155269 : for (i = 0; i < ARRAY_SIZE(disk_uevents); i++)
1660 [ - + ]: 77634 : if (events & disk->events & (1 << i))
1661 : 0 : envp[nr_events++] = disk_uevents[i];
1662 : :
1663 [ - + ]: 38817 : if (nr_events)
1664 : 0 : kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp);
1665 : 38817 : }
1666 : :
1667 : : /*
1668 : : * A disk events enabled device has the following sysfs nodes under
1669 : : * its /sys/block/X/ directory.
1670 : : *
1671 : : * events : list of all supported events
1672 : : * events_async : list of events which can be detected w/o polling
1673 : : * events_poll_msecs : polling interval, 0: disable, -1: system default
1674 : : */
1675 : 0 : static ssize_t __disk_events_show(unsigned int events, char *buf)
1676 : : {
1677 : : const char *delim = "";
1678 : : ssize_t pos = 0;
1679 : : int i;
1680 : :
1681 [ # # ]: 0 : for (i = 0; i < ARRAY_SIZE(disk_events_strs); i++)
1682 [ # # ]: 0 : if (events & (1 << i)) {
1683 : 0 : pos += sprintf(buf + pos, "%s%s",
1684 : : delim, disk_events_strs[i]);
1685 : : delim = " ";
1686 : : }
1687 [ # # ]: 0 : if (pos)
1688 : 0 : pos += sprintf(buf + pos, "\n");
1689 : 0 : return pos;
1690 : : }
1691 : :
1692 : 0 : static ssize_t disk_events_show(struct device *dev,
1693 : : struct device_attribute *attr, char *buf)
1694 : : {
1695 : : struct gendisk *disk = dev_to_disk(dev);
1696 : :
1697 : 0 : return __disk_events_show(disk->events, buf);
1698 : : }
1699 : :
1700 : 0 : static ssize_t disk_events_async_show(struct device *dev,
1701 : : struct device_attribute *attr, char *buf)
1702 : : {
1703 : : struct gendisk *disk = dev_to_disk(dev);
1704 : :
1705 : 0 : return __disk_events_show(disk->async_events, buf);
1706 : : }
1707 : :
1708 : 0 : static ssize_t disk_events_poll_msecs_show(struct device *dev,
1709 : : struct device_attribute *attr,
1710 : : char *buf)
1711 : : {
1712 : : struct gendisk *disk = dev_to_disk(dev);
1713 : :
1714 : 0 : return sprintf(buf, "%ld\n", disk->ev->poll_msecs);
1715 : : }
1716 : :
1717 : 0 : static ssize_t disk_events_poll_msecs_store(struct device *dev,
1718 : : struct device_attribute *attr,
1719 : : const char *buf, size_t count)
1720 : : {
1721 : 0 : struct gendisk *disk = dev_to_disk(dev);
1722 : : long intv;
1723 : :
1724 [ # # ][ # # ]: 0 : if (!count || !sscanf(buf, "%ld", &intv))
1725 : : return -EINVAL;
1726 : :
1727 [ # # ]: 0 : if (intv < 0 && intv != -1)
1728 : : return -EINVAL;
1729 : :
1730 : 0 : disk_block_events(disk);
1731 : 0 : disk->ev->poll_msecs = intv;
1732 : 0 : __disk_unblock_events(disk, true);
1733 : :
1734 : 0 : return count;
1735 : : }
1736 : :
1737 : : static const DEVICE_ATTR(events, S_IRUGO, disk_events_show, NULL);
1738 : : static const DEVICE_ATTR(events_async, S_IRUGO, disk_events_async_show, NULL);
1739 : : static const DEVICE_ATTR(events_poll_msecs, S_IRUGO|S_IWUSR,
1740 : : disk_events_poll_msecs_show,
1741 : : disk_events_poll_msecs_store);
1742 : :
1743 : : static const struct attribute *disk_events_attrs[] = {
1744 : : &dev_attr_events.attr,
1745 : : &dev_attr_events_async.attr,
1746 : : &dev_attr_events_poll_msecs.attr,
1747 : : NULL,
1748 : : };
1749 : :
1750 : : /*
1751 : : * The default polling interval can be specified by the kernel
1752 : : * parameter block.events_dfl_poll_msecs which defaults to 0
1753 : : * (disable). This can also be modified runtime by writing to
1754 : : * /sys/module/block/events_dfl_poll_msecs.
1755 : : */
1756 : 0 : static int disk_events_set_dfl_poll_msecs(const char *val,
1757 : : const struct kernel_param *kp)
1758 : : {
1759 : : struct disk_events *ev;
1760 : : int ret;
1761 : :
1762 : 0 : ret = param_set_ulong(val, kp);
1763 [ # # ]: 0 : if (ret < 0)
1764 : : return ret;
1765 : :
1766 : 0 : mutex_lock(&disk_events_mutex);
1767 : :
1768 [ # # ]: 0 : list_for_each_entry(ev, &disk_events, node)
1769 : 0 : disk_flush_events(ev->disk, 0);
1770 : :
1771 : 0 : mutex_unlock(&disk_events_mutex);
1772 : :
1773 : 0 : return 0;
1774 : : }
1775 : :
1776 : : static const struct kernel_param_ops disk_events_dfl_poll_msecs_param_ops = {
1777 : : .set = disk_events_set_dfl_poll_msecs,
1778 : : .get = param_get_ulong,
1779 : : };
1780 : :
1781 : : #undef MODULE_PARAM_PREFIX
1782 : : #define MODULE_PARAM_PREFIX "block."
1783 : :
1784 : : module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops,
1785 : : &disk_events_dfl_poll_msecs, 0644);
1786 : :
1787 : : /*
1788 : : * disk_{alloc|add|del|release}_events - initialize and destroy disk_events.
1789 : : */
1790 : 0 : static void disk_alloc_events(struct gendisk *disk)
1791 : : {
1792 : : struct disk_events *ev;
1793 : :
1794 [ # # ]: 0 : if (!disk->fops->check_events)
1795 : : return;
1796 : :
1797 : : ev = kzalloc(sizeof(*ev), GFP_KERNEL);
1798 [ # # ]: 0 : if (!ev) {
1799 : 0 : pr_warn("%s: failed to initialize events\n", disk->disk_name);
1800 : 0 : return;
1801 : : }
1802 : :
1803 : 0 : INIT_LIST_HEAD(&ev->node);
1804 : 0 : ev->disk = disk;
1805 : 0 : spin_lock_init(&ev->lock);
1806 : 0 : mutex_init(&ev->block_mutex);
1807 : 0 : ev->block = 1;
1808 : 0 : ev->poll_msecs = -1;
1809 : 0 : INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
1810 : :
1811 : 0 : disk->ev = ev;
1812 : : }
1813 : :
1814 : 0 : static void disk_add_events(struct gendisk *disk)
1815 : : {
1816 [ # # ]: 0 : if (!disk->ev)
1817 : 0 : return;
1818 : :
1819 : : /* FIXME: error handling */
1820 [ # # ]: 0 : if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0)
1821 : 0 : pr_warn("%s: failed to create sysfs files for events\n",
1822 : : disk->disk_name);
1823 : :
1824 : 0 : mutex_lock(&disk_events_mutex);
1825 : 0 : list_add_tail(&disk->ev->node, &disk_events);
1826 : 0 : mutex_unlock(&disk_events_mutex);
1827 : :
1828 : : /*
1829 : : * Block count is initialized to 1 and the following initial
1830 : : * unblock kicks it into action.
1831 : : */
1832 : 0 : __disk_unblock_events(disk, true);
1833 : : }
1834 : :
1835 : 0 : static void disk_del_events(struct gendisk *disk)
1836 : : {
1837 [ # # ]: 0 : if (!disk->ev)
1838 : 0 : return;
1839 : :
1840 : 0 : disk_block_events(disk);
1841 : :
1842 : 0 : mutex_lock(&disk_events_mutex);
1843 : 0 : list_del_init(&disk->ev->node);
1844 : 0 : mutex_unlock(&disk_events_mutex);
1845 : :
1846 : 0 : sysfs_remove_files(&disk_to_dev(disk)->kobj, disk_events_attrs);
1847 : : }
1848 : :
1849 : 0 : static void disk_release_events(struct gendisk *disk)
1850 : : {
1851 : : /* the block count should be 1 from disk_del_events() */
1852 [ # # ][ # # ]: 0 : WARN_ON_ONCE(disk->ev && disk->ev->block != 1);
[ # # ][ # # ]
[ # # ]
1853 : 0 : kfree(disk->ev);
1854 : 0 : }
|