Lines Matching refs:disk
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);
60 struct hd_struct *disk_get_part(struct gendisk *disk, int partno) in disk_get_part() argument
70 ptbl = rcu_dereference(disk->part_tbl); in disk_get_part()
94 void disk_part_iter_init(struct disk_part_iter *piter, struct gendisk *disk, in disk_part_iter_init() argument
100 ptbl = rcu_dereference(disk->part_tbl); in disk_part_iter_init()
102 piter->disk = disk; in disk_part_iter_init()
138 ptbl = rcu_dereference(piter->disk->part_tbl); in disk_part_iter_next()
215 struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector) in disk_map_sector_rcu() argument
221 ptbl = rcu_dereference(disk->part_tbl); in disk_map_sector_rcu()
235 return &disk->part0; in disk_map_sector_rcu()
413 struct gendisk *disk = part_to_disk(part); in blk_alloc_devt() local
417 if (part->partno < disk->minors) { in blk_alloc_devt()
418 *devt = MKDEV(disk->major, disk->first_minor + part->partno); in blk_alloc_devt()
507 static void register_disk(struct gendisk *disk) in register_disk() argument
509 struct device *ddev = disk_to_dev(disk); in register_disk()
515 ddev->parent = disk->driverfs_dev; in register_disk()
517 dev_set_name(ddev, "%s", disk->disk_name); in register_disk()
540 disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj); in register_disk()
541 disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); in register_disk()
544 if (!disk_part_scan_enabled(disk)) in register_disk()
548 if (!get_capacity(disk)) in register_disk()
551 bdev = bdget_disk(disk, 0); in register_disk()
567 disk_part_iter_init(&piter, disk, 0); in register_disk()
582 void add_disk(struct gendisk *disk) in add_disk() argument
592 WARN_ON(disk->minors && !(disk->major || disk->first_minor)); in add_disk()
593 WARN_ON(!disk->minors && !(disk->flags & GENHD_FL_EXT_DEVT)); in add_disk()
595 disk->flags |= GENHD_FL_UP; in add_disk()
597 retval = blk_alloc_devt(&disk->part0, &devt); in add_disk()
602 disk_to_dev(disk)->devt = devt; in add_disk()
607 disk->major = MAJOR(devt); in add_disk()
608 disk->first_minor = MINOR(devt); in add_disk()
610 disk_alloc_events(disk); in add_disk()
613 bdi = &disk->queue->backing_dev_info; in add_disk()
614 bdi_register_dev(bdi, disk_devt(disk)); in add_disk()
616 blk_register_region(disk_devt(disk), disk->minors, NULL, in add_disk()
617 exact_match, exact_lock, disk); in add_disk()
618 register_disk(disk); in add_disk()
619 blk_register_queue(disk); in add_disk()
625 WARN_ON_ONCE(!blk_get_queue(disk->queue)); in add_disk()
627 retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj, in add_disk()
631 disk_add_events(disk); in add_disk()
635 void del_gendisk(struct gendisk *disk) in del_gendisk() argument
640 disk_del_events(disk); in del_gendisk()
643 disk_part_iter_init(&piter, disk, in del_gendisk()
646 invalidate_partition(disk, part->partno); in del_gendisk()
647 delete_partition(disk, part->partno); in del_gendisk()
651 invalidate_partition(disk, 0); in del_gendisk()
652 set_capacity(disk, 0); in del_gendisk()
653 disk->flags &= ~GENHD_FL_UP; in del_gendisk()
655 sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); in del_gendisk()
656 blk_unregister_queue(disk); in del_gendisk()
657 blk_unregister_region(disk_devt(disk), disk->minors); in del_gendisk()
659 part_stat_set_all(&disk->part0, 0); in del_gendisk()
660 disk->part0.stamp = 0; in del_gendisk()
662 kobject_put(disk->part0.holder_dir); in del_gendisk()
663 kobject_put(disk->slave_dir); in del_gendisk()
664 disk->driverfs_dev = NULL; in del_gendisk()
666 sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); in del_gendisk()
667 pm_runtime_set_memalloc_noio(disk_to_dev(disk), false); in del_gendisk()
668 device_del(disk_to_dev(disk)); in del_gendisk()
682 struct gendisk *disk = NULL; in get_gendisk() local
689 disk = dev_to_disk(kobj_to_dev(kobj)); in get_gendisk()
697 disk = part_to_disk(part); in get_gendisk()
702 return disk; in get_gendisk()
719 struct block_device *bdget_disk(struct gendisk *disk, int partno) in bdget_disk() argument
724 part = disk_get_part(disk, partno); in bdget_disk()
745 struct gendisk *disk = dev_to_disk(dev); in printk_all_partitions() local
755 if (get_capacity(disk) == 0 || in printk_all_partitions()
756 (disk->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)) in printk_all_partitions()
764 disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); in printk_all_partitions()
766 bool is_part0 = part == &disk->part0; in printk_all_partitions()
771 , disk_name(disk, part->partno, name_buf), in printk_all_partitions()
774 if (disk->driverfs_dev != NULL && in printk_all_partitions()
775 disk->driverfs_dev->driver != NULL) in printk_all_partitions()
777 disk->driverfs_dev->driver->name); in printk_all_partitions()
923 struct gendisk *disk = dev_to_disk(dev); in disk_range_show() local
925 return sprintf(buf, "%d\n", disk->minors); in disk_range_show()
931 struct gendisk *disk = dev_to_disk(dev); in disk_ext_range_show() local
933 return sprintf(buf, "%d\n", disk_max_parts(disk)); in disk_ext_range_show()
939 struct gendisk *disk = dev_to_disk(dev); in disk_removable_show() local
942 (disk->flags & GENHD_FL_REMOVABLE ? 1 : 0)); in disk_removable_show()
948 struct gendisk *disk = dev_to_disk(dev); in disk_ro_show() local
950 return sprintf(buf, "%d\n", get_disk_ro(disk) ? 1 : 0); in disk_ro_show()
956 struct gendisk *disk = dev_to_disk(dev); in disk_capability_show() local
958 return sprintf(buf, "%x\n", disk->flags); in disk_capability_show()
965 struct gendisk *disk = dev_to_disk(dev); in disk_alignment_offset_show() local
967 return sprintf(buf, "%d\n", queue_alignment_offset(disk->queue)); in disk_alignment_offset_show()
974 struct gendisk *disk = dev_to_disk(dev); in disk_discard_alignment_show() local
976 return sprintf(buf, "%d\n", queue_discard_alignment(disk->queue)); in disk_discard_alignment_show()
1040 static void disk_replace_part_tbl(struct gendisk *disk, in disk_replace_part_tbl() argument
1043 struct disk_part_tbl *old_ptbl = disk->part_tbl; in disk_replace_part_tbl()
1045 rcu_assign_pointer(disk->part_tbl, new_ptbl); in disk_replace_part_tbl()
1067 int disk_expand_part_tbl(struct gendisk *disk, int partno) in disk_expand_part_tbl() argument
1069 struct disk_part_tbl *old_ptbl = disk->part_tbl; in disk_expand_part_tbl()
1084 if (disk_max_parts(disk) && target > disk_max_parts(disk)) in disk_expand_part_tbl()
1091 new_ptbl = kzalloc_node(size, GFP_KERNEL, disk->node_id); in disk_expand_part_tbl()
1100 disk_replace_part_tbl(disk, new_ptbl); in disk_expand_part_tbl()
1106 struct gendisk *disk = dev_to_disk(dev); in disk_release() local
1109 disk_release_events(disk); in disk_release()
1110 kfree(disk->random); in disk_release()
1111 disk_replace_part_tbl(disk, NULL); in disk_release()
1112 free_part_stats(&disk->part0); in disk_release()
1113 free_part_info(&disk->part0); in disk_release()
1114 if (disk->queue) in disk_release()
1115 blk_put_queue(disk->queue); in disk_release()
1116 kfree(disk); in disk_release()
1125 struct gendisk *disk = dev_to_disk(dev); in block_devnode() local
1127 if (disk->devnode) in block_devnode()
1128 return disk->devnode(disk, mode); in block_devnode()
1226 struct gendisk *disk = dev_to_disk(dev); in blk_lookup_devt() local
1232 if (partno < disk->minors) { in blk_lookup_devt()
1240 part = disk_get_part(disk, partno); in blk_lookup_devt()
1261 struct gendisk *disk; in alloc_disk_node() local
1263 disk = kzalloc_node(sizeof(struct gendisk), GFP_KERNEL, node_id); in alloc_disk_node()
1264 if (disk) { in alloc_disk_node()
1265 if (!init_part_stats(&disk->part0)) { in alloc_disk_node()
1266 kfree(disk); in alloc_disk_node()
1269 disk->node_id = node_id; in alloc_disk_node()
1270 if (disk_expand_part_tbl(disk, 0)) { in alloc_disk_node()
1271 free_part_stats(&disk->part0); in alloc_disk_node()
1272 kfree(disk); in alloc_disk_node()
1275 disk->part_tbl->part[0] = &disk->part0; in alloc_disk_node()
1286 seqcount_init(&disk->part0.nr_sects_seq); in alloc_disk_node()
1287 hd_ref_init(&disk->part0); in alloc_disk_node()
1289 disk->minors = minors; in alloc_disk_node()
1290 rand_initialize_disk(disk); in alloc_disk_node()
1291 disk_to_dev(disk)->class = &block_class; in alloc_disk_node()
1292 disk_to_dev(disk)->type = &disk_type; in alloc_disk_node()
1293 device_initialize(disk_to_dev(disk)); in alloc_disk_node()
1295 return disk; in alloc_disk_node()
1299 struct kobject *get_disk(struct gendisk *disk) in get_disk() argument
1304 if (!disk->fops) in get_disk()
1306 owner = disk->fops->owner; in get_disk()
1309 kobj = kobject_get(&disk_to_dev(disk)->kobj); in get_disk()
1320 void put_disk(struct gendisk *disk) in put_disk() argument
1322 if (disk) in put_disk()
1323 kobject_put(&disk_to_dev(disk)->kobj); in put_disk()
1345 void set_disk_ro(struct gendisk *disk, int flag) in set_disk_ro() argument
1350 if (disk->part0.policy != flag) { in set_disk_ro()
1351 set_disk_ro_uevent(disk, flag); in set_disk_ro()
1352 disk->part0.policy = flag; in set_disk_ro()
1355 disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); in set_disk_ro()
1372 int invalidate_partition(struct gendisk *disk, int partno) in invalidate_partition() argument
1375 struct block_device *bdev = bdget_disk(disk, partno); in invalidate_partition()
1391 struct gendisk *disk; /* the associated disk */ member
1420 static unsigned long disk_events_poll_jiffies(struct gendisk *disk) in disk_events_poll_jiffies() argument
1422 struct disk_events *ev = disk->ev; in disk_events_poll_jiffies()
1432 else if (disk->events & ~disk->async_events) in disk_events_poll_jiffies()
1453 void disk_block_events(struct gendisk *disk) in disk_block_events() argument
1455 struct disk_events *ev = disk->ev; in disk_block_events()
1473 cancel_delayed_work_sync(&disk->ev->dwork); in disk_block_events()
1478 static void __disk_unblock_events(struct gendisk *disk, bool check_now) in __disk_unblock_events() argument
1480 struct disk_events *ev = disk->ev; in __disk_unblock_events()
1496 intv = disk_events_poll_jiffies(disk); in __disk_unblock_events()
1518 void disk_unblock_events(struct gendisk *disk) in disk_unblock_events() argument
1520 if (disk->ev) in disk_unblock_events()
1521 __disk_unblock_events(disk, false); in disk_unblock_events()
1536 void disk_flush_events(struct gendisk *disk, unsigned int mask) in disk_flush_events() argument
1538 struct disk_events *ev = disk->ev; in disk_flush_events()
1562 unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask) in disk_clear_events() argument
1564 const struct block_device_operations *bdops = disk->fops; in disk_clear_events()
1565 struct disk_events *ev = disk->ev; in disk_clear_events()
1572 bdops->media_changed && bdops->media_changed(disk)) in disk_clear_events()
1577 disk_block_events(disk); in disk_clear_events()
1594 __disk_unblock_events(disk, ev->clearing ? true : false); in disk_clear_events()
1621 struct gendisk *disk = ev->disk; in disk_check_events() local
1629 events = disk->fops->check_events(disk, clearing); in disk_check_events()
1638 intv = disk_events_poll_jiffies(disk); in disk_check_events()
1651 if (events & disk->events & (1 << i)) in disk_check_events()
1655 kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp); in disk_check_events()
1686 struct gendisk *disk = dev_to_disk(dev); in disk_events_show() local
1688 return __disk_events_show(disk->events, buf); in disk_events_show()
1694 struct gendisk *disk = dev_to_disk(dev); in disk_events_async_show() local
1696 return __disk_events_show(disk->async_events, buf); in disk_events_async_show()
1703 struct gendisk *disk = dev_to_disk(dev); in disk_events_poll_msecs_show() local
1705 return sprintf(buf, "%ld\n", disk->ev->poll_msecs); in disk_events_poll_msecs_show()
1712 struct gendisk *disk = dev_to_disk(dev); in disk_events_poll_msecs_store() local
1721 disk_block_events(disk); in disk_events_poll_msecs_store()
1722 disk->ev->poll_msecs = intv; in disk_events_poll_msecs_store()
1723 __disk_unblock_events(disk, true); in disk_events_poll_msecs_store()
1760 disk_flush_events(ev->disk, 0); in disk_events_set_dfl_poll_msecs()
1781 static void disk_alloc_events(struct gendisk *disk) in disk_alloc_events() argument
1785 if (!disk->fops->check_events) in disk_alloc_events()
1790 pr_warn("%s: failed to initialize events\n", disk->disk_name); in disk_alloc_events()
1795 ev->disk = disk; in disk_alloc_events()
1802 disk->ev = ev; in disk_alloc_events()
1805 static void disk_add_events(struct gendisk *disk) in disk_add_events() argument
1807 if (!disk->ev) in disk_add_events()
1811 if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0) in disk_add_events()
1813 disk->disk_name); in disk_add_events()
1816 list_add_tail(&disk->ev->node, &disk_events); in disk_add_events()
1823 __disk_unblock_events(disk, true); in disk_add_events()
1826 static void disk_del_events(struct gendisk *disk) in disk_del_events() argument
1828 if (!disk->ev) in disk_del_events()
1831 disk_block_events(disk); in disk_del_events()
1834 list_del_init(&disk->ev->node); in disk_del_events()
1837 sysfs_remove_files(&disk_to_dev(disk)->kobj, disk_events_attrs); in disk_del_events()
1840 static void disk_release_events(struct gendisk *disk) in disk_release_events() argument
1843 WARN_ON_ONCE(disk->ev && disk->ev->block != 1); in disk_release_events()
1844 kfree(disk->ev); in disk_release_events()