diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/partitions/check.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index af0cb4b9e784..f3b6af071722 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
@@ -331,7 +331,9 @@ void delete_partition(struct gendisk *disk, int part) | |||
331 | devfs_remove("%s/part%d", disk->devfs_name, part); | 331 | devfs_remove("%s/part%d", disk->devfs_name, part); |
332 | if (p->holder_dir) | 332 | if (p->holder_dir) |
333 | kobject_unregister(p->holder_dir); | 333 | kobject_unregister(p->holder_dir); |
334 | kobject_unregister(&p->kobj); | 334 | kobject_uevent(&p->kobj, KOBJ_REMOVE); |
335 | kobject_del(&p->kobj); | ||
336 | kobject_put(&p->kobj); | ||
335 | } | 337 | } |
336 | 338 | ||
337 | void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) | 339 | void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) |
@@ -357,7 +359,10 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) | |||
357 | snprintf(p->kobj.name,KOBJ_NAME_LEN,"%s%d",disk->kobj.name,part); | 359 | snprintf(p->kobj.name,KOBJ_NAME_LEN,"%s%d",disk->kobj.name,part); |
358 | p->kobj.parent = &disk->kobj; | 360 | p->kobj.parent = &disk->kobj; |
359 | p->kobj.ktype = &ktype_part; | 361 | p->kobj.ktype = &ktype_part; |
360 | kobject_register(&p->kobj); | 362 | kobject_init(&p->kobj); |
363 | kobject_add(&p->kobj); | ||
364 | if (!disk->part_uevent_suppress) | ||
365 | kobject_uevent(&p->kobj, KOBJ_ADD); | ||
361 | partition_sysfs_add_subdir(p); | 366 | partition_sysfs_add_subdir(p); |
362 | disk->part[part-1] = p; | 367 | disk->part[part-1] = p; |
363 | } | 368 | } |
@@ -395,6 +400,8 @@ void register_disk(struct gendisk *disk) | |||
395 | { | 400 | { |
396 | struct block_device *bdev; | 401 | struct block_device *bdev; |
397 | char *s; | 402 | char *s; |
403 | int i; | ||
404 | struct hd_struct *p; | ||
398 | int err; | 405 | int err; |
399 | 406 | ||
400 | strlcpy(disk->kobj.name,disk->disk_name,KOBJ_NAME_LEN); | 407 | strlcpy(disk->kobj.name,disk->disk_name,KOBJ_NAME_LEN); |
@@ -406,13 +413,12 @@ void register_disk(struct gendisk *disk) | |||
406 | return; | 413 | return; |
407 | disk_sysfs_symlinks(disk); | 414 | disk_sysfs_symlinks(disk); |
408 | disk_sysfs_add_subdirs(disk); | 415 | disk_sysfs_add_subdirs(disk); |
409 | kobject_uevent(&disk->kobj, KOBJ_ADD); | ||
410 | 416 | ||
411 | /* No minors to use for partitions */ | 417 | /* No minors to use for partitions */ |
412 | if (disk->minors == 1) { | 418 | if (disk->minors == 1) { |
413 | if (disk->devfs_name[0] != '\0') | 419 | if (disk->devfs_name[0] != '\0') |
414 | devfs_add_disk(disk); | 420 | devfs_add_disk(disk); |
415 | return; | 421 | goto exit; |
416 | } | 422 | } |
417 | 423 | ||
418 | /* always add handle for the whole disk */ | 424 | /* always add handle for the whole disk */ |
@@ -420,16 +426,32 @@ void register_disk(struct gendisk *disk) | |||
420 | 426 | ||
421 | /* No such device (e.g., media were just removed) */ | 427 | /* No such device (e.g., media were just removed) */ |
422 | if (!get_capacity(disk)) | 428 | if (!get_capacity(disk)) |
423 | return; | 429 | goto exit; |
424 | 430 | ||
425 | bdev = bdget_disk(disk, 0); | 431 | bdev = bdget_disk(disk, 0); |
426 | if (!bdev) | 432 | if (!bdev) |
427 | return; | 433 | goto exit; |
428 | 434 | ||
435 | /* scan partition table, but suppress uevents */ | ||
429 | bdev->bd_invalidated = 1; | 436 | bdev->bd_invalidated = 1; |
430 | if (blkdev_get(bdev, FMODE_READ, 0) < 0) | 437 | disk->part_uevent_suppress = 1; |
431 | return; | 438 | err = blkdev_get(bdev, FMODE_READ, 0); |
439 | disk->part_uevent_suppress = 0; | ||
440 | if (err < 0) | ||
441 | goto exit; | ||
432 | blkdev_put(bdev); | 442 | blkdev_put(bdev); |
443 | |||
444 | exit: | ||
445 | /* announce disk after possible partitions are already created */ | ||
446 | kobject_uevent(&disk->kobj, KOBJ_ADD); | ||
447 | |||
448 | /* announce possible partitions */ | ||
449 | for (i = 1; i < disk->minors; i++) { | ||
450 | p = disk->part[i-1]; | ||
451 | if (!p || !p->nr_sects) | ||
452 | continue; | ||
453 | kobject_uevent(&p->kobj, KOBJ_ADD); | ||
454 | } | ||
433 | } | 455 | } |
434 | 456 | ||
435 | int rescan_partitions(struct gendisk *disk, struct block_device *bdev) | 457 | int rescan_partitions(struct gendisk *disk, struct block_device *bdev) |