Lines Matching refs:disk
59 void set_capacity(struct gendisk *disk, sector_t sectors) in set_capacity() argument
63 disk->disk_name, sectors, in set_capacity()
68 bdev_set_nr_sectors(disk->part0, sectors); in set_capacity()
76 bool set_capacity_and_notify(struct gendisk *disk, sector_t size) in set_capacity_and_notify() argument
78 sector_t capacity = get_capacity(disk); in set_capacity_and_notify()
81 set_capacity(disk, size); in set_capacity_and_notify()
89 !disk_live(disk) || in set_capacity_and_notify()
90 (disk->flags & GENHD_FL_HIDDEN)) in set_capacity_and_notify()
94 disk->disk_name, capacity, size); in set_capacity_and_notify()
102 kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp); in set_capacity_and_notify()
342 void disk_uevent(struct gendisk *disk, enum kobject_action action) in disk_uevent() argument
348 xa_for_each(&disk->part_tbl, idx, part) { in disk_uevent()
363 int disk_scan_partitions(struct gendisk *disk, blk_mode_t mode) in disk_scan_partitions() argument
368 if (!disk_has_partscan(disk)) in disk_scan_partitions()
370 if (disk->open_partitions) in disk_scan_partitions()
380 ret = bd_prepare_to_claim(disk->part0, disk_scan_partitions, in disk_scan_partitions()
386 set_bit(GD_NEED_PART_SCAN, &disk->state); in disk_scan_partitions()
387 file = bdev_file_open_by_dev(disk_devt(disk), mode & ~BLK_OPEN_EXCL, in disk_scan_partitions()
399 clear_bit(GD_NEED_PART_SCAN, &disk->state); in disk_scan_partitions()
401 bd_abort_claiming(disk->part0, disk_scan_partitions); in disk_scan_partitions()
405 static void add_disk_final(struct gendisk *disk) in add_disk_final() argument
407 struct device *ddev = disk_to_dev(disk); in add_disk_final()
409 if (!(disk->flags & GENHD_FL_HIDDEN)) { in add_disk_final()
411 if (get_capacity(disk) && disk_has_partscan(disk)) in add_disk_final()
412 set_bit(GD_NEED_PART_SCAN, &disk->state); in add_disk_final()
414 bdev_add(disk->part0, ddev->devt); in add_disk_final()
415 if (get_capacity(disk)) in add_disk_final()
416 disk_scan_partitions(disk, BLK_OPEN_READ); in add_disk_final()
423 disk_uevent(disk, KOBJ_ADD); in add_disk_final()
426 blk_apply_bdi_limits(disk->bdi, &disk->queue->limits); in add_disk_final()
427 disk_add_events(disk); in add_disk_final()
428 set_bit(GD_ADDED, &disk->state); in add_disk_final()
431 static int __add_disk(struct device *parent, struct gendisk *disk, in __add_disk() argument
436 struct device *ddev = disk_to_dev(disk); in __add_disk()
439 if (WARN_ON_ONCE(bdev_nr_sectors(disk->part0) > BLK_DEV_MAX_SECTORS)) in __add_disk()
442 if (queue_is_mq(disk->queue)) { in __add_disk()
446 if (disk->fops->submit_bio || disk->fops->poll_bio) in __add_disk()
449 if (!disk->fops->submit_bio) in __add_disk()
451 bdev_set_flag(disk->part0, BD_HAS_SUBMIT_BIO); in __add_disk()
462 if (disk->major) { in __add_disk()
463 if (WARN_ON(!disk->minors)) in __add_disk()
466 if (disk->minors > DISK_MAX_PARTS) { in __add_disk()
469 disk->minors = DISK_MAX_PARTS; in __add_disk()
471 if (disk->first_minor > MINORMASK || in __add_disk()
472 disk->minors > MINORMASK + 1 || in __add_disk()
473 disk->first_minor + disk->minors > MINORMASK + 1) in __add_disk()
476 if (WARN_ON(disk->minors)) in __add_disk()
482 disk->major = BLOCK_EXT_MAJOR; in __add_disk()
483 disk->first_minor = ret; in __add_disk()
491 dev_set_name(ddev, "%s", disk->disk_name); in __add_disk()
494 if (!(disk->flags & GENHD_FL_HIDDEN)) in __add_disk()
495 ddev->devt = MKDEV(disk->major, disk->first_minor); in __add_disk()
500 ret = disk_alloc_events(disk); in __add_disk()
516 disk->part0->bd_holder_dir = in __add_disk()
518 if (!disk->part0->bd_holder_dir) { in __add_disk()
522 disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); in __add_disk()
523 if (!disk->slave_dir) { in __add_disk()
528 ret = blk_register_queue(disk); in __add_disk()
532 if (!(disk->flags & GENHD_FL_HIDDEN)) { in __add_disk()
533 ret = bdi_register(disk->bdi, "%u:%u", in __add_disk()
534 disk->major, disk->first_minor); in __add_disk()
537 bdi_set_owner(disk->bdi, ddev); in __add_disk()
539 &disk->bdi->dev->kobj, "bdi"); in __add_disk()
548 disk->part0->bd_dev = MKDEV(disk->major, disk->first_minor); in __add_disk()
553 if (!(disk->flags & GENHD_FL_HIDDEN)) in __add_disk()
554 bdi_unregister(disk->bdi); in __add_disk()
556 blk_unregister_queue(disk); in __add_disk()
557 rq_qos_exit(disk->queue); in __add_disk()
559 kobject_put(disk->slave_dir); in __add_disk()
560 disk->slave_dir = NULL; in __add_disk()
562 kobject_put(disk->part0->bd_holder_dir); in __add_disk()
569 if (disk->major == BLOCK_EXT_MAJOR) in __add_disk()
570 blk_free_ext_minor(disk->first_minor); in __add_disk()
585 int __must_check add_disk_fwnode(struct device *parent, struct gendisk *disk, in add_disk_fwnode() argument
593 if (queue_is_mq(disk->queue)) { in add_disk_fwnode()
594 set = disk->queue->tag_set; in add_disk_fwnode()
597 ret = __add_disk(parent, disk, groups, fwnode); in add_disk_fwnode()
601 ret = __add_disk(parent, disk, groups, fwnode); in add_disk_fwnode()
610 add_disk_final(disk); in add_disk_fwnode()
624 int __must_check device_add_disk(struct device *parent, struct gendisk *disk, in device_add_disk() argument
627 return add_disk_fwnode(parent, disk, groups, NULL); in device_add_disk()
631 static void blk_report_disk_dead(struct gendisk *disk, bool surprise) in blk_report_disk_dead() argument
641 lockdep_assert_not_held(&disk->open_mutex); in blk_report_disk_dead()
644 xa_for_each(&disk->part_tbl, idx, bdev) { in blk_report_disk_dead()
657 static bool __blk_mark_disk_dead(struct gendisk *disk) in __blk_mark_disk_dead() argument
662 if (test_and_set_bit(GD_DEAD, &disk->state)) in __blk_mark_disk_dead()
665 if (test_bit(GD_OWNS_QUEUE, &disk->state)) in __blk_mark_disk_dead()
666 blk_queue_flag_set(QUEUE_FLAG_DYING, disk->queue); in __blk_mark_disk_dead()
671 set_capacity(disk, 0); in __blk_mark_disk_dead()
676 return blk_queue_start_drain(disk->queue); in __blk_mark_disk_dead()
686 void blk_mark_disk_dead(struct gendisk *disk) in blk_mark_disk_dead() argument
688 __blk_mark_disk_dead(disk); in blk_mark_disk_dead()
689 blk_report_disk_dead(disk, true); in blk_mark_disk_dead()
693 static void __del_gendisk(struct gendisk *disk) in __del_gendisk() argument
695 struct request_queue *q = disk->queue; in __del_gendisk()
702 if (WARN_ON_ONCE(!disk_live(disk) && !(disk->flags & GENHD_FL_HIDDEN))) in __del_gendisk()
705 disk_del_events(disk); in __del_gendisk()
710 mutex_lock(&disk->open_mutex); in __del_gendisk()
711 xa_for_each(&disk->part_tbl, idx, part) in __del_gendisk()
713 mutex_unlock(&disk->open_mutex); in __del_gendisk()
719 if (!test_bit(GD_DEAD, &disk->state)) in __del_gendisk()
720 blk_report_disk_dead(disk, false); in __del_gendisk()
725 mutex_lock(&disk->open_mutex); in __del_gendisk()
726 start_drain = __blk_mark_disk_dead(disk); in __del_gendisk()
729 xa_for_each_start(&disk->part_tbl, idx, part, 1) in __del_gendisk()
731 mutex_unlock(&disk->open_mutex); in __del_gendisk()
733 if (!(disk->flags & GENHD_FL_HIDDEN)) { in __del_gendisk()
734 sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); in __del_gendisk()
740 bdi_unregister(disk->bdi); in __del_gendisk()
743 blk_unregister_queue(disk); in __del_gendisk()
745 kobject_put(disk->part0->bd_holder_dir); in __del_gendisk()
746 kobject_put(disk->slave_dir); in __del_gendisk()
747 disk->slave_dir = NULL; in __del_gendisk()
749 part_stat_set_all(disk->part0, 0); in __del_gendisk()
750 disk->part0->bd_stamp = 0; in __del_gendisk()
751 sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); in __del_gendisk()
752 pm_runtime_set_memalloc_noio(disk_to_dev(disk), false); in __del_gendisk()
753 device_del(disk_to_dev(disk)); in __del_gendisk()
757 blk_throtl_cancel_bios(disk); in __del_gendisk()
771 if (!test_bit(GD_OWNS_QUEUE, &disk->state)) in __del_gendisk()
809 void del_gendisk(struct gendisk *disk) in del_gendisk() argument
814 if (!queue_is_mq(disk->queue)) { in del_gendisk()
815 __del_gendisk(disk); in del_gendisk()
817 set = disk->queue->tag_set; in del_gendisk()
819 disable_elv_switch(disk->queue); in del_gendisk()
823 __del_gendisk(disk); in del_gendisk()
840 void invalidate_disk(struct gendisk *disk) in invalidate_disk() argument
842 struct block_device *bdev = disk->part0; in invalidate_disk()
846 set_capacity(disk, 0); in invalidate_disk()
855 struct gendisk *disk = dev_to_disk(dev); in disk_badblocks_show() local
857 if (!disk->bb) in disk_badblocks_show()
860 return badblocks_show(disk->bb, page, 0); in disk_badblocks_show()
867 struct gendisk *disk = dev_to_disk(dev); in disk_badblocks_store() local
869 if (!disk->bb) in disk_badblocks_store()
872 return badblocks_store(disk->bb, page, len, 0); in disk_badblocks_store()
1016 struct gendisk *disk = dev_to_disk(dev); in disk_range_show() local
1018 return sysfs_emit(buf, "%d\n", disk->minors); in disk_range_show()
1024 struct gendisk *disk = dev_to_disk(dev); in disk_ext_range_show() local
1027 (disk->flags & GENHD_FL_NO_PART) ? 1 : DISK_MAX_PARTS); in disk_ext_range_show()
1033 struct gendisk *disk = dev_to_disk(dev); in disk_removable_show() local
1036 (disk->flags & GENHD_FL_REMOVABLE ? 1 : 0)); in disk_removable_show()
1042 struct gendisk *disk = dev_to_disk(dev); in disk_hidden_show() local
1045 (disk->flags & GENHD_FL_HIDDEN ? 1 : 0)); in disk_hidden_show()
1051 struct gendisk *disk = dev_to_disk(dev); in disk_ro_show() local
1053 return sysfs_emit(buf, "%d\n", get_disk_ro(disk) ? 1 : 0); in disk_ro_show()
1134 struct gendisk *disk = dev_to_disk(dev); in disk_alignment_offset_show() local
1136 return sysfs_emit(buf, "%d\n", bdev_alignment_offset(disk->part0)); in disk_alignment_offset_show()
1143 struct gendisk *disk = dev_to_disk(dev); in disk_discard_alignment_show() local
1145 return sysfs_emit(buf, "%d\n", bdev_alignment_offset(disk->part0)); in disk_discard_alignment_show()
1151 struct gendisk *disk = dev_to_disk(dev); in diskseq_show() local
1153 return sysfs_emit(buf, "%llu\n", disk->diskseq); in diskseq_show()
1239 struct gendisk *disk = dev_to_disk(dev); in disk_visible() local
1241 if (a == &dev_attr_badblocks.attr && !disk->bb) in disk_visible()
1278 struct gendisk *disk = dev_to_disk(dev); in disk_release() local
1281 WARN_ON_ONCE(disk_live(disk)); in disk_release()
1283 blk_trace_remove(disk->queue); in disk_release()
1292 if (queue_is_mq(disk->queue) && in disk_release()
1293 test_bit(GD_OWNS_QUEUE, &disk->state) && in disk_release()
1294 !test_bit(GD_ADDED, &disk->state)) in disk_release()
1295 blk_mq_exit_queue(disk->queue); in disk_release()
1297 blkcg_exit_disk(disk); in disk_release()
1299 bioset_exit(&disk->bio_split); in disk_release()
1301 disk_release_events(disk); in disk_release()
1302 kfree(disk->random); in disk_release()
1303 disk_free_zone_resources(disk); in disk_release()
1304 xa_destroy(&disk->part_tbl); in disk_release()
1306 kobject_put(&disk->queue_kobj); in disk_release()
1307 disk->queue->disk = NULL; in disk_release()
1308 blk_put_queue(disk->queue); in disk_release()
1310 if (test_bit(GD_ADDED, &disk->state) && disk->fops->free_disk) in disk_release()
1311 disk->fops->free_disk(disk); in disk_release()
1313 bdev_drop(disk->part0); /* frees the disk */ in disk_release()
1318 const struct gendisk *disk = dev_to_disk(dev); in block_uevent() local
1320 return add_uevent_var(env, "DISKSEQ=%llu", disk->diskseq); in block_uevent()
1331 struct gendisk *disk = dev_to_disk(dev); in block_devnode() local
1333 if (disk->fops->devnode) in block_devnode()
1334 return disk->fops->devnode(disk, mode); in block_devnode()
1432 dev_t part_devt(struct gendisk *disk, u8 partno) in part_devt() argument
1438 part = xa_load(&disk->part_tbl, partno); in part_devt()
1449 struct gendisk *disk; in __alloc_disk_node() local
1451 disk = kzalloc_node(sizeof(struct gendisk), GFP_KERNEL, node_id); in __alloc_disk_node()
1452 if (!disk) in __alloc_disk_node()
1455 if (bioset_init(&disk->bio_split, BIO_POOL_SIZE, 0, 0)) in __alloc_disk_node()
1458 disk->bdi = bdi_alloc(node_id); in __alloc_disk_node()
1459 if (!disk->bdi) in __alloc_disk_node()
1463 disk->queue = q; in __alloc_disk_node()
1465 disk->part0 = bdev_alloc(disk, 0); in __alloc_disk_node()
1466 if (!disk->part0) in __alloc_disk_node()
1469 disk->node_id = node_id; in __alloc_disk_node()
1470 mutex_init(&disk->open_mutex); in __alloc_disk_node()
1471 xa_init(&disk->part_tbl); in __alloc_disk_node()
1472 if (xa_insert(&disk->part_tbl, 0, disk->part0, GFP_KERNEL)) in __alloc_disk_node()
1475 if (blkcg_init_disk(disk)) in __alloc_disk_node()
1478 disk_init_zone_resources(disk); in __alloc_disk_node()
1479 rand_initialize_disk(disk); in __alloc_disk_node()
1480 disk_to_dev(disk)->class = &block_class; in __alloc_disk_node()
1481 disk_to_dev(disk)->type = &disk_type; in __alloc_disk_node()
1482 device_initialize(disk_to_dev(disk)); in __alloc_disk_node()
1483 inc_diskseq(disk); in __alloc_disk_node()
1484 q->disk = disk; in __alloc_disk_node()
1485 lockdep_init_map(&disk->lockdep_map, "(bio completion)", lkclass, 0); in __alloc_disk_node()
1487 INIT_LIST_HEAD(&disk->slave_bdevs); in __alloc_disk_node()
1489 mutex_init(&disk->rqos_state_mutex); in __alloc_disk_node()
1490 kobject_init(&disk->queue_kobj, &blk_queue_ktype); in __alloc_disk_node()
1491 return disk; in __alloc_disk_node()
1494 xa_erase(&disk->part_tbl, 0); in __alloc_disk_node()
1496 xa_destroy(&disk->part_tbl); in __alloc_disk_node()
1497 disk->part0->bd_disk = NULL; in __alloc_disk_node()
1498 bdev_drop(disk->part0); in __alloc_disk_node()
1500 bdi_put(disk->bdi); in __alloc_disk_node()
1502 bioset_exit(&disk->bio_split); in __alloc_disk_node()
1504 kfree(disk); in __alloc_disk_node()
1513 struct gendisk *disk; in __blk_alloc_disk() local
1519 disk = __alloc_disk_node(q, node, lkclass); in __blk_alloc_disk()
1520 if (!disk) { in __blk_alloc_disk()
1524 set_bit(GD_OWNS_QUEUE, &disk->state); in __blk_alloc_disk()
1525 return disk; in __blk_alloc_disk()
1542 void put_disk(struct gendisk *disk) in put_disk() argument
1544 if (disk) in put_disk()
1545 put_device(disk_to_dev(disk)); in put_disk()
1568 void set_disk_ro(struct gendisk *disk, bool read_only) in set_disk_ro() argument
1571 if (test_and_set_bit(GD_READ_ONLY, &disk->state)) in set_disk_ro()
1574 if (!test_and_clear_bit(GD_READ_ONLY, &disk->state)) in set_disk_ro()
1577 set_disk_ro_uevent(disk, read_only); in set_disk_ro()
1581 void inc_diskseq(struct gendisk *disk) in inc_diskseq() argument
1583 disk->diskseq = atomic64_inc_return(&diskseq); in inc_diskseq()