diff options
Diffstat (limited to 'fs/partitions/check.c')
-rw-r--r-- | fs/partitions/check.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 6dfbee03ccc6..30f46c2cb9d5 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
@@ -365,17 +365,25 @@ struct device_type part_type = { | |||
365 | static void delete_partition_rcu_cb(struct rcu_head *head) | 365 | static void delete_partition_rcu_cb(struct rcu_head *head) |
366 | { | 366 | { |
367 | struct hd_struct *part = container_of(head, struct hd_struct, rcu_head); | 367 | struct hd_struct *part = container_of(head, struct hd_struct, rcu_head); |
368 | struct gendisk *disk = part_to_disk(part); | ||
369 | struct request_queue *q = disk->queue; | ||
370 | unsigned long flags; | ||
368 | 371 | ||
369 | part->start_sect = 0; | 372 | part->start_sect = 0; |
370 | part->nr_sects = 0; | 373 | part->nr_sects = 0; |
371 | part_stat_set_all(part, 0); | 374 | part_stat_set_all(part, 0); |
372 | put_device(part_to_dev(part)); | 375 | put_device(part_to_dev(part)); |
376 | |||
377 | spin_lock_irqsave(q->queue_lock, flags); | ||
378 | elv_quiesce_end(q); | ||
379 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
373 | } | 380 | } |
374 | 381 | ||
375 | void delete_partition(struct gendisk *disk, int partno) | 382 | void delete_partition(struct gendisk *disk, int partno) |
376 | { | 383 | { |
377 | struct disk_part_tbl *ptbl = disk->part_tbl; | 384 | struct disk_part_tbl *ptbl = disk->part_tbl; |
378 | struct hd_struct *part; | 385 | struct hd_struct *part; |
386 | struct request_queue *q = disk->queue; | ||
379 | 387 | ||
380 | if (partno >= ptbl->len) | 388 | if (partno >= ptbl->len) |
381 | return; | 389 | return; |
@@ -390,6 +398,10 @@ void delete_partition(struct gendisk *disk, int partno) | |||
390 | kobject_put(part->holder_dir); | 398 | kobject_put(part->holder_dir); |
391 | device_del(part_to_dev(part)); | 399 | device_del(part_to_dev(part)); |
392 | 400 | ||
401 | spin_lock_irq(q->queue_lock); | ||
402 | elv_quiesce_start(q); | ||
403 | spin_unlock_irq(q->queue_lock); | ||
404 | |||
393 | call_rcu(&part->rcu_head, delete_partition_rcu_cb); | 405 | call_rcu(&part->rcu_head, delete_partition_rcu_cb); |
394 | } | 406 | } |
395 | 407 | ||