diff options
Diffstat (limited to 'fs/partitions/check.c')
-rw-r--r-- | fs/partitions/check.c | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 79fbf3f390f0..0a8b0ad0c7e2 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
@@ -352,6 +352,7 @@ static void part_release(struct device *dev) | |||
352 | { | 352 | { |
353 | struct hd_struct *p = dev_to_part(dev); | 353 | struct hd_struct *p = dev_to_part(dev); |
354 | free_part_stats(p); | 354 | free_part_stats(p); |
355 | free_part_info(p); | ||
355 | kfree(p); | 356 | kfree(p); |
356 | } | 357 | } |
357 | 358 | ||
@@ -401,7 +402,8 @@ static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, | |||
401 | whole_disk_show, NULL); | 402 | whole_disk_show, NULL); |
402 | 403 | ||
403 | struct hd_struct *add_partition(struct gendisk *disk, int partno, | 404 | struct hd_struct *add_partition(struct gendisk *disk, int partno, |
404 | sector_t start, sector_t len, int flags) | 405 | sector_t start, sector_t len, int flags, |
406 | struct partition_meta_info *info) | ||
405 | { | 407 | { |
406 | struct hd_struct *p; | 408 | struct hd_struct *p; |
407 | dev_t devt = MKDEV(0, 0); | 409 | dev_t devt = MKDEV(0, 0); |
@@ -438,6 +440,14 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno, | |||
438 | p->partno = partno; | 440 | p->partno = partno; |
439 | p->policy = get_disk_ro(disk); | 441 | p->policy = get_disk_ro(disk); |
440 | 442 | ||
443 | if (info) { | ||
444 | struct partition_meta_info *pinfo = alloc_part_info(disk); | ||
445 | if (!pinfo) | ||
446 | goto out_free_stats; | ||
447 | memcpy(pinfo, info, sizeof(*info)); | ||
448 | p->info = pinfo; | ||
449 | } | ||
450 | |||
441 | dname = dev_name(ddev); | 451 | dname = dev_name(ddev); |
442 | if (isdigit(dname[strlen(dname) - 1])) | 452 | if (isdigit(dname[strlen(dname) - 1])) |
443 | dev_set_name(pdev, "%sp%d", dname, partno); | 453 | dev_set_name(pdev, "%sp%d", dname, partno); |
@@ -451,7 +461,7 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno, | |||
451 | 461 | ||
452 | err = blk_alloc_devt(p, &devt); | 462 | err = blk_alloc_devt(p, &devt); |
453 | if (err) | 463 | if (err) |
454 | goto out_free_stats; | 464 | goto out_free_info; |
455 | pdev->devt = devt; | 465 | pdev->devt = devt; |
456 | 466 | ||
457 | /* delay uevent until 'holders' subdir is created */ | 467 | /* delay uevent until 'holders' subdir is created */ |
@@ -481,6 +491,8 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno, | |||
481 | 491 | ||
482 | return p; | 492 | return p; |
483 | 493 | ||
494 | out_free_info: | ||
495 | free_part_info(p); | ||
484 | out_free_stats: | 496 | out_free_stats: |
485 | free_part_stats(p); | 497 | free_part_stats(p); |
486 | out_free: | 498 | out_free: |
@@ -513,14 +525,14 @@ void register_disk(struct gendisk *disk) | |||
513 | 525 | ||
514 | if (device_add(ddev)) | 526 | if (device_add(ddev)) |
515 | return; | 527 | return; |
516 | #ifndef CONFIG_SYSFS_DEPRECATED | 528 | if (!sysfs_deprecated) { |
517 | err = sysfs_create_link(block_depr, &ddev->kobj, | 529 | err = sysfs_create_link(block_depr, &ddev->kobj, |
518 | kobject_name(&ddev->kobj)); | 530 | kobject_name(&ddev->kobj)); |
519 | if (err) { | 531 | if (err) { |
520 | device_del(ddev); | 532 | device_del(ddev); |
521 | return; | 533 | return; |
534 | } | ||
522 | } | 535 | } |
523 | #endif | ||
524 | disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj); | 536 | disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj); |
525 | disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); | 537 | disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); |
526 | 538 | ||
@@ -642,6 +654,7 @@ rescan: | |||
642 | /* add partitions */ | 654 | /* add partitions */ |
643 | for (p = 1; p < state->limit; p++) { | 655 | for (p = 1; p < state->limit; p++) { |
644 | sector_t size, from; | 656 | sector_t size, from; |
657 | struct partition_meta_info *info = NULL; | ||
645 | 658 | ||
646 | size = state->parts[p].size; | 659 | size = state->parts[p].size; |
647 | if (!size) | 660 | if (!size) |
@@ -675,8 +688,12 @@ rescan: | |||
675 | size = get_capacity(disk) - from; | 688 | size = get_capacity(disk) - from; |
676 | } | 689 | } |
677 | } | 690 | } |
691 | |||
692 | if (state->parts[p].has_info) | ||
693 | info = &state->parts[p].info; | ||
678 | part = add_partition(disk, p, from, size, | 694 | part = add_partition(disk, p, from, size, |
679 | state->parts[p].flags); | 695 | state->parts[p].flags, |
696 | &state->parts[p].info); | ||
680 | if (IS_ERR(part)) { | 697 | if (IS_ERR(part)) { |
681 | printk(KERN_ERR " %s: p%d could not be added: %ld\n", | 698 | printk(KERN_ERR " %s: p%d could not be added: %ld\n", |
682 | disk->disk_name, p, -PTR_ERR(part)); | 699 | disk->disk_name, p, -PTR_ERR(part)); |
@@ -737,8 +754,7 @@ void del_gendisk(struct gendisk *disk) | |||
737 | kobject_put(disk->part0.holder_dir); | 754 | kobject_put(disk->part0.holder_dir); |
738 | kobject_put(disk->slave_dir); | 755 | kobject_put(disk->slave_dir); |
739 | disk->driverfs_dev = NULL; | 756 | disk->driverfs_dev = NULL; |
740 | #ifndef CONFIG_SYSFS_DEPRECATED | 757 | if (!sysfs_deprecated) |
741 | sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); | 758 | sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); |
742 | #endif | ||
743 | device_del(disk_to_dev(disk)); | 759 | device_del(disk_to_dev(disk)); |
744 | } | 760 | } |