diff options
Diffstat (limited to 'fs/partitions/check.c')
-rw-r--r-- | fs/partitions/check.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 3d73d94d93a7..22d38ffc9ef0 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
@@ -358,14 +358,13 @@ void delete_partition(struct gendisk *disk, int part) | |||
358 | p->ios[0] = p->ios[1] = 0; | 358 | p->ios[0] = p->ios[1] = 0; |
359 | p->sectors[0] = p->sectors[1] = 0; | 359 | p->sectors[0] = p->sectors[1] = 0; |
360 | sysfs_remove_link(&p->kobj, "subsystem"); | 360 | sysfs_remove_link(&p->kobj, "subsystem"); |
361 | if (p->holder_dir) | 361 | kobject_unregister(p->holder_dir); |
362 | kobject_unregister(p->holder_dir); | ||
363 | kobject_uevent(&p->kobj, KOBJ_REMOVE); | 362 | kobject_uevent(&p->kobj, KOBJ_REMOVE); |
364 | kobject_del(&p->kobj); | 363 | kobject_del(&p->kobj); |
365 | kobject_put(&p->kobj); | 364 | kobject_put(&p->kobj); |
366 | } | 365 | } |
367 | 366 | ||
368 | void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) | 367 | void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, int flags) |
369 | { | 368 | { |
370 | struct hd_struct *p; | 369 | struct hd_struct *p; |
371 | 370 | ||
@@ -390,6 +389,15 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) | |||
390 | if (!disk->part_uevent_suppress) | 389 | if (!disk->part_uevent_suppress) |
391 | kobject_uevent(&p->kobj, KOBJ_ADD); | 390 | kobject_uevent(&p->kobj, KOBJ_ADD); |
392 | sysfs_create_link(&p->kobj, &block_subsys.kset.kobj, "subsystem"); | 391 | sysfs_create_link(&p->kobj, &block_subsys.kset.kobj, "subsystem"); |
392 | if (flags & ADDPART_FLAG_WHOLEDISK) { | ||
393 | static struct attribute addpartattr = { | ||
394 | .name = "whole_disk", | ||
395 | .mode = S_IRUSR | S_IRGRP | S_IROTH, | ||
396 | .owner = THIS_MODULE, | ||
397 | }; | ||
398 | |||
399 | sysfs_create_file(&p->kobj, &addpartattr); | ||
400 | } | ||
393 | partition_sysfs_add_subdir(p); | 401 | partition_sysfs_add_subdir(p); |
394 | disk->part[part-1] = p; | 402 | disk->part[part-1] = p; |
395 | } | 403 | } |
@@ -543,9 +551,9 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) | |||
543 | printk(" %s: p%d exceeds device capacity\n", | 551 | printk(" %s: p%d exceeds device capacity\n", |
544 | disk->disk_name, p); | 552 | disk->disk_name, p); |
545 | } | 553 | } |
546 | add_partition(disk, p, from, size); | 554 | add_partition(disk, p, from, size, state->parts[p].flags); |
547 | #ifdef CONFIG_BLK_DEV_MD | 555 | #ifdef CONFIG_BLK_DEV_MD |
548 | if (state->parts[p].flags) | 556 | if (state->parts[p].flags & ADDPART_FLAG_RAID) |
549 | md_autodetect_dev(bdev->bd_dev+p); | 557 | md_autodetect_dev(bdev->bd_dev+p); |
550 | #endif | 558 | #endif |
551 | } | 559 | } |
@@ -594,10 +602,8 @@ void del_gendisk(struct gendisk *disk) | |||
594 | disk->stamp = 0; | 602 | disk->stamp = 0; |
595 | 603 | ||
596 | kobject_uevent(&disk->kobj, KOBJ_REMOVE); | 604 | kobject_uevent(&disk->kobj, KOBJ_REMOVE); |
597 | if (disk->holder_dir) | 605 | kobject_unregister(disk->holder_dir); |
598 | kobject_unregister(disk->holder_dir); | 606 | kobject_unregister(disk->slave_dir); |
599 | if (disk->slave_dir) | ||
600 | kobject_unregister(disk->slave_dir); | ||
601 | if (disk->driverfs_dev) { | 607 | if (disk->driverfs_dev) { |
602 | char *disk_name = make_block_name(disk); | 608 | char *disk_name = make_block_name(disk); |
603 | sysfs_remove_link(&disk->kobj, "device"); | 609 | sysfs_remove_link(&disk->kobj, "device"); |