diff options
| -rw-r--r-- | fs/block_dev.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 4fb8a3431531..94d41db62004 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -873,6 +873,11 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk) | |||
| 873 | ret = add_symlink(bdev->bd_part->holder_dir, &disk_to_dev(disk)->kobj); | 873 | ret = add_symlink(bdev->bd_part->holder_dir, &disk_to_dev(disk)->kobj); |
| 874 | if (ret) | 874 | if (ret) |
| 875 | goto out_del; | 875 | goto out_del; |
| 876 | /* | ||
| 877 | * bdev could be deleted beneath us which would implicitly destroy | ||
| 878 | * the holder directory. Hold on to it. | ||
| 879 | */ | ||
| 880 | kobject_get(bdev->bd_part->holder_dir); | ||
| 876 | 881 | ||
| 877 | list_add(&holder->list, &bdev->bd_holder_disks); | 882 | list_add(&holder->list, &bdev->bd_holder_disks); |
| 878 | goto out_unlock; | 883 | goto out_unlock; |
| @@ -909,6 +914,7 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk) | |||
| 909 | del_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj); | 914 | del_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj); |
| 910 | del_symlink(bdev->bd_part->holder_dir, | 915 | del_symlink(bdev->bd_part->holder_dir, |
| 911 | &disk_to_dev(disk)->kobj); | 916 | &disk_to_dev(disk)->kobj); |
| 917 | kobject_put(bdev->bd_part->holder_dir); | ||
| 912 | list_del_init(&holder->list); | 918 | list_del_init(&holder->list); |
| 913 | kfree(holder); | 919 | kfree(holder); |
| 914 | } | 920 | } |
