diff options
Diffstat (limited to 'block/genhd.c')
-rw-r--r-- | block/genhd.c | 25 |
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 | */ |
482 | void add_disk(struct gendisk *disk) | 484 | void 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); |