aboutsummaryrefslogtreecommitdiffstats
path: root/block/genhd.c
diff options
context:
space:
mode:
Diffstat (limited to 'block/genhd.c')
-rw-r--r--block/genhd.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/block/genhd.c b/block/genhd.c
index eedab5b4685b..d9de3e482d1e 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -478,14 +478,37 @@ static int exact_lock(dev_t devt, void *data)
478 * 478 *
479 * This function registers the partitioning information in @disk 479 * This function registers the partitioning information in @disk
480 * with the kernel. 480 * with the kernel.
481 *
482 * FIXME: error handling
481 */ 483 */
482void add_disk(struct gendisk *disk) 484void add_disk(struct gendisk *disk)
483{ 485{
484 struct backing_dev_info *bdi; 486 struct backing_dev_info *bdi;
487 dev_t devt;
485 int retval; 488 int retval;
486 489
490 /* minors == 0 indicates to use ext devt from part0 and should
491 * be accompanied with EXT_DEVT flag. Make sure all
492 * parameters make sense.
493 */
494 WARN_ON(disk->minors && !(disk->major || disk->first_minor));
495 WARN_ON(!disk->minors && !(disk->flags & GENHD_FL_EXT_DEVT));
496
487 disk->flags |= GENHD_FL_UP; 497 disk->flags |= GENHD_FL_UP;
488 disk_to_dev(disk)->devt = MKDEV(disk->major, disk->first_minor); 498
499 retval = blk_alloc_devt(&disk->part0, &devt);
500 if (retval) {
501 WARN_ON(1);
502 return;
503 }
504 disk_to_dev(disk)->devt = devt;
505
506 /* ->major and ->first_minor aren't supposed to be
507 * dereferenced from here on, but set them just in case.
508 */
509 disk->major = MAJOR(devt);
510 disk->first_minor = MINOR(devt);
511
489 blk_register_region(disk_devt(disk), disk->minors, NULL, 512 blk_register_region(disk_devt(disk), disk->minors, NULL,
490 exact_match, exact_lock, disk); 513 exact_match, exact_lock, disk);
491 register_disk(disk); 514 register_disk(disk);