Lines Matching +full:full +full:- +full:hd

1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/backing-dev.h>
64 kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp); in set_capacity_revalidate_and_notify()
77 char *disk_name(struct gendisk *hd, int partno, char *buf) in disk_name() argument
80 snprintf(buf, BDEVNAME_SIZE, "%s", hd->disk_name); in disk_name()
81 else if (isdigit(hd->disk_name[strlen(hd->disk_name)-1])) in disk_name()
82 snprintf(buf, BDEVNAME_SIZE, "%sp%d", hd->disk_name, partno); in disk_name()
84 snprintf(buf, BDEVNAME_SIZE, "%s%d", hd->disk_name, partno); in disk_name()
91 return disk_name(bdev->bd_disk, bdev->bd_partno, buf); in bdevname()
101 struct disk_stats *ptr = per_cpu_ptr(part->dkstats, cpu); in part_stat_read_all()
105 stat->nsecs[group] += ptr->nsecs[group]; in part_stat_read_all()
106 stat->sectors[group] += ptr->sectors[group]; in part_stat_read_all()
107 stat->ios[group] += ptr->ios[group]; in part_stat_read_all()
108 stat->merges[group] += ptr->merges[group]; in part_stat_read_all()
111 stat->io_ticks += ptr->io_ticks; in part_stat_read_all()
148 struct disk_part_tbl *ptbl = rcu_dereference(disk->part_tbl); in __disk_get_part()
150 if (unlikely(partno < 0 || partno >= ptbl->len)) in __disk_get_part()
152 return rcu_dereference(ptbl->part[partno]); in __disk_get_part()
156 * disk_get_part - get partition
183 * disk_part_iter_init - initialize partition iterator
199 ptbl = rcu_dereference(disk->part_tbl); in disk_part_iter_init()
201 piter->disk = disk; in disk_part_iter_init()
202 piter->part = NULL; in disk_part_iter_init()
205 piter->idx = ptbl->len - 1; in disk_part_iter_init()
207 piter->idx = 0; in disk_part_iter_init()
209 piter->idx = 1; in disk_part_iter_init()
211 piter->flags = flags; in disk_part_iter_init()
218 * disk_part_iter_next - proceed iterator to the next partition and return it
232 disk_put_part(piter->part); in disk_part_iter_next()
233 piter->part = NULL; in disk_part_iter_next()
237 ptbl = rcu_dereference(piter->disk->part_tbl); in disk_part_iter_next()
240 if (piter->flags & DISK_PITER_REVERSE) { in disk_part_iter_next()
241 inc = -1; in disk_part_iter_next()
242 if (piter->flags & (DISK_PITER_INCL_PART0 | in disk_part_iter_next()
244 end = -1; in disk_part_iter_next()
249 end = ptbl->len; in disk_part_iter_next()
253 for (; piter->idx != end; piter->idx += inc) { in disk_part_iter_next()
256 part = rcu_dereference(ptbl->part[piter->idx]); in disk_part_iter_next()
260 piter->part = part; in disk_part_iter_next()
262 !(piter->flags & DISK_PITER_INCL_EMPTY) && in disk_part_iter_next()
263 !(piter->flags & DISK_PITER_INCL_EMPTY_PART0 && in disk_part_iter_next()
264 piter->idx == 0)) { in disk_part_iter_next()
266 piter->part = NULL; in disk_part_iter_next()
270 piter->idx += inc; in disk_part_iter_next()
276 return piter->part; in disk_part_iter_next()
281 * disk_part_iter_exit - finish up partition iteration
291 disk_put_part(piter->part); in disk_part_iter_exit()
292 piter->part = NULL; in disk_part_iter_exit()
298 return part->start_sect <= sector && in sector_in_part()
299 sector < part->start_sect + part_nr_sects_read(part); in sector_in_part()
303 * disk_map_sector_rcu - map sector to partition
326 ptbl = rcu_dereference(disk->part_tbl); in disk_map_sector_rcu()
328 part = rcu_dereference(ptbl->last_lookup); in disk_map_sector_rcu()
332 for (i = 1; i < ptbl->len; i++) { in disk_map_sector_rcu()
333 part = rcu_dereference(ptbl->part[i]); in disk_map_sector_rcu()
338 * so use-after-free on cached & deleting partition in disk_map_sector_rcu()
343 rcu_assign_pointer(ptbl->last_lookup, part); in disk_map_sector_rcu()
348 part = &disk->part0; in disk_map_sector_rcu()
364 * True if the gendisk has at least one valid non-zero size partition.
374 ptbl = rcu_dereference(disk->part_tbl); in disk_has_partitions()
377 for (i = 1; i < ptbl->len; i++) { in disk_has_partitions()
378 if (rcu_dereference(ptbl->part[i])) { in disk_has_partitions()
401 /* index in the above - for now: assume no multimajor ranges */
413 for (dp = major_names[major_to_index(offset)]; dp; dp = dp->next) in blkdev_show()
414 if (dp->major == offset) in blkdev_show()
415 seq_printf(seqf, "%3d %s\n", dp->major, dp->name); in blkdev_show()
421 * register_blkdev - register a new block device
423 * @major: the requested major device number [1..BLKDEV_MAJOR_MAX-1]. If
431 * - if a major device number was requested in range [1..BLKDEV_MAJOR_MAX-1]
433 * - if any unused major number was requested with @major = 0 parameter
435 * [1..BLKDEV_MAJOR_MAX-1] or a negative error code otherwise
437 * See Documentation/admin-guide/devices.txt for the list of allocated
449 for (index = ARRAY_SIZE(major_names)-1; index > 0; index--) { in register_blkdev()
457 ret = -EBUSY; in register_blkdev()
466 __func__, major, BLKDEV_MAJOR_MAX-1, name); in register_blkdev()
468 ret = -EINVAL; in register_blkdev()
474 ret = -ENOMEM; in register_blkdev()
478 p->major = major; in register_blkdev()
479 strlcpy(p->name, name, sizeof(p->name)); in register_blkdev()
480 p->next = NULL; in register_blkdev()
483 for (n = &major_names[index]; *n; n = &(*n)->next) { in register_blkdev()
484 if ((*n)->major == major) in register_blkdev()
490 ret = -EBUSY; in register_blkdev()
511 for (n = &major_names[index]; *n; n = &(*n)->next) in unregister_blkdev()
512 if ((*n)->major == major) in unregister_blkdev()
514 if (!*n || strcmp((*n)->name, name)) { in unregister_blkdev()
518 *n = p->next; in unregister_blkdev()
529 * blk_mangle_minor - scatter minor numbers apart
548 int high = minor & (1 << (MINORBITS - 1 - i)); in blk_mangle_minor()
549 int distance = MINORBITS - 1 - 2 * i; in blk_mangle_minor()
561 * blk_alloc_devt - allocate a dev_t for a partition
568 * 0 on success, allocated dev_t is returned in *@devt. -errno on
580 if (part->partno < disk->minors) { in blk_alloc_devt()
581 *devt = MKDEV(disk->major, disk->first_minor + part->partno); in blk_alloc_devt()
594 return idx == -ENOSPC ? -EBUSY : idx; in blk_alloc_devt()
601 * blk_free_devt - free a dev_t
638 snprintf(buf, BDEVT_SIZE, "%-9s", tbuf); in bdevt_str()
646 * Register device numbers dev..(dev+range-1)
670 return &disk_to_dev(p)->kobj; in exact_match()
678 return -1; in exact_lock()
689 set_bit(GD_NEED_PART_SCAN, &disk->state); in disk_scan_partitions()
703 ddev->parent = parent; in register_disk()
705 dev_set_name(ddev, "%s", disk->disk_name); in register_disk()
711 WARN_ON(ddev->groups); in register_disk()
712 ddev->groups = groups; in register_disk()
717 err = sysfs_create_link(block_depr, &ddev->kobj, in register_disk()
718 kobject_name(&ddev->kobj)); in register_disk()
732 disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj); in register_disk()
733 disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); in register_disk()
735 if (disk->flags & GENHD_FL_HIDDEN) in register_disk()
742 kobject_uevent(&ddev->kobj, KOBJ_ADD); in register_disk()
747 kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD); in register_disk()
750 if (disk->queue->backing_dev_info->dev) { in register_disk()
751 err = sysfs_create_link(&ddev->kobj, in register_disk()
752 &disk->queue->backing_dev_info->dev->kobj, in register_disk()
759 * __device_add_disk - add disk information to kernel list
761 * @disk: per-device partitioning information
762 * @groups: Additional per-device sysfs groups
784 elevator_init_mq(disk->queue); in __device_add_disk()
790 WARN_ON(disk->minors && !(disk->major || disk->first_minor)); in __device_add_disk()
791 WARN_ON(!disk->minors && in __device_add_disk()
792 !(disk->flags & (GENHD_FL_EXT_DEVT | GENHD_FL_HIDDEN))); in __device_add_disk()
794 disk->flags |= GENHD_FL_UP; in __device_add_disk()
796 retval = blk_alloc_devt(&disk->part0, &devt); in __device_add_disk()
801 disk->major = MAJOR(devt); in __device_add_disk()
802 disk->first_minor = MINOR(devt); in __device_add_disk()
806 if (disk->flags & GENHD_FL_HIDDEN) { in __device_add_disk()
811 disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO; in __device_add_disk()
812 disk->flags |= GENHD_FL_NO_PART_SCAN; in __device_add_disk()
814 struct backing_dev_info *bdi = disk->queue->backing_dev_info; in __device_add_disk()
819 dev->devt = devt; in __device_add_disk()
823 blk_register_region(disk_devt(disk), disk->minors, NULL, in __device_add_disk()
834 WARN_ON_ONCE(!blk_get_queue(disk->queue)); in __device_add_disk()
869 remove_inode_hash(bdev->bd_inode); in invalidate_partition()
874 * del_gendisk - remove the gendisk
906 down_write(&disk->lookup_sem); in del_gendisk()
911 invalidate_partition(disk, part->partno); in del_gendisk()
918 disk->flags &= ~GENHD_FL_UP; in del_gendisk()
919 up_write(&disk->lookup_sem); in del_gendisk()
921 if (!(disk->flags & GENHD_FL_HIDDEN)) in del_gendisk()
922 sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); in del_gendisk()
923 if (disk->queue) { in del_gendisk()
928 if (!(disk->flags & GENHD_FL_HIDDEN)) in del_gendisk()
929 bdi_unregister(disk->queue->backing_dev_info); in del_gendisk()
935 if (!(disk->flags & GENHD_FL_HIDDEN)) in del_gendisk()
936 blk_unregister_region(disk_devt(disk), disk->minors); in del_gendisk()
940 * use-after-free issues. Note that the device number stays in del_gendisk()
941 * "in-use" until we really free the gendisk. in del_gendisk()
945 kobject_put(disk->part0.holder_dir); in del_gendisk()
946 kobject_put(disk->slave_dir); in del_gendisk()
948 part_stat_set_all(&disk->part0, 0); in del_gendisk()
949 disk->part0.stamp = 0; in del_gendisk()
957 /* sysfs access to bad-blocks list. */
964 if (!disk->bb) in disk_badblocks_show()
967 return badblocks_show(disk->bb, page, 0); in disk_badblocks_show()
976 if (!disk->bb) in disk_badblocks_store()
977 return -ENXIO; in disk_badblocks_store()
979 return badblocks_store(disk->bb, page, len, 0); in disk_badblocks_store()
983 * get_gendisk - get partitioning information for a given device
1010 *partno = part->partno; in get_gendisk()
1023 down_read(&disk->lookup_sem); in get_gendisk()
1024 if (unlikely((disk->flags & GENHD_FL_HIDDEN) || in get_gendisk()
1025 !(disk->flags & GENHD_FL_UP))) { in get_gendisk()
1026 up_read(&disk->lookup_sem); in get_gendisk()
1030 up_read(&disk->lookup_sem); in get_gendisk()
1036 * bdget_disk - do bdget() by gendisk and partition number
1063 * print a full list of all partitions - intended for places where the root
1085 (disk->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)) in printk_all_partitions()
1090 * numbers in hex - the same format as the root= in printk_all_partitions()
1095 bool is_part0 = part == &disk->part0; in printk_all_partitions()
1100 , disk_name(disk, part->partno, name_buf), in printk_all_partitions()
1101 part->info ? part->info->uuid : ""); in printk_all_partitions()
1103 if (dev->parent && dev->parent->driver) in printk_all_partitions()
1105 dev->parent->driver->name); in printk_all_partitions()
1126 return ERR_PTR(-ENOMEM); in disk_seqf_start()
1128 seqf->private = iter; in disk_seqf_start()
1134 } while (skip--); in disk_seqf_start()
1144 dev = class_dev_iter_next(seqf->private); in disk_seqf_next()
1153 struct class_dev_iter *iter = seqf->private; in disk_seqf_stop()
1155 /* stop is called even after start failed :-( */ in disk_seqf_stop()
1159 seqf->private = NULL; in disk_seqf_stop()
1180 /* Don't show non-partitionable removeable devices or empty devices */ in show_partition()
1182 (sgp->flags & GENHD_FL_REMOVABLE))) in show_partition()
1184 if (sgp->flags & GENHD_FL_SUPPRESS_PARTITION_INFO) in show_partition()
1187 /* show the full disk and all non-0 size partitions of it */ in show_partition()
1193 disk_name(sgp, part->partno, buf)); in show_partition()
1210 if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0) in base_probe()
1211 /* Make old-style 2.4 aliases work */ in base_probe()
1212 request_module("block-major-%d", MAJOR(devt)); in base_probe()
1229 /* create top-level block dir */ in genhd_device_init()
1242 return sprintf(buf, "%d\n", disk->minors); in disk_range_show()
1259 (disk->flags & GENHD_FL_REMOVABLE ? 1 : 0)); in disk_removable_show()
1268 (disk->flags & GENHD_FL_HIDDEN ? 1 : 0)); in disk_hidden_show()
1292 struct request_queue *q = part_to_disk(p)->queue; in part_stat_show()
1336 struct request_queue *q = part_to_disk(p)->queue; in part_inflight_show()
1352 return sprintf(buf, "%x\n", disk->flags); in disk_capability_show()
1361 return sprintf(buf, "%d\n", queue_alignment_offset(disk->queue)); in disk_alignment_offset_show()
1370 return sprintf(buf, "%d\n", queue_discard_alignment(disk->queue)); in disk_discard_alignment_show()
1392 return sprintf(buf, "%d\n", p->make_it_fail); in part_fail_show()
1403 p->make_it_fail = (i == 0) ? 0 : 1; in part_fail_store()
1409 __ATTR(make-it-fail, 0644, part_fail_show, part_fail_store);
1414 __ATTR(io-timeout-fail, 0644, part_timeout_show, part_timeout_store);
1444 if (a == &dev_attr_badblocks.attr && !disk->bb) in disk_visible()
1446 return a->mode; in disk_visible()
1460 * disk_replace_part_tbl - replace disk->part_tbl in RCU-safe way
1464 * Replace disk->part_tbl with @new_ptbl in RCU-safe way. The
1474 rcu_dereference_protected(disk->part_tbl, 1); in disk_replace_part_tbl()
1476 rcu_assign_pointer(disk->part_tbl, new_ptbl); in disk_replace_part_tbl()
1479 rcu_assign_pointer(old_ptbl->last_lookup, NULL); in disk_replace_part_tbl()
1485 * disk_expand_part_tbl - expand disk->part_tbl
1489 * Expand disk->part_tbl such that @partno can fit in. disk->part_tbl
1497 * 0 on success, -errno on failure.
1502 rcu_dereference_protected(disk->part_tbl, 1); in disk_expand_part_tbl()
1504 int len = old_ptbl ? old_ptbl->len : 0; in disk_expand_part_tbl()
1513 return -EINVAL; in disk_expand_part_tbl()
1517 return -EINVAL; in disk_expand_part_tbl()
1523 disk->node_id); in disk_expand_part_tbl()
1525 return -ENOMEM; in disk_expand_part_tbl()
1527 new_ptbl->len = target; in disk_expand_part_tbl()
1530 rcu_assign_pointer(new_ptbl->part[i], old_ptbl->part[i]); in disk_expand_part_tbl()
1537 * disk_release - releases all allocated resources of the gendisk
1561 blk_free_devt(dev->devt); in disk_release()
1563 kfree(disk->random); in disk_release()
1565 hd_free_part(&disk->part0); in disk_release()
1566 if (disk->queue) in disk_release()
1567 blk_put_queue(disk->queue); in disk_release()
1579 if (disk->fops->devnode) in block_devnode()
1580 return disk->fops->devnode(disk, mode); in block_devnode()
1603 struct hd_struct *hd; in diskstats_show() local
1609 if (&disk_to_dev(gp)->kobj.entry == block_class.devices.next) in diskstats_show()
1617 while ((hd = disk_part_iter_next(&piter))) { in diskstats_show()
1618 part_stat_read_all(hd, &stat); in diskstats_show()
1619 if (queue_is_mq(gp->queue)) in diskstats_show()
1620 inflight = blk_mq_in_flight(gp->queue, hd); in diskstats_show()
1622 inflight = part_in_flight(hd); in diskstats_show()
1631 MAJOR(part_devt(hd)), MINOR(part_devt(hd)), in diskstats_show()
1632 disk_name(gp, hd->partno, buf), in diskstats_show()
1695 if (partno < disk->minors) { in blk_lookup_devt()
1699 devt = MKDEV(MAJOR(dev->devt), in blk_lookup_devt()
1700 MINOR(dev->devt) + partno); in blk_lookup_devt()
1731 disk->part0.dkstats = alloc_percpu(struct disk_stats); in __alloc_disk_node()
1732 if (!disk->part0.dkstats) in __alloc_disk_node()
1735 init_rwsem(&disk->lookup_sem); in __alloc_disk_node()
1736 disk->node_id = node_id; in __alloc_disk_node()
1738 free_percpu(disk->part0.dkstats); in __alloc_disk_node()
1742 ptbl = rcu_dereference_protected(disk->part_tbl, 1); in __alloc_disk_node()
1743 rcu_assign_pointer(ptbl->part[0], &disk->part0); in __alloc_disk_node()
1747 * seqcounter to read/update the part0->nr_sects. Still init in __alloc_disk_node()
1754 hd_sects_seq_init(&disk->part0); in __alloc_disk_node()
1755 if (hd_ref_init(&disk->part0)) in __alloc_disk_node()
1758 disk->minors = minors; in __alloc_disk_node()
1760 disk_to_dev(disk)->class = &block_class; in __alloc_disk_node()
1761 disk_to_dev(disk)->type = &disk_type; in __alloc_disk_node()
1766 hd_free_part(&disk->part0); in __alloc_disk_node()
1774 * get_disk_and_module - increments the gendisk and gendisk fops module refcount
1787 if (!disk->fops) in get_disk_and_module()
1789 owner = disk->fops->owner; in get_disk_and_module()
1792 kobj = kobject_get_unless_zero(&disk_to_dev(disk)->kobj); in get_disk_and_module()
1803 * put_disk - decrements the gendisk refcount
1815 kobject_put(&disk_to_dev(disk)->kobj); in put_disk()
1820 * put_disk_and_module - decrements the module and gendisk refcount
1832 struct module *owner = disk->fops->owner; in put_disk_and_module()
1847 kobject_uevent_env(&disk_to_dev(gd)->kobj, KOBJ_CHANGE, envp); in set_disk_ro_uevent()
1852 bdev->bd_part->policy = flag; in set_device_ro()
1862 if (disk->part0.policy != flag) { in set_disk_ro()
1864 disk->part0.policy = flag; in set_disk_ro()
1869 part->policy = flag; in set_disk_ro()
1879 return bdev->bd_part->policy; in bdev_read_only()
1885 * Disk events - monitor disk events like media change and eject request.
1897 long poll_msecs; /* interval, -1 for default */
1915 /* disable in-kernel polling by default */
1920 struct disk_events *ev = disk->ev; in disk_events_poll_jiffies()
1924 * If device-specific poll interval is set, always use it. If in disk_events_poll_jiffies()
1927 if (ev->poll_msecs >= 0) in disk_events_poll_jiffies()
1928 intv_msecs = ev->poll_msecs; in disk_events_poll_jiffies()
1929 else if (disk->event_flags & DISK_EVENT_FLAG_POLL) in disk_events_poll_jiffies()
1936 * disk_block_events - block and flush disk event checking
1952 struct disk_events *ev = disk->ev; in disk_block_events()
1963 mutex_lock(&ev->block_mutex); in disk_block_events()
1965 spin_lock_irqsave(&ev->lock, flags); in disk_block_events()
1966 cancel = !ev->block++; in disk_block_events()
1967 spin_unlock_irqrestore(&ev->lock, flags); in disk_block_events()
1970 cancel_delayed_work_sync(&disk->ev->dwork); in disk_block_events()
1972 mutex_unlock(&ev->block_mutex); in disk_block_events()
1977 struct disk_events *ev = disk->ev; in __disk_unblock_events()
1981 spin_lock_irqsave(&ev->lock, flags); in __disk_unblock_events()
1983 if (WARN_ON_ONCE(ev->block <= 0)) in __disk_unblock_events()
1986 if (--ev->block) in __disk_unblock_events()
1992 &ev->dwork, 0); in __disk_unblock_events()
1995 &ev->dwork, intv); in __disk_unblock_events()
1997 spin_unlock_irqrestore(&ev->lock, flags); in __disk_unblock_events()
2001 * disk_unblock_events - unblock disk event checking
2012 if (disk->ev) in disk_unblock_events()
2017 * disk_flush_events - schedule immediate event checking and flushing
2023 * doesn't clear the events from @disk->ev.
2026 * If @mask is non-zero must be called with bdev->bd_mutex held.
2030 struct disk_events *ev = disk->ev; in disk_flush_events()
2035 spin_lock_irq(&ev->lock); in disk_flush_events()
2036 ev->clearing |= mask; in disk_flush_events()
2037 if (!ev->block) in disk_flush_events()
2039 &ev->dwork, 0); in disk_flush_events()
2040 spin_unlock_irq(&ev->lock); in disk_flush_events()
2044 * disk_clear_events - synchronously check, clear and return pending events
2056 struct disk_events *ev = disk->ev; in disk_clear_events()
2066 * store the union of mask and ev->clearing on the stack so that the in disk_clear_events()
2067 * race with disk_flush_events does not cause ambiguity (ev->clearing in disk_clear_events()
2070 spin_lock_irq(&ev->lock); in disk_clear_events()
2071 clearing |= ev->clearing; in disk_clear_events()
2072 ev->clearing = 0; in disk_clear_events()
2073 spin_unlock_irq(&ev->lock); in disk_clear_events()
2077 * if ev->clearing is not 0, the disk_flush_events got called in the in disk_clear_events()
2080 __disk_unblock_events(disk, ev->clearing ? true : false); in disk_clear_events()
2083 spin_lock_irq(&ev->lock); in disk_clear_events()
2084 pending = ev->pending & mask; in disk_clear_events()
2085 ev->pending &= ~mask; in disk_clear_events()
2086 spin_unlock_irq(&ev->lock); in disk_clear_events()
2093 * bdev_check_media_change - check if a removable media has been changed
2106 events = disk_clear_events(bdev->bd_disk, DISK_EVENT_MEDIA_CHANGE | in bdev_check_media_change()
2113 bdev->bd_disk->disk_name); in bdev_check_media_change()
2114 set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state); in bdev_check_media_change()
2128 disk_check_events(ev, &ev->clearing); in disk_events_workfn()
2134 struct gendisk *disk = ev->disk; in disk_check_events()
2142 events = disk->fops->check_events(disk, clearing); in disk_check_events()
2145 spin_lock_irq(&ev->lock); in disk_check_events()
2147 events &= ~ev->pending; in disk_check_events()
2148 ev->pending |= events; in disk_check_events()
2152 if (!ev->block && intv) in disk_check_events()
2154 &ev->dwork, intv); in disk_check_events()
2156 spin_unlock_irq(&ev->lock); in disk_check_events()
2160 * @disk->events are reported, and only if DISK_EVENT_FLAG_UEVENT in disk_check_events()
2165 if ((events & disk->events & (1 << i)) && in disk_check_events()
2166 (disk->event_flags & DISK_EVENT_FLAG_UEVENT)) in disk_check_events()
2170 kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp); in disk_check_events()
2180 * events_poll_msecs : polling interval, 0: disable, -1: system default
2204 if (!(disk->event_flags & DISK_EVENT_FLAG_UEVENT)) in disk_events_show()
2207 return __disk_events_show(disk->events, buf); in disk_events_show()
2222 if (!disk->ev) in disk_events_poll_msecs_show()
2223 return sprintf(buf, "-1\n"); in disk_events_poll_msecs_show()
2225 return sprintf(buf, "%ld\n", disk->ev->poll_msecs); in disk_events_poll_msecs_show()
2236 return -EINVAL; in disk_events_poll_msecs_store()
2238 if (intv < 0 && intv != -1) in disk_events_poll_msecs_store()
2239 return -EINVAL; in disk_events_poll_msecs_store()
2241 if (!disk->ev) in disk_events_poll_msecs_store()
2242 return -ENODEV; in disk_events_poll_msecs_store()
2245 disk->ev->poll_msecs = intv; in disk_events_poll_msecs_store()
2283 disk_flush_events(ev->disk, 0); in disk_events_set_dfl_poll_msecs()
2302 * disk_{alloc|add|del|release}_events - initialize and destroy disk_events.
2308 if (!disk->fops->check_events || !disk->events) in disk_alloc_events()
2313 pr_warn("%s: failed to initialize events\n", disk->disk_name); in disk_alloc_events()
2317 INIT_LIST_HEAD(&ev->node); in disk_alloc_events()
2318 ev->disk = disk; in disk_alloc_events()
2319 spin_lock_init(&ev->lock); in disk_alloc_events()
2320 mutex_init(&ev->block_mutex); in disk_alloc_events()
2321 ev->block = 1; in disk_alloc_events()
2322 ev->poll_msecs = -1; in disk_alloc_events()
2323 INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn); in disk_alloc_events()
2325 disk->ev = ev; in disk_alloc_events()
2331 if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0) in disk_add_events()
2333 disk->disk_name); in disk_add_events()
2335 if (!disk->ev) in disk_add_events()
2339 list_add_tail(&disk->ev->node, &disk_events); in disk_add_events()
2351 if (disk->ev) { in disk_del_events()
2355 list_del_init(&disk->ev->node); in disk_del_events()
2359 sysfs_remove_files(&disk_to_dev(disk)->kobj, disk_events_attrs); in disk_del_events()
2365 WARN_ON_ONCE(disk->ev && disk->ev->block != 1); in disk_release_events()
2366 kfree(disk->ev); in disk_release_events()