diff options
Diffstat (limited to 'fs/partitions')
-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"); |