Lines Matching refs:disk

43 static void disk_alloc_events(struct gendisk *disk);
44 static void disk_add_events(struct gendisk *disk);
45 static void disk_del_events(struct gendisk *disk);
46 static void disk_release_events(struct gendisk *disk);
97 struct hd_struct *__disk_get_part(struct gendisk *disk, int partno) in __disk_get_part() argument
99 struct disk_part_tbl *ptbl = rcu_dereference(disk->part_tbl); in __disk_get_part()
120 struct hd_struct *disk_get_part(struct gendisk *disk, int partno) in disk_get_part() argument
125 part = __disk_get_part(disk, partno); in disk_get_part()
145 void disk_part_iter_init(struct disk_part_iter *piter, struct gendisk *disk, in disk_part_iter_init() argument
151 ptbl = rcu_dereference(disk->part_tbl); in disk_part_iter_init()
153 piter->disk = disk; in disk_part_iter_init()
189 ptbl = rcu_dereference(piter->disk->part_tbl); in disk_part_iter_next()
266 struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector) in disk_map_sector_rcu() argument
272 ptbl = rcu_dereference(disk->part_tbl); in disk_map_sector_rcu()
286 return &disk->part0; in disk_map_sector_rcu()
476 struct gendisk *disk = part_to_disk(part); in blk_alloc_devt() local
480 if (part->partno < disk->minors) { in blk_alloc_devt()
481 *devt = MKDEV(disk->major, disk->first_minor + part->partno); in blk_alloc_devt()
570 static void register_disk(struct device *parent, struct gendisk *disk) in register_disk() argument
572 struct device *ddev = disk_to_dev(disk); in register_disk()
580 dev_set_name(ddev, "%s", disk->disk_name); in register_disk()
603 disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj); in register_disk()
604 disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); in register_disk()
606 if (disk->flags & GENHD_FL_HIDDEN) { in register_disk()
612 if (!disk_part_scan_enabled(disk)) in register_disk()
616 if (!get_capacity(disk)) in register_disk()
619 bdev = bdget_disk(disk, 0); in register_disk()
635 disk_part_iter_init(&piter, disk, 0); in register_disk()
641 &disk->queue->backing_dev_info->dev->kobj, in register_disk()
657 static void __device_add_disk(struct device *parent, struct gendisk *disk, in __device_add_disk() argument
667 WARN_ON(disk->minors && !(disk->major || disk->first_minor)); in __device_add_disk()
668 WARN_ON(!disk->minors && in __device_add_disk()
669 !(disk->flags & (GENHD_FL_EXT_DEVT | GENHD_FL_HIDDEN))); in __device_add_disk()
671 disk->flags |= GENHD_FL_UP; in __device_add_disk()
673 retval = blk_alloc_devt(&disk->part0, &devt); in __device_add_disk()
678 disk->major = MAJOR(devt); in __device_add_disk()
679 disk->first_minor = MINOR(devt); in __device_add_disk()
681 disk_alloc_events(disk); in __device_add_disk()
683 if (disk->flags & GENHD_FL_HIDDEN) { in __device_add_disk()
688 disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO; in __device_add_disk()
689 disk->flags |= GENHD_FL_NO_PART_SCAN; in __device_add_disk()
694 disk_to_dev(disk)->devt = devt; in __device_add_disk()
695 ret = bdi_register_owner(disk->queue->backing_dev_info, in __device_add_disk()
696 disk_to_dev(disk)); in __device_add_disk()
698 blk_register_region(disk_devt(disk), disk->minors, NULL, in __device_add_disk()
699 exact_match, exact_lock, disk); in __device_add_disk()
701 register_disk(parent, disk); in __device_add_disk()
703 blk_register_queue(disk); in __device_add_disk()
709 WARN_ON_ONCE(!blk_get_queue(disk->queue)); in __device_add_disk()
711 disk_add_events(disk); in __device_add_disk()
712 blk_integrity_add(disk); in __device_add_disk()
715 void device_add_disk(struct device *parent, struct gendisk *disk) in device_add_disk() argument
717 __device_add_disk(parent, disk, true); in device_add_disk()
721 void device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk) in device_add_disk_no_queue_reg() argument
723 __device_add_disk(parent, disk, false); in device_add_disk_no_queue_reg()
727 void del_gendisk(struct gendisk *disk) in del_gendisk() argument
732 blk_integrity_del(disk); in del_gendisk()
733 disk_del_events(disk); in del_gendisk()
739 down_write(&disk->lookup_sem); in del_gendisk()
741 disk_part_iter_init(&piter, disk, in del_gendisk()
744 invalidate_partition(disk, part->partno); in del_gendisk()
746 delete_partition(disk, part->partno); in del_gendisk()
750 invalidate_partition(disk, 0); in del_gendisk()
751 bdev_unhash_inode(disk_devt(disk)); in del_gendisk()
752 set_capacity(disk, 0); in del_gendisk()
753 disk->flags &= ~GENHD_FL_UP; in del_gendisk()
754 up_write(&disk->lookup_sem); in del_gendisk()
756 if (!(disk->flags & GENHD_FL_HIDDEN)) in del_gendisk()
757 sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); in del_gendisk()
758 if (disk->queue) { in del_gendisk()
763 if (!(disk->flags & GENHD_FL_HIDDEN)) in del_gendisk()
764 bdi_unregister(disk->queue->backing_dev_info); in del_gendisk()
765 blk_unregister_queue(disk); in del_gendisk()
770 if (!(disk->flags & GENHD_FL_HIDDEN)) in del_gendisk()
771 blk_unregister_region(disk_devt(disk), disk->minors); in del_gendisk()
773 kobject_put(disk->part0.holder_dir); in del_gendisk()
774 kobject_put(disk->slave_dir); in del_gendisk()
776 part_stat_set_all(&disk->part0, 0); in del_gendisk()
777 disk->part0.stamp = 0; in del_gendisk()
779 sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); in del_gendisk()
780 pm_runtime_set_memalloc_noio(disk_to_dev(disk), false); in del_gendisk()
781 device_del(disk_to_dev(disk)); in del_gendisk()
790 struct gendisk *disk = dev_to_disk(dev); in disk_badblocks_show() local
792 if (!disk->bb) in disk_badblocks_show()
795 return badblocks_show(disk->bb, page, 0); in disk_badblocks_show()
802 struct gendisk *disk = dev_to_disk(dev); in disk_badblocks_store() local
804 if (!disk->bb) in disk_badblocks_store()
807 return badblocks_store(disk->bb, page, len, 0); in disk_badblocks_store()
820 struct gendisk *disk = NULL; in get_gendisk() local
827 disk = dev_to_disk(kobj_to_dev(kobj)); in get_gendisk()
835 disk = part_to_disk(part); in get_gendisk()
840 if (!disk) in get_gendisk()
847 down_read(&disk->lookup_sem); in get_gendisk()
848 if (unlikely((disk->flags & GENHD_FL_HIDDEN) || in get_gendisk()
849 !(disk->flags & GENHD_FL_UP))) { in get_gendisk()
850 up_read(&disk->lookup_sem); in get_gendisk()
851 put_disk_and_module(disk); in get_gendisk()
852 disk = NULL; in get_gendisk()
854 up_read(&disk->lookup_sem); in get_gendisk()
856 return disk; in get_gendisk()
873 struct block_device *bdget_disk(struct gendisk *disk, int partno) in bdget_disk() argument
878 part = disk_get_part(disk, partno); in bdget_disk()
899 struct gendisk *disk = dev_to_disk(dev); in printk_all_partitions() local
909 if (get_capacity(disk) == 0 || in printk_all_partitions()
910 (disk->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)) in printk_all_partitions()
918 disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); in printk_all_partitions()
920 bool is_part0 = part == &disk->part0; in printk_all_partitions()
925 , disk_name(disk, part->partno, name_buf), in printk_all_partitions()
1065 struct gendisk *disk = dev_to_disk(dev); in disk_range_show() local
1067 return sprintf(buf, "%d\n", disk->minors); in disk_range_show()
1073 struct gendisk *disk = dev_to_disk(dev); in disk_ext_range_show() local
1075 return sprintf(buf, "%d\n", disk_max_parts(disk)); in disk_ext_range_show()
1081 struct gendisk *disk = dev_to_disk(dev); in disk_removable_show() local
1084 (disk->flags & GENHD_FL_REMOVABLE ? 1 : 0)); in disk_removable_show()
1090 struct gendisk *disk = dev_to_disk(dev); in disk_hidden_show() local
1093 (disk->flags & GENHD_FL_HIDDEN ? 1 : 0)); in disk_hidden_show()
1099 struct gendisk *disk = dev_to_disk(dev); in disk_ro_show() local
1101 return sprintf(buf, "%d\n", get_disk_ro(disk) ? 1 : 0); in disk_ro_show()
1107 struct gendisk *disk = dev_to_disk(dev); in disk_capability_show() local
1109 return sprintf(buf, "%x\n", disk->flags); in disk_capability_show()
1116 struct gendisk *disk = dev_to_disk(dev); in disk_alignment_offset_show() local
1118 return sprintf(buf, "%d\n", queue_alignment_offset(disk->queue)); in disk_alignment_offset_show()
1125 struct gendisk *disk = dev_to_disk(dev); in disk_discard_alignment_show() local
1127 return sprintf(buf, "%d\n", queue_discard_alignment(disk->queue)); in disk_discard_alignment_show()
1176 struct gendisk *disk = dev_to_disk(dev); in disk_visible() local
1178 if (a == &dev_attr_badblocks.attr && !disk->bb) in disk_visible()
1204 static void disk_replace_part_tbl(struct gendisk *disk, in disk_replace_part_tbl() argument
1208 rcu_dereference_protected(disk->part_tbl, 1); in disk_replace_part_tbl()
1210 rcu_assign_pointer(disk->part_tbl, new_ptbl); in disk_replace_part_tbl()
1233 int disk_expand_part_tbl(struct gendisk *disk, int partno) in disk_expand_part_tbl() argument
1236 rcu_dereference_protected(disk->part_tbl, 1); in disk_expand_part_tbl()
1251 if (disk_max_parts(disk) && target > disk_max_parts(disk)) in disk_expand_part_tbl()
1258 new_ptbl = kzalloc_node(size, GFP_KERNEL, disk->node_id); in disk_expand_part_tbl()
1267 disk_replace_part_tbl(disk, new_ptbl); in disk_expand_part_tbl()
1273 struct gendisk *disk = dev_to_disk(dev); in disk_release() local
1276 disk_release_events(disk); in disk_release()
1277 kfree(disk->random); in disk_release()
1278 disk_replace_part_tbl(disk, NULL); in disk_release()
1279 hd_free_part(&disk->part0); in disk_release()
1280 if (disk->queue) in disk_release()
1281 blk_put_queue(disk->queue); in disk_release()
1282 kfree(disk); in disk_release()
1291 struct gendisk *disk = dev_to_disk(dev); in block_devnode() local
1293 if (disk->devnode) in block_devnode()
1294 return disk->devnode(disk, mode); in block_devnode()
1389 struct gendisk *disk = dev_to_disk(dev); in blk_lookup_devt() local
1395 if (partno < disk->minors) { in blk_lookup_devt()
1403 part = disk_get_part(disk, partno); in blk_lookup_devt()
1418 struct gendisk *disk; in __alloc_disk_node() local
1428 disk = kzalloc_node(sizeof(struct gendisk), GFP_KERNEL, node_id); in __alloc_disk_node()
1429 if (disk) { in __alloc_disk_node()
1430 if (!init_part_stats(&disk->part0)) { in __alloc_disk_node()
1431 kfree(disk); in __alloc_disk_node()
1434 init_rwsem(&disk->lookup_sem); in __alloc_disk_node()
1435 disk->node_id = node_id; in __alloc_disk_node()
1436 if (disk_expand_part_tbl(disk, 0)) { in __alloc_disk_node()
1437 free_part_stats(&disk->part0); in __alloc_disk_node()
1438 kfree(disk); in __alloc_disk_node()
1441 ptbl = rcu_dereference_protected(disk->part_tbl, 1); in __alloc_disk_node()
1442 rcu_assign_pointer(ptbl->part[0], &disk->part0); in __alloc_disk_node()
1453 seqcount_init(&disk->part0.nr_sects_seq); in __alloc_disk_node()
1454 if (hd_ref_init(&disk->part0)) { in __alloc_disk_node()
1455 hd_free_part(&disk->part0); in __alloc_disk_node()
1456 kfree(disk); in __alloc_disk_node()
1460 disk->minors = minors; in __alloc_disk_node()
1461 rand_initialize_disk(disk); in __alloc_disk_node()
1462 disk_to_dev(disk)->class = &block_class; in __alloc_disk_node()
1463 disk_to_dev(disk)->type = &disk_type; in __alloc_disk_node()
1464 device_initialize(disk_to_dev(disk)); in __alloc_disk_node()
1466 return disk; in __alloc_disk_node()
1470 struct kobject *get_disk_and_module(struct gendisk *disk) in get_disk_and_module() argument
1475 if (!disk->fops) in get_disk_and_module()
1477 owner = disk->fops->owner; in get_disk_and_module()
1480 kobj = kobject_get_unless_zero(&disk_to_dev(disk)->kobj); in get_disk_and_module()
1490 void put_disk(struct gendisk *disk) in put_disk() argument
1492 if (disk) in put_disk()
1493 kobject_put(&disk_to_dev(disk)->kobj); in put_disk()
1501 void put_disk_and_module(struct gendisk *disk) in put_disk_and_module() argument
1503 if (disk) { in put_disk_and_module()
1504 struct module *owner = disk->fops->owner; in put_disk_and_module()
1506 put_disk(disk); in put_disk_and_module()
1529 void set_disk_ro(struct gendisk *disk, int flag) in set_disk_ro() argument
1534 if (disk->part0.policy != flag) { in set_disk_ro()
1535 set_disk_ro_uevent(disk, flag); in set_disk_ro()
1536 disk->part0.policy = flag; in set_disk_ro()
1539 disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); in set_disk_ro()
1556 int invalidate_partition(struct gendisk *disk, int partno) in invalidate_partition() argument
1559 struct block_device *bdev = bdget_disk(disk, partno); in invalidate_partition()
1575 struct gendisk *disk; /* the associated disk */ member
1604 static unsigned long disk_events_poll_jiffies(struct gendisk *disk) in disk_events_poll_jiffies() argument
1606 struct disk_events *ev = disk->ev; in disk_events_poll_jiffies()
1616 else if (disk->events & ~disk->async_events) in disk_events_poll_jiffies()
1637 void disk_block_events(struct gendisk *disk) in disk_block_events() argument
1639 struct disk_events *ev = disk->ev; in disk_block_events()
1657 cancel_delayed_work_sync(&disk->ev->dwork); in disk_block_events()
1662 static void __disk_unblock_events(struct gendisk *disk, bool check_now) in __disk_unblock_events() argument
1664 struct disk_events *ev = disk->ev; in __disk_unblock_events()
1676 intv = disk_events_poll_jiffies(disk); in __disk_unblock_events()
1697 void disk_unblock_events(struct gendisk *disk) in disk_unblock_events() argument
1699 if (disk->ev) in disk_unblock_events()
1700 __disk_unblock_events(disk, false); in disk_unblock_events()
1715 void disk_flush_events(struct gendisk *disk, unsigned int mask) in disk_flush_events() argument
1717 struct disk_events *ev = disk->ev; in disk_flush_events()
1741 unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask) in disk_clear_events() argument
1743 const struct block_device_operations *bdops = disk->fops; in disk_clear_events()
1744 struct disk_events *ev = disk->ev; in disk_clear_events()
1751 bdops->media_changed && bdops->media_changed(disk)) in disk_clear_events()
1756 disk_block_events(disk); in disk_clear_events()
1773 __disk_unblock_events(disk, ev->clearing ? true : false); in disk_clear_events()
1800 struct gendisk *disk = ev->disk; in disk_check_events() local
1808 events = disk->fops->check_events(disk, clearing); in disk_check_events()
1817 intv = disk_events_poll_jiffies(disk); in disk_check_events()
1830 if (events & disk->events & (1 << i)) in disk_check_events()
1834 kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp); in disk_check_events()
1865 struct gendisk *disk = dev_to_disk(dev); in disk_events_show() local
1867 return __disk_events_show(disk->events, buf); in disk_events_show()
1873 struct gendisk *disk = dev_to_disk(dev); in disk_events_async_show() local
1875 return __disk_events_show(disk->async_events, buf); in disk_events_async_show()
1882 struct gendisk *disk = dev_to_disk(dev); in disk_events_poll_msecs_show() local
1884 return sprintf(buf, "%ld\n", disk->ev->poll_msecs); in disk_events_poll_msecs_show()
1891 struct gendisk *disk = dev_to_disk(dev); in disk_events_poll_msecs_store() local
1900 disk_block_events(disk); in disk_events_poll_msecs_store()
1901 disk->ev->poll_msecs = intv; in disk_events_poll_msecs_store()
1902 __disk_unblock_events(disk, true); in disk_events_poll_msecs_store()
1939 disk_flush_events(ev->disk, 0); in disk_events_set_dfl_poll_msecs()
1960 static void disk_alloc_events(struct gendisk *disk) in disk_alloc_events() argument
1964 if (!disk->fops->check_events) in disk_alloc_events()
1969 pr_warn("%s: failed to initialize events\n", disk->disk_name); in disk_alloc_events()
1974 ev->disk = disk; in disk_alloc_events()
1981 disk->ev = ev; in disk_alloc_events()
1984 static void disk_add_events(struct gendisk *disk) in disk_add_events() argument
1986 if (!disk->ev) in disk_add_events()
1990 if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0) in disk_add_events()
1992 disk->disk_name); in disk_add_events()
1995 list_add_tail(&disk->ev->node, &disk_events); in disk_add_events()
2002 __disk_unblock_events(disk, true); in disk_add_events()
2005 static void disk_del_events(struct gendisk *disk) in disk_del_events() argument
2007 if (!disk->ev) in disk_del_events()
2010 disk_block_events(disk); in disk_del_events()
2013 list_del_init(&disk->ev->node); in disk_del_events()
2016 sysfs_remove_files(&disk_to_dev(disk)->kobj, disk_events_attrs); in disk_del_events()
2019 static void disk_release_events(struct gendisk *disk) in disk_release_events() argument
2022 WARN_ON_ONCE(disk->ev && disk->ev->block != 1); in disk_release_events()
2023 kfree(disk->ev); in disk_release_events()