diff options
author | Tejun Heo <tj@kernel.org> | 2010-12-08 14:57:36 -0500 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2010-12-16 11:53:38 -0500 |
commit | d2bf1b6723ed0eab378363649d15b7893bf14e91 (patch) | |
tree | 4a4144b09ab747ad661605aa761753d9a805e77f | |
parent | dddd9dc340ae1a41d90e084529ca979c77c4ecfe (diff) |
block: move register_disk() and del_gendisk() to block/genhd.c
There's no reason for register_disk() and del_gendisk() to be in
fs/partitions/check.c. Move both to genhd.c. While at it, collapse
unlink_gendisk(), which was artificially in a separate function due to
genhd.c / check.c split, into del_gendisk().
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
-rw-r--r-- | block/genhd.c | 90 | ||||
-rw-r--r-- | fs/partitions/check.c | 89 | ||||
-rw-r--r-- | include/linux/blkdev.h | 1 | ||||
-rw-r--r-- | include/linux/genhd.h | 1 |
4 files changed, 87 insertions, 94 deletions
diff --git a/block/genhd.c b/block/genhd.c index 0905ab22c8cf..2e5e4c0a1133 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
@@ -502,6 +502,64 @@ static int exact_lock(dev_t devt, void *data) | |||
502 | return 0; | 502 | return 0; |
503 | } | 503 | } |
504 | 504 | ||
505 | void register_disk(struct gendisk *disk) | ||
506 | { | ||
507 | 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 | ddev->parent = disk->driverfs_dev; | ||
514 | |||
515 | dev_set_name(ddev, disk->disk_name); | ||
516 | |||
517 | /* delay uevents, until we scanned partition table */ | ||
518 | dev_set_uevent_suppress(ddev, 1); | ||
519 | |||
520 | if (device_add(ddev)) | ||
521 | return; | ||
522 | if (!sysfs_deprecated) { | ||
523 | err = sysfs_create_link(block_depr, &ddev->kobj, | ||
524 | kobject_name(&ddev->kobj)); | ||
525 | if (err) { | ||
526 | device_del(ddev); | ||
527 | return; | ||
528 | } | ||
529 | } | ||
530 | disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj); | ||
531 | disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); | ||
532 | |||
533 | /* No minors to use for partitions */ | ||
534 | if (!disk_partitionable(disk)) | ||
535 | goto exit; | ||
536 | |||
537 | /* No such device (e.g., media were just removed) */ | ||
538 | if (!get_capacity(disk)) | ||
539 | goto exit; | ||
540 | |||
541 | bdev = bdget_disk(disk, 0); | ||
542 | if (!bdev) | ||
543 | goto exit; | ||
544 | |||
545 | bdev->bd_invalidated = 1; | ||
546 | err = blkdev_get(bdev, FMODE_READ, NULL); | ||
547 | if (err < 0) | ||
548 | goto exit; | ||
549 | blkdev_put(bdev, FMODE_READ); | ||
550 | |||
551 | exit: | ||
552 | /* announce disk after possible partitions are created */ | ||
553 | dev_set_uevent_suppress(ddev, 0); | ||
554 | kobject_uevent(&ddev->kobj, KOBJ_ADD); | ||
555 | |||
556 | /* announce possible partitions */ | ||
557 | disk_part_iter_init(&piter, disk, 0); | ||
558 | while ((part = disk_part_iter_next(&piter))) | ||
559 | kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD); | ||
560 | disk_part_iter_exit(&piter); | ||
561 | } | ||
562 | |||
505 | /** | 563 | /** |
506 | * add_disk - add partitioning information to kernel list | 564 | * add_disk - add partitioning information to kernel list |
507 | * @disk: per-device partitioning information | 565 | * @disk: per-device partitioning information |
@@ -552,17 +610,43 @@ void add_disk(struct gendisk *disk) | |||
552 | "bdi"); | 610 | "bdi"); |
553 | WARN_ON(retval); | 611 | WARN_ON(retval); |
554 | } | 612 | } |
555 | |||
556 | EXPORT_SYMBOL(add_disk); | 613 | EXPORT_SYMBOL(add_disk); |
557 | EXPORT_SYMBOL(del_gendisk); /* in partitions/check.c */ | ||
558 | 614 | ||
559 | void unlink_gendisk(struct gendisk *disk) | 615 | void del_gendisk(struct gendisk *disk) |
560 | { | 616 | { |
617 | struct disk_part_iter piter; | ||
618 | struct hd_struct *part; | ||
619 | |||
620 | /* invalidate stuff */ | ||
621 | disk_part_iter_init(&piter, disk, | ||
622 | DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE); | ||
623 | while ((part = disk_part_iter_next(&piter))) { | ||
624 | invalidate_partition(disk, part->partno); | ||
625 | delete_partition(disk, part->partno); | ||
626 | } | ||
627 | disk_part_iter_exit(&piter); | ||
628 | |||
629 | invalidate_partition(disk, 0); | ||
630 | blk_free_devt(disk_to_dev(disk)->devt); | ||
631 | set_capacity(disk, 0); | ||
632 | disk->flags &= ~GENHD_FL_UP; | ||
633 | |||
561 | sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); | 634 | sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); |
562 | bdi_unregister(&disk->queue->backing_dev_info); | 635 | bdi_unregister(&disk->queue->backing_dev_info); |
563 | blk_unregister_queue(disk); | 636 | blk_unregister_queue(disk); |
564 | blk_unregister_region(disk_devt(disk), disk->minors); | 637 | blk_unregister_region(disk_devt(disk), disk->minors); |
638 | |||
639 | part_stat_set_all(&disk->part0, 0); | ||
640 | disk->part0.stamp = 0; | ||
641 | |||
642 | kobject_put(disk->part0.holder_dir); | ||
643 | kobject_put(disk->slave_dir); | ||
644 | disk->driverfs_dev = NULL; | ||
645 | if (!sysfs_deprecated) | ||
646 | sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); | ||
647 | device_del(disk_to_dev(disk)); | ||
565 | } | 648 | } |
649 | EXPORT_SYMBOL(del_gendisk); | ||
566 | 650 | ||
567 | /** | 651 | /** |
568 | * get_gendisk - get partitioning information for a given device | 652 | * get_gendisk - get partitioning information for a given device |
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index bdf8d3cc95a4..9a48d65d9855 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
@@ -516,65 +516,6 @@ out_put: | |||
516 | return ERR_PTR(err); | 516 | return ERR_PTR(err); |
517 | } | 517 | } |
518 | 518 | ||
519 | /* Not exported, helper to add_disk(). */ | ||
520 | void register_disk(struct gendisk *disk) | ||
521 | { | ||
522 | struct device *ddev = disk_to_dev(disk); | ||
523 | struct block_device *bdev; | ||
524 | struct disk_part_iter piter; | ||
525 | struct hd_struct *part; | ||
526 | int err; | ||
527 | |||
528 | ddev->parent = disk->driverfs_dev; | ||
529 | |||
530 | dev_set_name(ddev, disk->disk_name); | ||
531 | |||
532 | /* delay uevents, until we scanned partition table */ | ||
533 | dev_set_uevent_suppress(ddev, 1); | ||
534 | |||
535 | if (device_add(ddev)) | ||
536 | return; | ||
537 | if (!sysfs_deprecated) { | ||
538 | err = sysfs_create_link(block_depr, &ddev->kobj, | ||
539 | kobject_name(&ddev->kobj)); | ||
540 | if (err) { | ||
541 | device_del(ddev); | ||
542 | return; | ||
543 | } | ||
544 | } | ||
545 | disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj); | ||
546 | disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); | ||
547 | |||
548 | /* No minors to use for partitions */ | ||
549 | if (!disk_partitionable(disk)) | ||
550 | goto exit; | ||
551 | |||
552 | /* No such device (e.g., media were just removed) */ | ||
553 | if (!get_capacity(disk)) | ||
554 | goto exit; | ||
555 | |||
556 | bdev = bdget_disk(disk, 0); | ||
557 | if (!bdev) | ||
558 | goto exit; | ||
559 | |||
560 | bdev->bd_invalidated = 1; | ||
561 | err = blkdev_get(bdev, FMODE_READ, NULL); | ||
562 | if (err < 0) | ||
563 | goto exit; | ||
564 | blkdev_put(bdev, FMODE_READ); | ||
565 | |||
566 | exit: | ||
567 | /* announce disk after possible partitions are created */ | ||
568 | dev_set_uevent_suppress(ddev, 0); | ||
569 | kobject_uevent(&ddev->kobj, KOBJ_ADD); | ||
570 | |||
571 | /* announce possible partitions */ | ||
572 | disk_part_iter_init(&piter, disk, 0); | ||
573 | while ((part = disk_part_iter_next(&piter))) | ||
574 | kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD); | ||
575 | disk_part_iter_exit(&piter); | ||
576 | } | ||
577 | |||
578 | static bool disk_unlock_native_capacity(struct gendisk *disk) | 519 | static bool disk_unlock_native_capacity(struct gendisk *disk) |
579 | { | 520 | { |
580 | const struct block_device_operations *bdops = disk->fops; | 521 | const struct block_device_operations *bdops = disk->fops; |
@@ -737,33 +678,3 @@ fail: | |||
737 | } | 678 | } |
738 | 679 | ||
739 | EXPORT_SYMBOL(read_dev_sector); | 680 | EXPORT_SYMBOL(read_dev_sector); |
740 | |||
741 | void del_gendisk(struct gendisk *disk) | ||
742 | { | ||
743 | struct disk_part_iter piter; | ||
744 | struct hd_struct *part; | ||
745 | |||
746 | /* invalidate stuff */ | ||
747 | disk_part_iter_init(&piter, disk, | ||
748 | DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE); | ||
749 | while ((part = disk_part_iter_next(&piter))) { | ||
750 | invalidate_partition(disk, part->partno); | ||
751 | delete_partition(disk, part->partno); | ||
752 | } | ||
753 | disk_part_iter_exit(&piter); | ||
754 | |||
755 | invalidate_partition(disk, 0); | ||
756 | blk_free_devt(disk_to_dev(disk)->devt); | ||
757 | set_capacity(disk, 0); | ||
758 | disk->flags &= ~GENHD_FL_UP; | ||
759 | unlink_gendisk(disk); | ||
760 | part_stat_set_all(&disk->part0, 0); | ||
761 | disk->part0.stamp = 0; | ||
762 | |||
763 | kobject_put(disk->part0.holder_dir); | ||
764 | kobject_put(disk->slave_dir); | ||
765 | disk->driverfs_dev = NULL; | ||
766 | if (!sysfs_deprecated) | ||
767 | sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); | ||
768 | device_del(disk_to_dev(disk)); | ||
769 | } | ||
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index aae86fd10c4f..83031bcf8366 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -643,7 +643,6 @@ static inline void rq_flush_dcache_pages(struct request *rq) | |||
643 | 643 | ||
644 | extern int blk_register_queue(struct gendisk *disk); | 644 | extern int blk_register_queue(struct gendisk *disk); |
645 | extern void blk_unregister_queue(struct gendisk *disk); | 645 | extern void blk_unregister_queue(struct gendisk *disk); |
646 | extern void register_disk(struct gendisk *dev); | ||
647 | extern void generic_make_request(struct bio *bio); | 646 | extern void generic_make_request(struct bio *bio); |
648 | extern void blk_rq_init(struct request_queue *q, struct request *rq); | 647 | extern void blk_rq_init(struct request_queue *q, struct request *rq); |
649 | extern void blk_put_request(struct request *); | 648 | extern void blk_put_request(struct request *); |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 5e4e6928387c..56e17ed24816 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -394,7 +394,6 @@ extern void part_round_stats(int cpu, struct hd_struct *part); | |||
394 | /* block/genhd.c */ | 394 | /* block/genhd.c */ |
395 | extern void add_disk(struct gendisk *disk); | 395 | extern void add_disk(struct gendisk *disk); |
396 | extern void del_gendisk(struct gendisk *gp); | 396 | extern void del_gendisk(struct gendisk *gp); |
397 | extern void unlink_gendisk(struct gendisk *gp); | ||
398 | extern struct gendisk *get_gendisk(dev_t dev, int *partno); | 397 | extern struct gendisk *get_gendisk(dev_t dev, int *partno); |
399 | extern struct block_device *bdget_disk(struct gendisk *disk, int partno); | 398 | extern struct block_device *bdget_disk(struct gendisk *disk, int partno); |
400 | 399 | ||