diff options
Diffstat (limited to 'fs/partitions/check.c')
| -rw-r--r-- | fs/partitions/check.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 8dc1822a7022..f924f459bdb8 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include "ibm.h" | 35 | #include "ibm.h" |
| 36 | #include "ultrix.h" | 36 | #include "ultrix.h" |
| 37 | #include "efi.h" | 37 | #include "efi.h" |
| 38 | #include "karma.h" | ||
| 38 | 39 | ||
| 39 | #ifdef CONFIG_BLK_DEV_MD | 40 | #ifdef CONFIG_BLK_DEV_MD |
| 40 | extern void md_autodetect_dev(dev_t dev); | 41 | extern void md_autodetect_dev(dev_t dev); |
| @@ -103,6 +104,9 @@ static int (*check_part[])(struct parsed_partitions *, struct block_device *) = | |||
| 103 | #ifdef CONFIG_IBM_PARTITION | 104 | #ifdef CONFIG_IBM_PARTITION |
| 104 | ibm_partition, | 105 | ibm_partition, |
| 105 | #endif | 106 | #endif |
| 107 | #ifdef CONFIG_KARMA_PARTITION | ||
| 108 | karma_partition, | ||
| 109 | #endif | ||
| 106 | NULL | 110 | NULL |
| 107 | }; | 111 | }; |
| 108 | 112 | ||
| @@ -226,7 +230,7 @@ static struct sysfs_ops part_sysfs_ops = { | |||
| 226 | static ssize_t part_uevent_store(struct hd_struct * p, | 230 | static ssize_t part_uevent_store(struct hd_struct * p, |
| 227 | const char *page, size_t count) | 231 | const char *page, size_t count) |
| 228 | { | 232 | { |
| 229 | kobject_hotplug(&p->kobj, KOBJ_ADD); | 233 | kobject_uevent(&p->kobj, KOBJ_ADD); |
| 230 | return count; | 234 | return count; |
| 231 | } | 235 | } |
| 232 | static ssize_t part_dev_read(struct hd_struct * p, char *page) | 236 | static ssize_t part_dev_read(struct hd_struct * p, char *page) |
| @@ -336,12 +340,31 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) | |||
| 336 | disk->part[part-1] = p; | 340 | disk->part[part-1] = p; |
| 337 | } | 341 | } |
| 338 | 342 | ||
| 343 | static char *make_block_name(struct gendisk *disk) | ||
| 344 | { | ||
| 345 | char *name; | ||
| 346 | static char *block_str = "block:"; | ||
| 347 | int size; | ||
| 348 | |||
| 349 | size = strlen(block_str) + strlen(disk->disk_name) + 1; | ||
| 350 | name = kmalloc(size, GFP_KERNEL); | ||
| 351 | if (!name) | ||
| 352 | return NULL; | ||
| 353 | strcpy(name, block_str); | ||
| 354 | strcat(name, disk->disk_name); | ||
| 355 | return name; | ||
| 356 | } | ||
| 357 | |||
| 339 | static void disk_sysfs_symlinks(struct gendisk *disk) | 358 | static void disk_sysfs_symlinks(struct gendisk *disk) |
| 340 | { | 359 | { |
| 341 | struct device *target = get_device(disk->driverfs_dev); | 360 | struct device *target = get_device(disk->driverfs_dev); |
| 342 | if (target) { | 361 | if (target) { |
| 362 | char *disk_name = make_block_name(disk); | ||
| 343 | sysfs_create_link(&disk->kobj,&target->kobj,"device"); | 363 | sysfs_create_link(&disk->kobj,&target->kobj,"device"); |
| 344 | sysfs_create_link(&target->kobj,&disk->kobj,"block"); | 364 | if (disk_name) { |
| 365 | sysfs_create_link(&target->kobj,&disk->kobj,disk_name); | ||
| 366 | kfree(disk_name); | ||
| 367 | } | ||
| 345 | } | 368 | } |
| 346 | } | 369 | } |
| 347 | 370 | ||
| @@ -360,7 +383,7 @@ void register_disk(struct gendisk *disk) | |||
| 360 | if ((err = kobject_add(&disk->kobj))) | 383 | if ((err = kobject_add(&disk->kobj))) |
| 361 | return; | 384 | return; |
| 362 | disk_sysfs_symlinks(disk); | 385 | disk_sysfs_symlinks(disk); |
| 363 | kobject_hotplug(&disk->kobj, KOBJ_ADD); | 386 | kobject_uevent(&disk->kobj, KOBJ_ADD); |
| 364 | 387 | ||
| 365 | /* No minors to use for partitions */ | 388 | /* No minors to use for partitions */ |
| 366 | if (disk->minors == 1) { | 389 | if (disk->minors == 1) { |
| @@ -461,10 +484,14 @@ void del_gendisk(struct gendisk *disk) | |||
| 461 | devfs_remove_disk(disk); | 484 | devfs_remove_disk(disk); |
| 462 | 485 | ||
| 463 | if (disk->driverfs_dev) { | 486 | if (disk->driverfs_dev) { |
| 487 | char *disk_name = make_block_name(disk); | ||
| 464 | sysfs_remove_link(&disk->kobj, "device"); | 488 | sysfs_remove_link(&disk->kobj, "device"); |
| 465 | sysfs_remove_link(&disk->driverfs_dev->kobj, "block"); | 489 | if (disk_name) { |
| 490 | sysfs_remove_link(&disk->driverfs_dev->kobj, disk_name); | ||
| 491 | kfree(disk_name); | ||
| 492 | } | ||
| 466 | put_device(disk->driverfs_dev); | 493 | put_device(disk->driverfs_dev); |
| 467 | } | 494 | } |
| 468 | kobject_hotplug(&disk->kobj, KOBJ_REMOVE); | 495 | kobject_uevent(&disk->kobj, KOBJ_REMOVE); |
| 469 | kobject_del(&disk->kobj); | 496 | kobject_del(&disk->kobj); |
| 470 | } | 497 | } |
