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.c24
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
368void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) 367void 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");