aboutsummaryrefslogtreecommitdiffstats
path: root/fs/partitions/check.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/partitions/check.c')
-rw-r--r--fs/partitions/check.c12
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 = {
365static void delete_partition_rcu_cb(struct rcu_head *head) 365static 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
375void delete_partition(struct gendisk *disk, int partno) 382void 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