diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/genhd.c | 6 | ||||
-rw-r--r-- | block/partition-generic.c | 9 |
2 files changed, 10 insertions, 5 deletions
diff --git a/block/genhd.c b/block/genhd.c index 85df45292dba..0c706f33a599 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
@@ -1284,7 +1284,11 @@ struct gendisk *alloc_disk_node(int minors, int node_id) | |||
1284 | * converted to make use of bd_mutex and sequence counters. | 1284 | * converted to make use of bd_mutex and sequence counters. |
1285 | */ | 1285 | */ |
1286 | seqcount_init(&disk->part0.nr_sects_seq); | 1286 | seqcount_init(&disk->part0.nr_sects_seq); |
1287 | hd_ref_init(&disk->part0); | 1287 | if (hd_ref_init(&disk->part0)) { |
1288 | hd_free_part(&disk->part0); | ||
1289 | kfree(disk); | ||
1290 | return NULL; | ||
1291 | } | ||
1288 | 1292 | ||
1289 | disk->minors = minors; | 1293 | disk->minors = minors; |
1290 | rand_initialize_disk(disk); | 1294 | rand_initialize_disk(disk); |
diff --git a/block/partition-generic.c b/block/partition-generic.c index eca0d02a607c..e7711133284e 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c | |||
@@ -232,8 +232,9 @@ static void delete_partition_rcu_cb(struct rcu_head *head) | |||
232 | put_device(part_to_dev(part)); | 232 | put_device(part_to_dev(part)); |
233 | } | 233 | } |
234 | 234 | ||
235 | void __delete_partition(struct hd_struct *part) | 235 | void __delete_partition(struct percpu_ref *ref) |
236 | { | 236 | { |
237 | struct hd_struct *part = container_of(ref, struct hd_struct, ref); | ||
237 | call_rcu(&part->rcu_head, delete_partition_rcu_cb); | 238 | call_rcu(&part->rcu_head, delete_partition_rcu_cb); |
238 | } | 239 | } |
239 | 240 | ||
@@ -254,7 +255,7 @@ void delete_partition(struct gendisk *disk, int partno) | |||
254 | kobject_put(part->holder_dir); | 255 | kobject_put(part->holder_dir); |
255 | device_del(part_to_dev(part)); | 256 | device_del(part_to_dev(part)); |
256 | 257 | ||
257 | hd_struct_put(part); | 258 | hd_struct_kill(part); |
258 | } | 259 | } |
259 | 260 | ||
260 | static ssize_t whole_disk_show(struct device *dev, | 261 | static ssize_t whole_disk_show(struct device *dev, |
@@ -355,8 +356,8 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno, | |||
355 | if (!dev_get_uevent_suppress(ddev)) | 356 | if (!dev_get_uevent_suppress(ddev)) |
356 | kobject_uevent(&pdev->kobj, KOBJ_ADD); | 357 | kobject_uevent(&pdev->kobj, KOBJ_ADD); |
357 | 358 | ||
358 | hd_ref_init(p); | 359 | if (!hd_ref_init(p)) |
359 | return p; | 360 | return p; |
360 | 361 | ||
361 | out_free_info: | 362 | out_free_info: |
362 | free_part_info(p); | 363 | free_part_info(p); |