diff options
Diffstat (limited to 'fs/partitions/check.c')
| -rw-r--r-- | fs/partitions/check.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index f924f459bdb8..af0cb4b9e784 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
| @@ -297,6 +297,25 @@ struct kobj_type ktype_part = { | |||
| 297 | .sysfs_ops = &part_sysfs_ops, | 297 | .sysfs_ops = &part_sysfs_ops, |
| 298 | }; | 298 | }; |
| 299 | 299 | ||
| 300 | static inline void partition_sysfs_add_subdir(struct hd_struct *p) | ||
| 301 | { | ||
| 302 | struct kobject *k; | ||
| 303 | |||
| 304 | k = kobject_get(&p->kobj); | ||
| 305 | p->holder_dir = kobject_add_dir(k, "holders"); | ||
| 306 | kobject_put(k); | ||
| 307 | } | ||
| 308 | |||
| 309 | static inline void disk_sysfs_add_subdirs(struct gendisk *disk) | ||
| 310 | { | ||
| 311 | struct kobject *k; | ||
| 312 | |||
| 313 | k = kobject_get(&disk->kobj); | ||
| 314 | disk->holder_dir = kobject_add_dir(k, "holders"); | ||
| 315 | disk->slave_dir = kobject_add_dir(k, "slaves"); | ||
| 316 | kobject_put(k); | ||
| 317 | } | ||
| 318 | |||
| 300 | void delete_partition(struct gendisk *disk, int part) | 319 | void delete_partition(struct gendisk *disk, int part) |
| 301 | { | 320 | { |
| 302 | struct hd_struct *p = disk->part[part-1]; | 321 | struct hd_struct *p = disk->part[part-1]; |
| @@ -310,6 +329,8 @@ void delete_partition(struct gendisk *disk, int part) | |||
| 310 | p->ios[0] = p->ios[1] = 0; | 329 | p->ios[0] = p->ios[1] = 0; |
| 311 | p->sectors[0] = p->sectors[1] = 0; | 330 | p->sectors[0] = p->sectors[1] = 0; |
| 312 | devfs_remove("%s/part%d", disk->devfs_name, part); | 331 | devfs_remove("%s/part%d", disk->devfs_name, part); |
| 332 | if (p->holder_dir) | ||
| 333 | kobject_unregister(p->holder_dir); | ||
| 313 | kobject_unregister(&p->kobj); | 334 | kobject_unregister(&p->kobj); |
| 314 | } | 335 | } |
| 315 | 336 | ||
| @@ -337,6 +358,7 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) | |||
| 337 | p->kobj.parent = &disk->kobj; | 358 | p->kobj.parent = &disk->kobj; |
| 338 | p->kobj.ktype = &ktype_part; | 359 | p->kobj.ktype = &ktype_part; |
| 339 | kobject_register(&p->kobj); | 360 | kobject_register(&p->kobj); |
| 361 | partition_sysfs_add_subdir(p); | ||
| 340 | disk->part[part-1] = p; | 362 | disk->part[part-1] = p; |
| 341 | } | 363 | } |
| 342 | 364 | ||
| @@ -383,6 +405,7 @@ void register_disk(struct gendisk *disk) | |||
| 383 | if ((err = kobject_add(&disk->kobj))) | 405 | if ((err = kobject_add(&disk->kobj))) |
| 384 | return; | 406 | return; |
| 385 | disk_sysfs_symlinks(disk); | 407 | disk_sysfs_symlinks(disk); |
| 408 | disk_sysfs_add_subdirs(disk); | ||
| 386 | kobject_uevent(&disk->kobj, KOBJ_ADD); | 409 | kobject_uevent(&disk->kobj, KOBJ_ADD); |
| 387 | 410 | ||
| 388 | /* No minors to use for partitions */ | 411 | /* No minors to use for partitions */ |
| @@ -483,6 +506,10 @@ void del_gendisk(struct gendisk *disk) | |||
| 483 | 506 | ||
| 484 | devfs_remove_disk(disk); | 507 | devfs_remove_disk(disk); |
| 485 | 508 | ||
| 509 | if (disk->holder_dir) | ||
| 510 | kobject_unregister(disk->holder_dir); | ||
| 511 | if (disk->slave_dir) | ||
| 512 | kobject_unregister(disk->slave_dir); | ||
| 486 | if (disk->driverfs_dev) { | 513 | if (disk->driverfs_dev) { |
| 487 | char *disk_name = make_block_name(disk); | 514 | char *disk_name = make_block_name(disk); |
| 488 | sysfs_remove_link(&disk->kobj, "device"); | 515 | sysfs_remove_link(&disk->kobj, "device"); |
