diff options
Diffstat (limited to 'block/blk-core.c')
-rw-r--r-- | block/blk-core.c | 105 |
1 files changed, 77 insertions, 28 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 6226a380fb6d..93691d2ac5a0 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -902,6 +902,8 @@ EXPORT_SYMBOL(blk_get_request); | |||
902 | */ | 902 | */ |
903 | void blk_requeue_request(struct request_queue *q, struct request *rq) | 903 | void blk_requeue_request(struct request_queue *q, struct request *rq) |
904 | { | 904 | { |
905 | BUG_ON(blk_queued_rq(rq)); | ||
906 | |||
905 | blk_delete_timer(rq); | 907 | blk_delete_timer(rq); |
906 | blk_clear_rq_complete(rq); | 908 | blk_clear_rq_complete(rq); |
907 | trace_block_rq_requeue(q, rq); | 909 | trace_block_rq_requeue(q, rq); |
@@ -1610,28 +1612,6 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq) | |||
1610 | } | 1612 | } |
1611 | EXPORT_SYMBOL_GPL(blk_insert_cloned_request); | 1613 | EXPORT_SYMBOL_GPL(blk_insert_cloned_request); |
1612 | 1614 | ||
1613 | /** | ||
1614 | * blkdev_dequeue_request - dequeue request and start timeout timer | ||
1615 | * @req: request to dequeue | ||
1616 | * | ||
1617 | * Dequeue @req and start timeout timer on it. This hands off the | ||
1618 | * request to the driver. | ||
1619 | * | ||
1620 | * Block internal functions which don't want to start timer should | ||
1621 | * call elv_dequeue_request(). | ||
1622 | */ | ||
1623 | void blkdev_dequeue_request(struct request *req) | ||
1624 | { | ||
1625 | elv_dequeue_request(req->q, req); | ||
1626 | |||
1627 | /* | ||
1628 | * We are now handing the request to the hardware, add the | ||
1629 | * timeout handler. | ||
1630 | */ | ||
1631 | blk_add_timer(req); | ||
1632 | } | ||
1633 | EXPORT_SYMBOL(blkdev_dequeue_request); | ||
1634 | |||
1635 | static void blk_account_io_completion(struct request *req, unsigned int bytes) | 1615 | static void blk_account_io_completion(struct request *req, unsigned int bytes) |
1636 | { | 1616 | { |
1637 | if (blk_do_io_stat(req)) { | 1617 | if (blk_do_io_stat(req)) { |
@@ -1671,7 +1651,23 @@ static void blk_account_io_done(struct request *req) | |||
1671 | } | 1651 | } |
1672 | } | 1652 | } |
1673 | 1653 | ||
1674 | struct request *elv_next_request(struct request_queue *q) | 1654 | /** |
1655 | * blk_peek_request - peek at the top of a request queue | ||
1656 | * @q: request queue to peek at | ||
1657 | * | ||
1658 | * Description: | ||
1659 | * Return the request at the top of @q. The returned request | ||
1660 | * should be started using blk_start_request() before LLD starts | ||
1661 | * processing it. | ||
1662 | * | ||
1663 | * Return: | ||
1664 | * Pointer to the request at the top of @q if available. Null | ||
1665 | * otherwise. | ||
1666 | * | ||
1667 | * Context: | ||
1668 | * queue_lock must be held. | ||
1669 | */ | ||
1670 | struct request *blk_peek_request(struct request_queue *q) | ||
1675 | { | 1671 | { |
1676 | struct request *rq; | 1672 | struct request *rq; |
1677 | int ret; | 1673 | int ret; |
@@ -1748,10 +1744,12 @@ struct request *elv_next_request(struct request_queue *q) | |||
1748 | 1744 | ||
1749 | return rq; | 1745 | return rq; |
1750 | } | 1746 | } |
1751 | EXPORT_SYMBOL(elv_next_request); | 1747 | EXPORT_SYMBOL(blk_peek_request); |
1752 | 1748 | ||
1753 | void elv_dequeue_request(struct request_queue *q, struct request *rq) | 1749 | void blk_dequeue_request(struct request *rq) |
1754 | { | 1750 | { |
1751 | struct request_queue *q = rq->q; | ||
1752 | |||
1755 | BUG_ON(list_empty(&rq->queuelist)); | 1753 | BUG_ON(list_empty(&rq->queuelist)); |
1756 | BUG_ON(ELV_ON_HASH(rq)); | 1754 | BUG_ON(ELV_ON_HASH(rq)); |
1757 | 1755 | ||
@@ -1767,6 +1765,58 @@ void elv_dequeue_request(struct request_queue *q, struct request *rq) | |||
1767 | } | 1765 | } |
1768 | 1766 | ||
1769 | /** | 1767 | /** |
1768 | * blk_start_request - start request processing on the driver | ||
1769 | * @req: request to dequeue | ||
1770 | * | ||
1771 | * Description: | ||
1772 | * Dequeue @req and start timeout timer on it. This hands off the | ||
1773 | * request to the driver. | ||
1774 | * | ||
1775 | * Block internal functions which don't want to start timer should | ||
1776 | * call blk_dequeue_request(). | ||
1777 | * | ||
1778 | * Context: | ||
1779 | * queue_lock must be held. | ||
1780 | */ | ||
1781 | void blk_start_request(struct request *req) | ||
1782 | { | ||
1783 | blk_dequeue_request(req); | ||
1784 | |||
1785 | /* | ||
1786 | * We are now handing the request to the hardware, add the | ||
1787 | * timeout handler. | ||
1788 | */ | ||
1789 | blk_add_timer(req); | ||
1790 | } | ||
1791 | EXPORT_SYMBOL(blk_start_request); | ||
1792 | |||
1793 | /** | ||
1794 | * blk_fetch_request - fetch a request from a request queue | ||
1795 | * @q: request queue to fetch a request from | ||
1796 | * | ||
1797 | * Description: | ||
1798 | * Return the request at the top of @q. The request is started on | ||
1799 | * return and LLD can start processing it immediately. | ||
1800 | * | ||
1801 | * Return: | ||
1802 | * Pointer to the request at the top of @q if available. Null | ||
1803 | * otherwise. | ||
1804 | * | ||
1805 | * Context: | ||
1806 | * queue_lock must be held. | ||
1807 | */ | ||
1808 | struct request *blk_fetch_request(struct request_queue *q) | ||
1809 | { | ||
1810 | struct request *rq; | ||
1811 | |||
1812 | rq = blk_peek_request(q); | ||
1813 | if (rq) | ||
1814 | blk_start_request(rq); | ||
1815 | return rq; | ||
1816 | } | ||
1817 | EXPORT_SYMBOL(blk_fetch_request); | ||
1818 | |||
1819 | /** | ||
1770 | * blk_update_request - Special helper function for request stacking drivers | 1820 | * blk_update_request - Special helper function for request stacking drivers |
1771 | * @rq: the request being processed | 1821 | * @rq: the request being processed |
1772 | * @error: %0 for success, < %0 for error | 1822 | * @error: %0 for success, < %0 for error |
@@ -1937,12 +1987,11 @@ static bool blk_update_bidi_request(struct request *rq, int error, | |||
1937 | */ | 1987 | */ |
1938 | static void blk_finish_request(struct request *req, int error) | 1988 | static void blk_finish_request(struct request *req, int error) |
1939 | { | 1989 | { |
1990 | BUG_ON(blk_queued_rq(req)); | ||
1991 | |||
1940 | if (blk_rq_tagged(req)) | 1992 | if (blk_rq_tagged(req)) |
1941 | blk_queue_end_tag(req->q, req); | 1993 | blk_queue_end_tag(req->q, req); |
1942 | 1994 | ||
1943 | if (blk_queued_rq(req)) | ||
1944 | elv_dequeue_request(req->q, req); | ||
1945 | |||
1946 | if (unlikely(laptop_mode) && blk_fs_request(req)) | 1995 | if (unlikely(laptop_mode) && blk_fs_request(req)) |
1947 | laptop_io_completion(); | 1996 | laptop_io_completion(); |
1948 | 1997 | ||