diff options
| -rw-r--r-- | block/blk-core.c | 9 | ||||
| -rw-r--r-- | block/blk-mq.c | 2 | ||||
| -rw-r--r-- | block/blk.h | 2 | ||||
| -rw-r--r-- | drivers/block/loop.c | 10 |
4 files changed, 19 insertions, 4 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index b8881750a3ac..3ba4326a63b5 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -562,6 +562,13 @@ static void __blk_drain_queue(struct request_queue *q, bool drain_all) | |||
| 562 | } | 562 | } |
| 563 | } | 563 | } |
| 564 | 564 | ||
| 565 | void blk_drain_queue(struct request_queue *q) | ||
| 566 | { | ||
| 567 | spin_lock_irq(q->queue_lock); | ||
| 568 | __blk_drain_queue(q, true); | ||
| 569 | spin_unlock_irq(q->queue_lock); | ||
| 570 | } | ||
| 571 | |||
| 565 | /** | 572 | /** |
| 566 | * blk_queue_bypass_start - enter queue bypass mode | 573 | * blk_queue_bypass_start - enter queue bypass mode |
| 567 | * @q: queue of interest | 574 | * @q: queue of interest |
| @@ -689,8 +696,6 @@ void blk_cleanup_queue(struct request_queue *q) | |||
| 689 | */ | 696 | */ |
| 690 | blk_freeze_queue(q); | 697 | blk_freeze_queue(q); |
| 691 | spin_lock_irq(lock); | 698 | spin_lock_irq(lock); |
| 692 | if (!q->mq_ops) | ||
| 693 | __blk_drain_queue(q, true); | ||
| 694 | queue_flag_set(QUEUE_FLAG_DEAD, q); | 699 | queue_flag_set(QUEUE_FLAG_DEAD, q); |
| 695 | spin_unlock_irq(lock); | 700 | spin_unlock_irq(lock); |
| 696 | 701 | ||
diff --git a/block/blk-mq.c b/block/blk-mq.c index 11097477eeab..3d3797327491 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
| @@ -161,6 +161,8 @@ void blk_freeze_queue(struct request_queue *q) | |||
| 161 | * exported to drivers as the only user for unfreeze is blk_mq. | 161 | * exported to drivers as the only user for unfreeze is blk_mq. |
| 162 | */ | 162 | */ |
| 163 | blk_freeze_queue_start(q); | 163 | blk_freeze_queue_start(q); |
| 164 | if (!q->mq_ops) | ||
| 165 | blk_drain_queue(q); | ||
| 164 | blk_mq_freeze_queue_wait(q); | 166 | blk_mq_freeze_queue_wait(q); |
| 165 | } | 167 | } |
| 166 | 168 | ||
diff --git a/block/blk.h b/block/blk.h index 3f1446937aec..442098aa9463 100644 --- a/block/blk.h +++ b/block/blk.h | |||
| @@ -330,4 +330,6 @@ static inline void blk_queue_bounce(struct request_queue *q, struct bio **bio) | |||
| 330 | } | 330 | } |
| 331 | #endif /* CONFIG_BOUNCE */ | 331 | #endif /* CONFIG_BOUNCE */ |
| 332 | 332 | ||
| 333 | extern void blk_drain_queue(struct request_queue *q); | ||
| 334 | |||
| 333 | #endif /* BLK_INTERNAL_H */ | 335 | #endif /* BLK_INTERNAL_H */ |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index bc8e61506968..d5fe720cf149 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
| @@ -1581,9 +1581,8 @@ out: | |||
| 1581 | return err; | 1581 | return err; |
| 1582 | } | 1582 | } |
| 1583 | 1583 | ||
| 1584 | static void lo_release(struct gendisk *disk, fmode_t mode) | 1584 | static void __lo_release(struct loop_device *lo) |
| 1585 | { | 1585 | { |
| 1586 | struct loop_device *lo = disk->private_data; | ||
| 1587 | int err; | 1586 | int err; |
| 1588 | 1587 | ||
| 1589 | if (atomic_dec_return(&lo->lo_refcnt)) | 1588 | if (atomic_dec_return(&lo->lo_refcnt)) |
| @@ -1610,6 +1609,13 @@ static void lo_release(struct gendisk *disk, fmode_t mode) | |||
| 1610 | mutex_unlock(&lo->lo_ctl_mutex); | 1609 | mutex_unlock(&lo->lo_ctl_mutex); |
| 1611 | } | 1610 | } |
| 1612 | 1611 | ||
| 1612 | static void lo_release(struct gendisk *disk, fmode_t mode) | ||
| 1613 | { | ||
| 1614 | mutex_lock(&loop_index_mutex); | ||
| 1615 | __lo_release(disk->private_data); | ||
| 1616 | mutex_unlock(&loop_index_mutex); | ||
| 1617 | } | ||
| 1618 | |||
| 1613 | static const struct block_device_operations lo_fops = { | 1619 | static const struct block_device_operations lo_fops = { |
| 1614 | .owner = THIS_MODULE, | 1620 | .owner = THIS_MODULE, |
| 1615 | .open = lo_open, | 1621 | .open = lo_open, |
