aboutsummaryrefslogtreecommitdiffstats
path: root/fs/partitions/check.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/partitions/check.c')
-rw-r--r--fs/partitions/check.c42
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
403struct hd_struct *add_partition(struct gendisk *disk, int partno, 404struct 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
494out_free_info:
495 free_part_info(p);
484out_free_stats: 496out_free_stats:
485 free_part_stats(p); 497 free_part_stats(p);
486out_free: 498out_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}